Merge pull request #6101 from dotCooCoo/feat/app-title-bar-on-desktop-frames-r

Title bar: a Linux and BSD preference uses the app bar where the desktop draws the frame
This commit is contained in:
BFlat
2026-11-09 01:57:35 +08:00
committed by GitHub
39 changed files with 347 additions and 18 deletions
+4 -1
View File
@@ -92,7 +92,9 @@ use titlebar::custom_titlebar_from;
use titlebar::opted_into_system_title_bar;
#[cfg(windows)]
use titlebar::set_taskbar_icon;
use titlebar::{custom_titlebar, native_options};
#[cfg(all(test, feature = "wgpu"))]
use titlebar::{app_draws_frame, opted_into_app_title_bar, start_frame};
use titlebar::{custom_titlebar, native_options, titlebar_from_env};
struct App {
app: VectorcraftApp,
@@ -466,6 +468,7 @@ fn main() -> std::process::ExitCode {
let (loss, ctx) = (graphics_loss.clone(), cc.egui_ctx.clone());
rs.device.set_device_lost_callback(move |reason, msg| loss.report(&ctx, format!("{reason:?}: {msg}")));
}
app.titlebar_from_env = titlebar_from_env();
app.custom_titlebar = custom_titlebar;
app.desktop_frame = !custom_titlebar;
if let Some(port) = control_port {
+54
View File
@@ -164,6 +164,60 @@ fn the_system_title_bar_preference_keeps_the_window_decorations() {
assert_eq!(super::native_options(true).viewport.decorations, Some(false));
}
/// Preferences › User Interface › VectorCraft Title Bar on Every Desktop gives the app frame where
/// the probe chose the desktop's (KDE, X11, a window opened through XWayland); without it the probe
/// decides, and `VECTORCRAFT_TITLEBAR` takes precedence over both.
#[test]
fn the_app_title_bar_preference_gives_the_app_frame_on_desktop_frames() {
assert!(!super::opted_into_app_title_bar(None), "no preferences: the default");
let off = ui_state_with_prefs(serde_json::json!({"appTitleBar": false}));
assert!(!super::opted_into_app_title_bar(Some(&off)));
let on = ui_state_with_prefs(serde_json::json!({"appTitleBar": true}));
assert!(super::opted_into_app_title_bar(Some(&on)));
// (probed_app, overridden, forced_to_x11): without the preference, then with it.
let cases = [
((false, None, false), false, true), // KDE, Sway, X11: the desktop frame
((true, None, false), true, true), // GNOME on Wayland: the app frame either way
((true, None, true), false, true), // GNOME, the window opened through XWayland
((false, Some(true), false), true, true), // VECTORCRAFT_TITLEBAR=app
((false, Some(true), true), true, true), // VECTORCRAFT_TITLEBAR=app, the window opened through XWayland
((true, Some(false), false), false, false), // VECTORCRAFT_TITLEBAR=desktop takes precedence over the preference
((false, Some(false), true), false, false),
];
for ((probed_app, overridden, forced_to_x11), without, with) in cases {
assert_eq!(super::app_draws_frame(probed_app, overridden, forced_to_x11, false), without, "{probed_app} {overridden:?} {forced_to_x11}");
assert_eq!(super::app_draws_frame(probed_app, overridden, forced_to_x11, true), with, "{probed_app} {overridden:?} {forced_to_x11}");
}
}
/// The frame a start uses: the preference turns the desktop frame the probe chose into the app frame
/// with the default window buttons, a probed app frame keeps its own buttons, and the desktop frame
/// stays where the app frame is not drawn. System Title Bar takes precedence over the preference.
#[test]
fn the_start_frame_applies_the_app_title_bar_preference() {
use craft_window::{Button, Frame, Layout};
let gnome = Layout { left: vec![Button::Close], right: vec![] };
let cases = [
// (probed, overridden, forced_to_x11, opted_into_app), expected
((Frame::Desktop, None, false, false), Frame::Desktop),
((Frame::Desktop, None, false, true), Frame::App(Layout::default())),
((Frame::Desktop, None, true, true), Frame::App(Layout::default())),
((Frame::App(gnome.clone()), None, false, false), Frame::App(gnome.clone())),
((Frame::App(gnome.clone()), None, true, false), Frame::Desktop),
((Frame::App(gnome.clone()), None, true, true), Frame::App(gnome.clone())),
((Frame::Desktop, Some(false), false, true), Frame::Desktop),
((Frame::App(gnome.clone()), Some(true), true, false), Frame::App(gnome.clone())),
];
for ((probed, overridden, forced_to_x11, opted_into_app), expected) in cases {
let label = format!("{probed:?} {overridden:?} {forced_to_x11} {opted_into_app}");
assert_eq!(super::start_frame(probed, overridden, forced_to_x11, opted_into_app), expected, "{label}");
}
// With both preferences on, System Title Bar takes precedence: the desktop draws the frame.
let both = super::start_frame(Frame::Desktop, None, false, true);
assert!(!super::custom_titlebar_from(&both, true), "System Title Bar takes precedence over the app title bar preference");
}
/// The file extensions the macOS bundle declares: its document types and its own exported type.
fn plist_extensions(plist: &str) -> Vec<&str> {
["<key>CFBundleTypeExtensions</key>", "<key>public.filename-extension</key>"]
+64 -14
View File
@@ -46,6 +46,53 @@ pub(crate) fn opted_into_system_title_bar(saved: Option<&vectorcraft_ui_egui::Ui
saved.map(|ui| ui.engine_prefs.get("systemTitleBar").and_then(serde_json::Value::as_bool).unwrap_or(false)).unwrap_or(false)
}
/// Whether the user asked for VectorCraft's own title bar in Preferences › User Interface ›
/// VectorCraft Title Bar on Every Desktop (Linux and the BSDs). Read like
/// [`opted_into_system_title_bar`]; a missing or unreadable value is `false` (the default).
pub(crate) fn opted_into_app_title_bar(saved: Option<&vectorcraft_ui_egui::UiState>) -> bool {
saved.map(|ui| ui.engine_prefs.get("appTitleBar").and_then(serde_json::Value::as_bool).unwrap_or(false)).unwrap_or(false)
}
/// Whether the app draws the frame on this start, before the System Title Bar preference is
/// applied ([`custom_titlebar_from`]). `probed_app` is the `craft-window` probe's answer and
/// `overridden` its `VECTORCRAFT_TITLEBAR` override. In order: the override decides when it is
/// set; VectorCraft Title Bar on Every Desktop (`opted_into_app`) gives the app frame; a window
/// that opens through XWayland (`forced_to_x11`) gets the desktop frame; otherwise the probe
/// decides.
pub(crate) fn app_draws_frame(probed_app: bool, overridden: Option<bool>, forced_to_x11: bool, opted_into_app: bool) -> bool {
match overridden {
Some(app) => app,
None => opted_into_app || (probed_app && !forced_to_x11),
}
}
/// The frame this start uses, before the System Title Bar preference is applied
/// ([`custom_titlebar_from`]): [`app_draws_frame`] applied to the frame the probe chose. A probed
/// app frame keeps its window-button layout; an app frame the probe did not choose gets the default
/// layout, since `custom_titlebar_from` reads only which frame it is.
pub(crate) fn start_frame(probed: craft_window::Frame, overridden: Option<bool>, forced_to_x11: bool, opted_into_app: bool) -> craft_window::Frame {
let probed_app = matches!(probed, craft_window::Frame::App(_));
match (app_draws_frame(probed_app, overridden, forced_to_x11, opted_into_app), probed) {
(true, frame @ craft_window::Frame::App(_)) => frame,
(true, craft_window::Frame::Desktop) => craft_window::Frame::App(craft_window::Layout::default()),
(false, _) => craft_window::Frame::Desktop,
}
}
/// The `craft-window` probe's answer for this process (its override variable is
/// `VECTORCRAFT_TITLEBAR`). The probe runs once; on a Wayland session it opens a connection.
fn probed_choice() -> &'static craft_window::Choice {
static CHOICE: std::sync::OnceLock<craft_window::Choice> = std::sync::OnceLock::new();
CHOICE.get_or_init(|| craft_window::Choice::probe(craft_window::Prefix::new("VECTORCRAFT")))
}
/// Whether `VECTORCRAFT_TITLEBAR` chose this window's frame (Linux and the BSDs), so Preferences ›
/// User Interface › VectorCraft Title Bar on Every Desktop does not apply while it is set. Always
/// `false` on macOS and Windows.
pub(crate) fn titlebar_from_env() -> bool {
cfg!(not(any(target_os = "macos", target_os = "windows"))) && probed_choice().overridden().is_some()
}
/// Whether this start draws its own title bar, given the frame the shared `craft-window` crate
/// decided and the user's System Title Bar preference.
///
@@ -82,24 +129,27 @@ pub(crate) fn custom_titlebar_from(_frame: &craft_window::Frame, opted_into_syst
/// On Linux, Preferences › Performance › Linux Display Server › X11 opens the window through
/// XWayland (below). A GNOME/Wayland probe would say `Frame::App` there, but the window really runs
/// on X11, whose window manager draws the frame — so when XWayland is being forced, keep the native
/// frame, the same as a real X11 session. An explicit `VECTORCRAFT_TITLEBAR` override still wins.
/// frame, the same as a real X11 session. An explicit `VECTORCRAFT_TITLEBAR` override still wins,
/// and so does VectorCraft Title Bar on Every Desktop ([`app_draws_frame`]).
pub(crate) fn custom_titlebar(saved: Option<&vectorcraft_ui_egui::UiState>) -> bool {
let choice = craft_window::Choice::probe(craft_window::Prefix::new("VECTORCRAFT"));
let choice = probed_choice();
let opted_into_system = opted_into_system_title_bar(saved);
// macOS and Windows never read VectorCraft Title Bar on Every Desktop (`custom_titlebar_from`
// ignores the frame there).
let opted_into_app = cfg!(not(any(target_os = "macos", target_os = "windows"))) && opted_into_app_title_bar(saved);
#[cfg(target_os = "linux")]
{
// When the window will actually open on X11 (XWayland) — the user asked for it *and* the X11
// libraries are present, the same two conditions the launch path checks below — that run is
// effectively X11, so keep the native frame. If the libraries are missing, startup stays on
// Wayland, so the probe's own decision (app-drawn on GNOME) must stand.
let forced_to_x11 = {
let pref = saved.and_then(|ui| ui.engine_prefs.get("linuxDisplayServer")).and_then(serde_json::Value::as_str);
// `overridden() == None` means the probe decided (no VECTORCRAFT_TITLEBAR). When the window
// will actually open on X11 (XWayland) — the user asked for it *and* the X11 libraries are
// present, the same two conditions the launch path checks below — that run is effectively
// X11, so keep the native frame. If the libraries are missing, startup stays on Wayland, so
// the probe's own decision (app-drawn on GNOME) must stand.
let forced_to_x11 = xwayland::wanted(pref, |name| std::env::var_os(name), xwayland::pen_attached) && xwayland::x11_libraries_found();
if choice.overridden().is_none() && forced_to_x11 {
return custom_titlebar_from(&craft_window::Frame::Desktop, opted_into_system);
}
}
custom_titlebar_from(choice.frame(), opted_into_system)
xwayland::wanted(pref, |name| std::env::var_os(name), xwayland::pen_attached) && xwayland::x11_libraries_found()
};
#[cfg(not(target_os = "linux"))]
let forced_to_x11 = false;
let frame = start_frame(choice.frame().clone(), choice.overridden(), forced_to_x11, opted_into_app);
custom_titlebar_from(&frame, opted_into_system)
}
pub(crate) fn native_options(custom_titlebar: bool) -> eframe::NativeOptions {
+1
View File
@@ -349,6 +349,7 @@ pub const PREF_SPECS: &[PrefSpec] = &[
p!("openDocumentsAsTabs", "User Interface", "", "Open Documents As Tabs", bool),
p!("largeTabs", "User Interface", "", "Large Tabs", bool),
p!("systemTitleBar", "User Interface", "", "System Title Bar", bool),
p!("appTitleBar", "User Interface", "", "VectorCraft Title Bar on Every Desktop", bool),
p!("uiScaling", "User Interface", "UI Scaling", "Scale", num(0.75, 2.0, "×")),
p!("scaleCursorWithUi", "User Interface", "UI Scaling", "Scale Cursor Proportional to UI", bool),
// `auto` or a language code the shell registers (`zh-hant`); the shell shows it as a dropdown.
+5
View File
@@ -174,6 +174,10 @@ pub struct Prefs {
/// acting as the title bar (tiling window managers, desktops that draw their own decorations).
/// Read when the app starts. macOS always uses the system's.
pub system_title_bar: bool,
/// Linux and the BSDs: draw the app bar as the title bar in sessions where the desktop draws
/// the frame (X11, Wayland compositors with server-side decorations, XWayland), as on GNOME.
/// Read when the app starts; System Title Bar and `VECTORCRAFT_TITLEBAR` take precedence over it.
pub app_title_bar: bool,
// Performance
pub gpu_performance: bool,
pub animated_zoom: bool,
@@ -457,6 +461,7 @@ impl Default for Prefs {
scale_cursor_with_ui: false,
interface_language: s("auto"),
system_title_bar: false,
app_title_bar: false,
gpu_performance: true,
animated_zoom: true,
gpu_preference: s("automatic"),
+1
View File
@@ -122,6 +122,7 @@ impl VectorcraftApp {
frame_rate: Default::default(),
canvas_rect: None,
hover_doc: None,
titlebar_from_env: false,
custom_titlebar: false,
desktop_frame: false,
last_window_title: String::new(),
+3
View File
@@ -4727,6 +4727,9 @@ axis Both И двете
effect Soft Меко
Edge Роб
System Title Bar Заглавна лента на системата
VectorCraft Title Bar on Every Desktop Заглавна лента на VectorCraft на всеки работен плот
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Докато е зададена, променливата на средата VECTORCRAFT_TITLEBAR избира заглавната лента.
System Title Bar takes precedence over this option while it is on. Докато е включена, „Заглавна лента на системата“ има предимство пред тази опция.
Value Axis Ос на стойностите
On Left Side От лявата страна
On Right Side От дясната страна
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -880,6 +880,9 @@
Stained Glass… Vitraž…
Texturizer… Teksturizator…
System Title Bar Sistemska naslovna traka
VectorCraft Title Bar on Every Desktop Naslovna traka VectorCrafta na svakoj radnoj površini
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Dok je varijabla okruženja VECTORCRAFT_TITLEBAR postavljena, ona bira naslovnu traku.
System Title Bar takes precedence over this option while it is on. Dok je uključena, Sistemska naslovna traka ima prednost pred ovom opcijom.
Exit Izlaz
Distort Izobliči
Diffuse Glow… Difuzni sjaj…
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -4282,6 +4282,9 @@ digits Malayalam Malaiàlam
Syntax newer than ES3 Sintaxi més nova que ES3
System Layout Disposició del sistema
System Title Bar Barra de títol del sistema
VectorCraft Title Bar on Every Desktop Barra de títol de VectorCraft a tots els escriptoris
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Mentre està definida, la variable d’entorn VECTORCRAFT_TITLEBAR determina la barra de títol.
System Title Bar takes precedence over this option while it is on. Mentre està activada, Barra de títol del sistema té prioritat sobre aquesta opció.
Tab Tabulació
Tab Stops Aturades de tabulació
Table Taula
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -894,6 +894,9 @@
Stained Glass… Vitráž…
Texturizer… Texturovač…
System Title Bar Systémové záhlaví okna
VectorCraft Title Bar on Every Desktop Záhlaví okna VectorCraftu v každém desktopovém prostředí
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Dokud je proměnná prostředí VECTORCRAFT_TITLEBAR nastavena, záhlaví okna volí ona.
System Title Bar takes precedence over this option while it is on. Dokud je Systémové záhlaví okna zapnuté, má přednost před touto volbou.
Exit Ukončit
Distort Zkreslení
Diffuse Glow… Rozptýlená záře…
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -821,6 +821,9 @@
Stained Glass… Blyindfattede ruder…
Texturizer… Teksturér…
System Title Bar Systemtitellinje
VectorCraft Title Bar on Every Desktop VectorCrafts titellinje på alle skriveborde
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Miljøvariablen VECTORCRAFT_TITLEBAR vælger titellinjen, så længe den er angivet.
System Title Bar takes precedence over this option while it is on. Systemtitellinje har forrang for denne indstilling, så længe den er slået til.
Exit Afslut
Distort Forvræng
Diffuse Glow… Diffus glød…
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -4771,6 +4771,9 @@ theme Appearance Erscheinungsbild
@plural {n} linked image changed on disk. Show the new version?|{n} linked images changed on disk. Show the new versions? {n} verknüpftes Bild wurde auf dem Datenträger geändert. Neue Version anzeigen?|{n} verknüpfte Bilder wurden auf dem Datenträger geändert. Neue Versionen anzeigen?
# Window: the system's title bar (Windows, Linux).
System Title Bar Systemtitelleiste
VectorCraft Title Bar on Every Desktop VectorCraft-Titelleiste auf jedem Desktop
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Solange die Umgebungsvariable VECTORCRAFT_TITLEBAR gesetzt ist, bestimmt sie die Titelleiste.
System Title Bar takes precedence over this option while it is on. Solange Systemtitelleiste eingeschaltet ist, hat sie Vorrang vor dieser Option.
# Brush Options: Scatter, Art and Pattern brushes.
Scatter Brush Options Optionen für Spezialpinsel
Art Brush Options Optionen für Bildpinsel
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -4786,6 +4786,9 @@ digits Malayalam Μαλαγιάλαμ
RGB: RGB:
CMYK: CMYK:
System Title Bar Γραμμή τίτλου συστήματος
VectorCraft Title Bar on Every Desktop Γραμμή τίτλου του VectorCraft σε κάθε επιφάνεια εργασίας
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Όσο είναι ορισμένη, η μεταβλητή περιβάλλοντος VECTORCRAFT_TITLEBAR επιλέγει τη γραμμή τίτλου.
System Title Bar takes precedence over this option while it is on. Όσο είναι ενεργή, η Γραμμή τίτλου συστήματος υπερισχύει αυτής της επιλογής.
Value Axis Άξονας τιμών
On Left Side Στην αριστερή πλευρά
On Right Side Στη δεξιά πλευρά
Can't render this file because it contains an unexpected character in line 168 and column 5.
+3
View File
@@ -4875,6 +4875,9 @@ axis Both Ambos
Bottom Right Abajo a la derecha
Edge Borde
System Title Bar Barra de título del sistema
VectorCraft Title Bar on Every Desktop Barra de título de VectorCraft en todos los escritorios
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Mientras está definida, la variable de entorno VECTORCRAFT_TITLEBAR elige la barra de título.
System Title Bar takes precedence over this option while it is on. Mientras está activada, Barra de título del sistema tiene prioridad sobre esta opción.
Value Axis Eje de valores
On Left Side En el lado izquierdo
On Right Side En el lado derecho
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -878,6 +878,9 @@
Stained Glass… Lasimaalaus…
Texturizer… Teksturoija…
System Title Bar Järjestelmän otsikkorivi
VectorCraft Title Bar on Every Desktop VectorCraftin otsikkorivi kaikissa työpöytäympäristöissä
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Ympäristömuuttuja VECTORCRAFT_TITLEBAR valitsee otsikkorivin niin kauan kuin se on asetettu.
System Title Bar takes precedence over this option while it is on. Järjestelmän otsikkorivi ohittaa tämän asetuksen niin kauan kuin se on käytössä.
Exit Lopeta
Distort Vääristä
Diffuse Glow… Hajautettu hehku…
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -4884,6 +4884,9 @@ axis Both Les deux
effect Soft Doux
Edge Bord
System Title Bar Barre de titre du système
VectorCraft Title Bar on Every Desktop Barre de titre de VectorCraft sur tous les bureaux
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Tant qu’elle est définie, la variable d’environnement VECTORCRAFT_TITLEBAR choisit la barre de titre.
System Title Bar takes precedence over this option while it is on. Tant qu’elle est activée, Barre de titre du système a priorité sur cette option.
Value Axis Axe des valeurs
On Left Side À gauche
On Right Side À droite
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -4658,6 +4658,9 @@
System सिस्टम
System Layout सिस्टम लेआउट
System Title Bar सिस्टम टाइटल बार
VectorCraft Title Bar on Every Desktop हर डेस्कटॉप पर VectorCraft टाइटल बार
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. जब तक एनवायरनमेंट वेरिएबल VECTORCRAFT_TITLEBAR सेट है, टाइटल बार वही चुनता है।
System Title Bar takes precedence over this option while it is on. जब तक सिस्टम टाइटल बार चालू है, उसे इस विकल्प पर प्राथमिकता मिलती है।
Tab Tab
Tab Stops टैब स्टॉप्स
Table तालिका
Can't render this file because it is too large.
+3
View File
@@ -4081,6 +4081,9 @@ mark-style Japanese Japán
Symbols Szimbólumok
System Layout Rendszerszintű elrendezés
System Title Bar Rendszer címsora
VectorCraft Title Bar on Every Desktop A VectorCraft címsora minden asztali környezetben
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Amíg a VECTORCRAFT_TITLEBAR környezeti változó be van állítva, az választja ki a címsort.
System Title Bar takes precedence over this option while it is on. Amíg a Rendszer címsora be van kapcsolva, elsőbbséget élvez ezzel a beállítással szemben.
Tab Tabulátor
Tab Stops Tabulátorpontok
Table Táblázat
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -821,6 +821,9 @@
Stained Glass… Kaca patri…
Texturizer… Texturizer…
System Title Bar Bilah judul sistem
VectorCraft Title Bar on Every Desktop Bilah judul VectorCraft di setiap desktop
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Selama ditetapkan, variabel lingkungan VECTORCRAFT_TITLEBAR memilih bilah judul.
System Title Bar takes precedence over this option while it is on. Selama aktif, Bilah judul sistem lebih diutamakan daripada opsi ini.
Exit Keluar
Distort Distorsi
Diffuse Glow… Pendar difusi…
1 # Indonesian (id) catalog. Same format as zh-hant.tsv: context <TAB> source <TAB> translation
821
822
823
824
825
826
827
828
829
+3
View File
@@ -4919,6 +4919,9 @@ effect Soft Morbido
effect Regular Normale
Edge Bordo
System Title Bar Barra del titolo di sistema
VectorCraft Title Bar on Every Desktop Barra del titolo di VectorCraft su ogni desktop
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Finché è impostata, la variabile d'ambiente VECTORCRAFT_TITLEBAR sceglie la barra del titolo.
System Title Bar takes precedence over this option while it is on. Finché è attiva, Barra del titolo di sistema ha la precedenza su questa opzione.
Value Axis Asse dei valori
On Left Side Sul lato sinistro
On Right Side Sul lato destro
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -4961,6 +4961,9 @@ effect Horizontal 水平
effect Vertical 垂直
Edge エッジ
System Title Bar システムのタイトルバー
VectorCraft Title Bar on Every Desktop すべてのデスクトップで VectorCraft のタイトルバー
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. 環境変数 VECTORCRAFT_TITLEBAR が設定されている間は、この変数でタイトルバーが決まります。
System Title Bar takes precedence over this option while it is on. システムのタイトルバーがオンの間は、そちらがこのオプションより優先されます。
Value Axis 数値軸
On Left Side 左側
On Right Side 右側
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -774,6 +774,9 @@
Stained Glass… ვიტრაჟი…
Texturizer… ტექსტურირება…
System Title Bar სისტემის სათაურის ზოლი
VectorCraft Title Bar on Every Desktop VectorCraft-ის სათაურის ზოლი ყველა სამუშაო მაგიდაზე
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. სანამ გარემოს ცვლადი VECTORCRAFT_TITLEBAR დაყენებულია, სათაურის ზოლს ის ირჩევს.
System Title Bar takes precedence over this option while it is on. სანამ სისტემის სათაურის ზოლი ჩართულია, მას ამ პარამეტრზე უპირატესობა აქვს.
Exit გასვლა
Distort დეფორმაცია
Diffuse Glow… გაბნეული ნათება…
Can't render this file because it is too large.
+3
View File
@@ -4888,6 +4888,9 @@ effect Horizontal 가로
effect Vertical 세로
Edge 가장자리
System Title Bar 시스템 제목 표시줄
VectorCraft Title Bar on Every Desktop 모든 데스크톱에서 VectorCraft 제목 표시줄
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. 환경 변수 VECTORCRAFT_TITLEBAR가 설정되어 있는 동안에는 이 변수가 제목 표시줄을 정합니다.
System Title Bar takes precedence over this option while it is on. 시스템 제목 표시줄이 켜져 있는 동안에는 그 설정이 이 옵션보다 우선합니다.
Value Axis 값 축
On Left Side 왼쪽
On Right Side 오른쪽
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -835,6 +835,9 @@
Stained Glass… Glas in lood…
Texturizer… Texturizer…
System Title Bar Systeemtitelbalk
VectorCraft Title Bar on Every Desktop VectorCraft-titelbalk op elk bureaublad
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Zolang de omgevingsvariabele VECTORCRAFT_TITLEBAR is ingesteld, kiest die de titelbalk.
System Title Bar takes precedence over this option while it is on. Zolang Systeemtitelbalk is ingeschakeld, heeft die voorrang op deze optie.
Exit Afsluiten
Distort Vervormen
Diffuse Glow… Diffuse gloed…
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -836,6 +836,9 @@
Stained Glass… Witraż…
Texturizer… Teksturowanie…
System Title Bar Systemowy pasek tytułu
VectorCraft Title Bar on Every Desktop Pasek tytułu VectorCraft na każdym pulpicie
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Dopóki zmienna środowiskowa VECTORCRAFT_TITLEBAR jest ustawiona, to ona wybiera pasek tytułu.
System Title Bar takes precedence over this option while it is on. Dopóki Systemowy pasek tytułu jest włączony, ma pierwszeństwo przed tą opcją.
Exit Zakończ
Distort Zniekształcenie
Diffuse Glow… Rozproszony blask…
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -3272,6 +3272,9 @@ imageTrace Outline Contorno
Stained Glass… Vitral…
Texturizer… Texturizador…
System Title Bar Barra de título do sistema
VectorCraft Title Bar on Every Desktop Barra de título do VectorCraft em todas as áreas de trabalho
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Enquanto estiver definida, a variável de ambiente VECTORCRAFT_TITLEBAR escolhe a barra de título.
System Title Bar takes precedence over this option while it is on. Enquanto estiver ativada, Barra de título do sistema tem prioridade sobre esta opção.
Exit Sair
Distort Distorcer
Diffuse Glow… Brilho difuso…
Can't render this file because it contains an unexpected character in line 6 and column 47.
+3
View File
@@ -4914,6 +4914,9 @@ axis Both Оба
Bottom Right Снизу справа
Edge Край
System Title Bar Системная строка заголовка
VectorCraft Title Bar on Every Desktop Строка заголовка VectorCraft на любом рабочем столе
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Пока переменная среды VECTORCRAFT_TITLEBAR задана, строку заголовка выбирает она.
System Title Bar takes precedence over this option while it is on. Пока включена «Системная строка заголовка», она имеет приоритет над этим параметром.
Value Axis Ось значений
On Left Side Слева
On Right Side Справа
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -4793,6 +4793,9 @@ axis Both Båda
effect Soft Mjuk
Edge Kant
System Title Bar Systemets namnlist
VectorCraft Title Bar on Every Desktop VectorCrafts namnlist på alla skrivbord
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Miljövariabeln VECTORCRAFT_TITLEBAR väljer namnlisten så länge den är angiven.
System Title Bar takes precedence over this option while it is on. Systemets namnlist har företräde framför det här alternativet så länge den är på.
Value Axis Värdeaxel
On Left Side På vänster sida
On Right Side På höger sida
Can't render this file because it contains an unexpected character in line 5 and column 25.
+3
View File
@@ -4626,6 +4626,9 @@ axis Both Her İkisi
effect Soft Yumuşak
Edge Kenar
System Title Bar Sistem Başlık Çubuğu
VectorCraft Title Bar on Every Desktop Her Masaüstünde VectorCraft Başlık Çubuğu
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. VECTORCRAFT_TITLEBAR ortam değişkeni ayarlı olduğu sürece başlık çubuğunu o seçer.
System Title Bar takes precedence over this option while it is on. Sistem Başlık Çubuğu açık olduğu sürece bu seçeneğe göre önceliklidir.
Value Axis Değer Ekseni
On Left Side Sol Tarafta
On Right Side Sağ Tarafta
Can't render this file because it contains an unexpected character in line 5 and column 25.
+3
View File
@@ -4901,6 +4901,9 @@ axis Both Обидві
Bottom Right Знизу праворуч
Edge Край
System Title Bar Системний рядок заголовка
VectorCraft Title Bar on Every Desktop Рядок заголовка VectorCraft на будь-якій стільниці
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Поки змінну середовища VECTORCRAFT_TITLEBAR задано, рядок заголовка вибирає вона.
System Title Bar takes precedence over this option while it is on. Поки ввімкнено «Системний рядок заголовка», він має пріоритет над цим параметром.
Value Axis Вісь значень
On Left Side Ліворуч
On Right Side Праворуч
Can't render this file because it contains an unexpected character in line 182 and column 5.
+3
View File
@@ -3799,6 +3799,9 @@ mark-style Japanese Kiểu Nhật
Symbols Ký hiệu
System Layout Bố cục hệ thống
System Title Bar Thanh tiêu đề hệ thống
VectorCraft Title Bar on Every Desktop Thanh tiêu đề VectorCraft trên mọi màn hình nền
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. Khi biến môi trường VECTORCRAFT_TITLEBAR được đặt, biến này chọn thanh tiêu đề.
System Title Bar takes precedence over this option while it is on. Khi Thanh tiêu đề hệ thống được bật, tùy chọn đó được ưu tiên hơn tùy chọn này.
Tab Tab
Tab Stops Vị trí tab
Table Bảng
Can't render this file because it contains an unexpected character in line 204 and column 5.
+3
View File
@@ -5213,6 +5213,9 @@ effect Horizontal 水平
effect Vertical 垂直
Edge 边缘
System Title Bar 系统标题栏
VectorCraft Title Bar on Every Desktop 在所有桌面上使用 VectorCraft 标题栏
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. 设置了环境变量 VECTORCRAFT_TITLEBAR 时,由它选择标题栏。
System Title Bar takes precedence over this option while it is on. 开启系统标题栏时,它优先于此选项。
Value Axis 数值轴
On Left Side 左侧
On Right Side 右侧
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -5030,6 +5030,9 @@ axis Both 兩者
effect Soft 柔和
Edge 邊緣
System Title Bar 系統標題列
VectorCraft Title Bar on Every Desktop 在所有桌面上使用 VectorCraft 標題列
The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set. 設定了環境變數 VECTORCRAFT_TITLEBAR 時,由它選擇標題列。
System Title Bar takes precedence over this option while it is on. 開啟系統標題列時,它優先於此選項。
Value Axis 數值軸
On Left Side 左側
On Right Side 右側
Can't render this file because it contains an unexpected character in line 6 and column 47.
+4
View File
@@ -195,6 +195,10 @@ pub struct VectorcraftApp {
clipboard_publishing: sysclip::Publishing,
/// A URL to open through egui next frame (when the host has no `open_url` service).
pending_url: Option<String>,
/// `VECTORCRAFT_TITLEBAR` chose this window's frame (Linux and the BSDs), so Preferences › User
/// Interface › VectorCraft Title Bar on Every Desktop does not apply while it is set. `false`
/// unless the host sets it.
pub titlebar_from_env: bool,
/// Windows and Linux: the window has no OS decorations, so the app bar is the title bar (drag,
/// double-click to maximize, caption buttons) and invisible edge zones resize the window.
pub custom_titlebar: bool,
+33 -2
View File
@@ -19,6 +19,10 @@ pub const UI_FIELDS: &[(&str, &str, &str)] = &[
("__taskBar", "General", "Enable Contextual Task Bar"),
];
/// Whether User Interface shows VectorCraft Title Bar on Every Desktop (`appTitleBar`): Linux and the
/// BSDs, where the desktop may draw the window's frame. macOS and Windows never read it.
const APP_TITLE_BAR_SHOWN: bool = cfg!(not(any(target_arch = "wasm32", target_os = "macos", target_os = "windows")));
pub fn open(app: &mut VectorcraftApp, category: Option<&str>) {
// One field per preference key or group (the flattener presets have commands of their own).
let mut fields: Map<String, Value> = app.session.prefs.to_json().as_object().cloned().unwrap_or_default();
@@ -32,6 +36,9 @@ pub fn open(app: &mut VectorcraftApp, category: Option<&str>) {
fields.insert("__smartGuides".into(), json!(app.ui.view.smart_guides));
fields.insert("__snapToGrid".into(), json!(app.ui.view.snap_to_grid));
fields.insert("__taskBar".into(), json!(app.ui.task_bar));
// Read-only: whether VECTORCRAFT_TITLEBAR chose this window's frame (VectorCraft Title Bar on
// Every Desktop's note).
fields.insert("__titlebarFromEnv".into(), json!(app.titlebar_from_env));
fields.insert("__search".into(), json!(""));
fields.insert("__focusSearch".into(), json!(true));
app.ui.dialog = Some(Dialog { kind: "preferences".into(), fields });
@@ -52,6 +59,7 @@ fn settings() -> impl Iterator<Item = Setting> {
let ui_fields = UI_FIELDS.iter().map(|&(key, category, label)| Setting { key, category, section: "", label });
let shown = |key: &str| match key {
"systemTitleBar" => cfg!(all(not(target_arch = "wasm32"), not(target_os = "macos"))),
"appTitleBar" => APP_TITLE_BAR_SHOWN,
"linuxDisplayServer" => cfg!(target_os = "linux"),
_ => true,
};
@@ -474,8 +482,31 @@ fn category_fields(ui: &mut egui::Ui, app: &mut VectorcraftApp, d: &mut Dialog,
PrefKind::Bool if sp.key == "systemTitleBar" => {
if cfg!(all(not(target_arch = "wasm32"), not(target_os = "macos"))) {
bool_row(ui, d, sp.key, sp.label);
// The window's decorations are chosen once, when the app starts.
ui.label(egui::RichText::new(tl!("Applies the next time VectorCraft starts.")).color(t.text_dim).size(11.0));
// The window's decorations are chosen once, when the app starts. On Linux and the
// BSDs the note goes under the next row, which also applies at the next start.
if !APP_TITLE_BAR_SHOWN {
ui.label(egui::RichText::new(tl!("Applies the next time VectorCraft starts.")).color(t.text_dim).size(11.0));
}
}
}
// Linux and the BSDs only, where the desktop may draw the frame: dimmed while System
// Title Bar is on or VECTORCRAFT_TITLEBAR is set, which take precedence over it. A note
// names each one that is in effect.
PrefKind::Bool if sp.key == "appTitleBar" => {
if APP_TITLE_BAR_SHOWN {
let from_env = d.bool("__titlebarFromEnv");
let system = d.bool("systemTitleBar");
ui.add_enabled_ui(!from_env && !system, |ui| bool_row(ui, d, sp.key, sp.label));
if system {
let note = tl!("System Title Bar takes precedence over this option while it is on.");
ui.label(egui::RichText::new(note).color(t.text_dim).size(11.0));
}
let note = if from_env {
tl!("The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set.")
} else {
tl!("Applies the next time VectorCraft starts.")
};
ui.label(egui::RichText::new(note).color(t.text_dim).size(11.0));
}
}
PrefKind::Bool => bool_row(ui, d, sp.key, sp.label),
+91
View File
@@ -301,6 +301,97 @@ fn system_title_bar_preference_shows_and_persists() {
assert_eq!(saved["engine_prefs"]["systemTitleBar"], json!(true));
}
/// User Interface › VectorCraft Title Bar on Every Desktop: shown on Linux and the BSDs only, under
/// System Title Bar with the next-launch note once, and saved under the key the desktop app reads
/// before the window opens.
#[test]
fn app_title_bar_preference_shows_and_persists() {
fn texts(s: &egui::Shape, out: &mut Vec<String>) {
match s {
egui::Shape::Text(t) => out.push(t.galley.text().to_string()),
egui::Shape::Vec(v) => v.iter().for_each(|s| texts(s, out)),
_ => {}
}
}
let mut a = app();
open(&mut a, Some("User Interface"));
let ctx = egui::Context::default();
crate::theme::install_fonts(&ctx);
let mut out = ctx.run_ui(egui::RawInput::default(), |ui| show(&mut a, ui.ctx()));
out.textures_delta.clear();
let mut out = ctx.run_ui(egui::RawInput::default(), |ui| show(&mut a, ui.ctx()));
out.textures_delta.clear();
let mut shown = vec![];
out.shapes.iter().for_each(|c| texts(&c.shape, &mut shown));
let supported = cfg!(not(any(target_arch = "wasm32", target_os = "macos", target_os = "windows")));
assert_eq!(shown.iter().any(|t| t == "VectorCraft Title Bar on Every Desktop"), supported, "{shown:?}");
let notes = shown.iter().filter(|t| *t == "Applies the next time VectorCraft starts.").count();
assert_eq!(notes, usize::from(cfg!(all(not(target_arch = "wasm32"), not(target_os = "macos")))), "{shown:?}");
a.ui.dialog.as_mut().unwrap().fields.insert("appTitleBar".into(), json!(true));
confirm(&mut a).unwrap();
assert!(a.session.prefs.app_title_bar);
let saved: Value = serde_json::from_slice(&serde_json::to_vec(&a.ui).unwrap()).unwrap();
assert_eq!(saved["engine_prefs"]["appTitleBar"], json!(true));
}
/// VectorCraft Title Bar on Every Desktop does not take clicks while System Title Bar is on or
/// VECTORCRAFT_TITLEBAR is set. With the variable set its note names the variable in place of the
/// next-launch note, and with System Title Bar on a note says that System Title Bar takes precedence.
#[test]
fn app_title_bar_is_dimmed_while_something_takes_precedence() {
fn texts(s: &egui::Shape, out: &mut Vec<String>) {
match s {
egui::Shape::Text(t) => out.push(t.galley.text().to_string()),
egui::Shape::Vec(v) => v.iter().for_each(|s| texts(s, out)),
_ => {}
}
}
let note = "The VECTORCRAFT_TITLEBAR environment variable chooses the title bar while it is set.";
let system_note = "System Title Bar takes precedence over this option while it is on.";
let restart_note = "Applies the next time VectorCraft starts.";
let supported = cfg!(not(any(target_arch = "wasm32", target_os = "macos", target_os = "windows")));
for (from_env, system) in [(false, false), (true, false), (false, true), (true, true)] {
let mut a = app();
a.titlebar_from_env = from_env;
open(&mut a, Some("User Interface"));
a.ui.dialog.as_mut().unwrap().fields.insert("systemTitleBar".into(), json!(system));
let ctx = egui::Context::default();
crate::theme::install_fonts(&ctx);
let mut out = ctx.run_ui(egui::RawInput::default(), |ui| show(&mut a, ui.ctx()));
out.textures_delta.clear();
let mut out = ctx.run_ui(egui::RawInput::default(), |ui| show(&mut a, ui.ctx()));
out.textures_delta.clear();
let mut shown = vec![];
out.shapes.iter().for_each(|c| texts(&c.shape, &mut shown));
assert_eq!(shown.iter().any(|t| t == note), supported && from_env, "{shown:?}");
assert_eq!(shown.iter().any(|t| t == system_note), supported && system, "{shown:?}");
// The next-launch note stays under this row on Linux and the BSDs, where it also covers
// System Title Bar, and under System Title Bar on Windows.
let restart_shown = if supported { !from_env } else { cfg!(all(not(target_arch = "wasm32"), not(target_os = "macos"))) };
assert_eq!(shown.iter().filter(|t| *t == restart_note).count(), usize::from(restart_shown), "{shown:?}");
// A click on the checkbox's label turns the preference on only when nothing takes precedence.
let label = out.shapes.iter().find_map(|c| match &c.shape {
egui::Shape::Text(t) if t.galley.text() == "VectorCraft Title Bar on Every Desktop" => Some(t.visual_bounding_rect()),
_ => None,
});
assert_eq!(label.is_some(), supported);
if let Some(r) = label {
for pressed in [true, false] {
let input = egui::RawInput {
events: vec![
egui::Event::PointerMoved(r.center()),
egui::Event::PointerButton { pos: r.center(), button: egui::PointerButton::Primary, pressed, modifiers: Default::default() },
],
..Default::default()
};
let mut out = ctx.run_ui(input, |ui| show(&mut a, ui.ctx()));
out.textures_delta.clear();
}
assert_eq!(a.ui.dialog.as_ref().unwrap().bool("appTitleBar"), !from_env && !system, "variable {from_env}, System Title Bar {system}");
}
}
}
/// Performance › Linux Display Server (#2028): on Linux it shows the drawing-tablet note, and
/// X11 (XWayland) When a Pen Is Attached is applied by OK and saved under the key the desktop
/// app reads before the window opens.
+7
View File
@@ -331,6 +331,13 @@ instead: the OS title then shows the active document (`*name — VectorCraft` wi
drops its brand mark. On Linux the app bar also drops its brand mark whenever the desktop draws the window's frame, with
System Title Bar on or off. On macOS the window buttons are centred on the app bar; the web build is unchanged.
On Linux and the BSDs, Preferences › User Interface › VectorCraft Title Bar on Every Desktop (`appTitleBar`, read
when the app starts, off by default) turns off the desktop's frame and uses the app bar as the title bar in the
sessions where the desktop would draw the frame: X11 sessions, Wayland compositors that draw server-side decorations
such as KDE Plasma, and a window opened through XWayland. System Title Bar and `VECTORCRAFT_TITLEBAR` (`app`, or
`system` or `desktop`) take precedence over it. The checkbox is dimmed while either applies, and a note under it names
each one that applies.
Fill/Stroke chips and panel shortcuts: the Control bar's and Properties' Fill and Stroke chips bring their proxy
forward (`paint.toggleActive {fill}`) and open a popover with the Swatches panel (Shift-click: the Color panel's mixer);
a swatch clicked there runs `paint.setFill` / `paint.setStroke`. The Properties panel has them with nothing selected
+1 -1
View File
@@ -118,7 +118,7 @@ A file opened from the file manager (double-click, Open With, a drop on the exec
## Linux: Wayland and X11
On GNOME/Wayland, enable **Preferences › User Interface › System Title Bar** and restart to use winit's font-free Adwaita window controls (`wayland-csd-adwaita-notitle`); the existing custom title bar remains the Linux default.
On GNOME/Wayland, enable **Preferences › User Interface › System Title Bar** and restart to use winit's font-free Adwaita window controls (`wayland-csd-adwaita-notitle`); the existing custom title bar remains the Linux default. On X11, on a Wayland compositor that draws server-side decorations such as KDE Plasma, and in a window opened through XWayland, enable **Preferences › User Interface › VectorCraft Title Bar on Every Desktop** and restart to use the app bar as the title bar instead of the desktop's frame. `VECTORCRAFT_TITLEBAR=app`, `=system` or `=desktop` chooses the frame for one run and takes precedence over VectorCraft Title Bar on Every Desktop.
The window runs natively on Wayland (eframe's `wayland` feature) and on X11. On machines with two GPUs it renders on the one the desktop runs on unless Preferences say otherwise; see [Desktop graphics processor](#desktop-graphics-processor) (#502). The system clipboard (`apps/vectorcraft/src/clipboard.rs`) is arboard with its `wayland-data-control` feature:
+1
View File
@@ -788,6 +788,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur
- Shortcut sets other apps save as text (`.kys`) open in Import Shortcut Set from File › Open, from Edit › Keyboard Shortcuts › Import… in the desktop app, or from a drop on the window. It matches each entry to a tool, command or panel by name and decodes the file's key and modifier codes where VectorCraft's default shortcuts agree on them; the user answers the rest, and Apply fills the Keyboard Shortcuts dialog's working set. The answers are kept with the preferences for the next import (`shortcutSet.read`, `importMatches.*`).
- Edit › Keyboard Shortcuts › Export Text… saves the set shown in the dialog as a UTF-8 text file, as the reference app's [Export keyboard shortcuts list as a text document](https://helpx.adobe.com/illustrator/desktop/get-started/preferences-and-settings/export-keyboard-shortcuts-list.html) page describes (`shortcuts.exportText {path?}`). The layout is VectorCraft's own: the set's name, then the Tools and Menu Commands rows in the dialog's order, each with its name, a tab and its shortcuts as the dialog shows them, and nothing after the tab for a row with no shortcut. Tests `shortcut_editor::tests::export_text_*` and `tests::picks::keyboard_shortcuts_export_text_writes_the_working_set_as_text`.
- On Windows and Linux the app bar is the window's title bar (its own minimize, maximize and close buttons, drag to move, edges to resize), with the dragon app icon as the brand mark; dialogs and menus size to their content. As on a native menu bar, once one menu is open, moving the pointer onto another title opens that one.
- On Linux and the BSDs, Preferences › User Interface › VectorCraft Title Bar on Every Desktop (off by default) uses the app bar as the title bar from the next start in the sessions where the desktop would draw the window's frame (X11, Wayland compositors with server-side decorations such as KDE Plasma, a window opened through XWayland). System Title Bar and `VECTORCRAFT_TITLEBAR` take precedence over it.
- Edit › Keyboard Shortcuts lists items of the menu bar and panel menus, as the reference app's [Customize keyboard shortcuts](https://web.archive.org/web/20221205131209id_/https://helpx.adobe.com/illustrator/using/customizing-keyboard-shortcuts.html) page describes for its Menu Commands. A menu command with no default shortcut that needs a value a key press does not give, such as File › Document Setup › Units (`document.setUnits {units}`), is listed only while the user has changed its shortcut. A command stays listed when a menu bar item runs it without a value or when it opens a dialog run without one, as the Variables panel's commands do.
- A shortcut on the key left of 1 runs whatever character that key types, and Edit › Keyboard Shortcuts, the menus in the window, the command palette and tool tips show it as that character once the key has been pressed: `"` on a Turkish Q layout, `~` on a US layout as before. Shortcuts saved as `~` keep working (#4559).
- On Windows a maximized window stays inside the work area with the taskbar on any edge (#3242, #3723).