Merge tag 'epoch-1.8.0' into local/yoda-main-1.3.0

Epoch 1.8.0
This commit is contained in:
Lionel DARNIS 2026-09-10 17:56:29 +02:00
commit 0fec31749b
16 changed files with 208 additions and 50 deletions

28
Cargo.lock generated
View file

@ -278,7 +278,7 @@ version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
dependencies = [ dependencies = [
"windows-sys 0.61.2", "windows-sys 0.60.2",
] ]
[[package]] [[package]]
@ -289,7 +289,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
dependencies = [ dependencies = [
"anstyle", "anstyle",
"once_cell_polyfill", "once_cell_polyfill",
"windows-sys 0.61.2", "windows-sys 0.60.2",
] ]
[[package]] [[package]]
@ -2183,7 +2183,7 @@ dependencies = [
"libc", "libc",
"option-ext", "option-ext",
"redox_users", "redox_users",
"windows-sys 0.61.2", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@ -2326,7 +2326,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [ dependencies = [
"libc", "libc",
"windows-sys 0.61.2", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -4482,7 +4482,7 @@ version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a1886916523694cd6ea3d175f03a1e5010699a2a4cc13696d83d7bea1d80638" checksum = "7a1886916523694cd6ea3d175f03a1e5010699a2a4cc13696d83d7bea1d80638"
dependencies = [ dependencies = [
"windows-sys 0.61.2", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@ -5043,9 +5043,9 @@ checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
[[package]] [[package]]
name = "nmrs" name = "nmrs"
version = "3.5.0" version = "3.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84eac3f02c7970440ee58eeedc085b44ea4ad7161d7763457ae2389b415a84c8" checksum = "aa84a0ad51eda83c8817099a0b613847599c712d049e89d892cca53ed6c4a337"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"base64", "base64",
@ -5137,7 +5137,7 @@ version = "0.50.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
dependencies = [ dependencies = [
"windows-sys 0.61.2", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@ -6472,7 +6472,7 @@ dependencies = [
"errno", "errno",
"libc", "libc",
"linux-raw-sys 0.12.1", "linux-raw-sys 0.12.1",
"windows-sys 0.61.2", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -6942,7 +6942,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4"
dependencies = [ dependencies = [
"libc", "libc",
"windows-sys 0.61.2", "windows-sys 0.60.2",
] ]
[[package]] [[package]]
@ -7187,10 +7187,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
dependencies = [ dependencies = [
"fastrand", "fastrand",
"getrandom 0.4.3", "getrandom 0.3.4",
"once_cell", "once_cell",
"rustix 1.1.4", "rustix 1.1.4",
"windows-sys 0.61.2", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -7602,7 +7602,7 @@ checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e"
dependencies = [ dependencies = [
"memoffset", "memoffset",
"tempfile", "tempfile",
"windows-sys 0.61.2", "windows-sys 0.60.2",
] ]
[[package]] [[package]]
@ -8272,7 +8272,7 @@ version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
dependencies = [ dependencies = [
"windows-sys 0.61.2", "windows-sys 0.48.0",
] ]
[[package]] [[package]]

View file

@ -55,7 +55,7 @@ locale1 = { git = "https://github.com/pop-os/dbus-settings-bindings", optional =
sysinfo = { version = "=0.38.0", optional = true } sysinfo = { version = "=0.38.0", optional = true }
mime-apps = { package = "cosmic-mime-apps", git = "https://github.com/pop-os/cosmic-mime-apps", features = ["tokio"], optional = true } mime-apps = { package = "cosmic-mime-apps", git = "https://github.com/pop-os/cosmic-mime-apps", features = ["tokio"], optional = true }
notify = "8.2.0" notify = "8.2.0"
nmrs = { version = "3.4.2", optional = true } nmrs = { version = "3.5.2", optional = true }
regex = "1.13.1" regex = "1.13.1"
ron = "0.12" ron = "0.12"
rust-embed = "8.12.0" rust-embed = "8.12.0"

View file

@ -65,6 +65,7 @@ pub struct SettingsApp {
pages: page::Binder<crate::pages::Message>, pages: page::Binder<crate::pages::Message>,
search_active: bool, search_active: bool,
search_id: cosmic::widget::Id, search_id: cosmic::widget::Id,
search_scroll_id: cosmic::iced::id::Id,
search_input: String, search_input: String,
search_selections: Vec<(page::Entity, section::Entity)>, search_selections: Vec<(page::Entity, section::Entity)>,
context_title: Option<String>, context_title: Option<String>,
@ -209,6 +210,7 @@ impl cosmic::Application for SettingsApp {
pages: page::Binder::default(), pages: page::Binder::default(),
search_active: false, search_active: false,
search_id: cosmic::widget::Id::unique(), search_id: cosmic::widget::Id::unique(),
search_scroll_id: cosmic::iced::id::Id::new("COSMIC_search_results_scrollable"),
search_input: String::new(), search_input: String::new(),
search_selections: Vec::default(), search_selections: Vec::default(),
context_title: None, context_title: None,
@ -1221,6 +1223,7 @@ impl SettingsApp {
self.page_container(settings::view_column(sections)) self.page_container(settings::view_column(sections))
.apply(scrollable) .apply(scrollable)
.apply(|w| id_container(w, self.search_scroll_id.clone()))
.into() .into()
} }

View file

@ -37,6 +37,10 @@ enum Dialog {
device: String, device: String,
pincode: String, pincode: String,
}, },
RenameDevice {
path: OwnedObjectPath,
name: String,
},
} }
#[derive(Default)] #[derive(Default)]
@ -353,6 +357,29 @@ impl page::Page<crate::pages::Message> for Page {
Some(dialog) Some(dialog)
} }
Dialog::RenameDevice { name, .. } => {
let is_valid = is_valid_bluetooth_alias(name);
let input = widget::text_input("", name)
.on_input(|value| Message::RenameDeviceInput(value))
.on_submit(|_| Message::RenameDeviceConfirm);
let rename_button = widget::button::suggested(fl!("rename"))
.on_press_maybe(is_valid.then_some(Message::RenameDeviceConfirm));
let cancel_button =
widget::button::standard(fl!("cancel")).on_press(Message::RenameDeviceCancel);
let dialog = widget::dialog()
.title(fl!("bluetooth-rename-device"))
.control(input)
.primary_action(rename_button)
.secondary_action(cancel_button)
.apply(Element::from)
.map(Into::into);
Some(dialog)
}
} }
} }
} }
@ -369,6 +396,10 @@ pub enum Message {
PinConfirm, PinConfirm,
PopupDevice(Option<OwnedObjectPath>), PopupDevice(Option<OwnedObjectPath>),
PopupSetting(bool), PopupSetting(bool),
RenameDevice(OwnedObjectPath),
RenameDeviceInput(String),
RenameDeviceConfirm,
RenameDeviceCancel,
SelectAdapter(Option<OwnedObjectPath>), SelectAdapter(Option<OwnedObjectPath>),
ServiceActivate, ServiceActivate,
ServiceEnable, ServiceEnable,
@ -630,6 +661,10 @@ impl Page {
_ => (), _ => (),
} }
} }
Event::DeviceRenameFailed(path) => {
tracing::warn!("Failed to rename device {path}");
}
}, },
Message::PinCancel => { Message::PinCancel => {
@ -836,6 +871,42 @@ impl Page {
} }
} }
Message::RenameDevice(path) => {
self.model.popup_device = None;
let name = self
.model
.devices
.get(&path)
.map_or_else(String::new, |d| d.alias_or_addr().to_owned());
self.dialog = Some(Dialog::RenameDevice { path, name });
}
Message::RenameDeviceInput(new_name) => {
if let Some(Dialog::RenameDevice { name, .. }) = &mut self.dialog {
*name = new_name;
}
}
Message::RenameDeviceCancel => {
if matches!(self.dialog, Some(Dialog::RenameDevice { .. })) {
self.dialog = None;
}
}
Message::RenameDeviceConfirm => {
if let Some(Dialog::RenameDevice { path, name }) = self.dialog.take() {
if let Some(connection) = self.connection.clone() {
return cosmic::task::future(rename_device(
connection,
path,
name.trim().into(),
));
} else {
tracing::warn!("No DBus connection ready");
}
}
}
Message::ServiceActivate => { Message::ServiceActivate => {
let activate_future = self.service_manager.activate(); let activate_future = self.service_manager.activate();
return cosmic::task::future(async move { return cosmic::task::future(async move {
@ -934,6 +1005,11 @@ fn status() -> Section<crate::pages::Message> {
}) })
} }
fn is_valid_bluetooth_alias(name: &str) -> bool {
let trimmed = name.trim();
!trimmed.is_empty() && trimmed.len() <= 248
}
fn popup_button(message: Option<Message>, text: &str) -> Element<'_, Message> { fn popup_button(message: Option<Message>, text: &str) -> Element<'_, Message> {
let spacing = theme::spacing(); let spacing = theme::spacing();
widget::text::body(text) widget::text::body(text)
@ -954,6 +1030,7 @@ fn connected_devices() -> Section<crate::pages::Message> {
device_connect = fl!("bluetooth", "connect"); device_connect = fl!("bluetooth", "connect");
device_disconnect = fl!("bluetooth", "disconnect"); device_disconnect = fl!("bluetooth", "disconnect");
device_forget = fl!("bluetooth", "forget"); device_forget = fl!("bluetooth", "forget");
device_rename = fl!("rename");
}); });
Section::default() Section::default()
@ -991,13 +1068,17 @@ fn connected_devices() -> Section<crate::pages::Message> {
.position(widget::popover::Position::Bottom) .position(widget::popover::Position::Bottom)
.on_close(Message::PopupDevice(None)) .on_close(Message::PopupDevice(None))
.popup( .popup(
widget::column::with_capacity(2) widget::column::with_capacity(3)
.push_maybe(device.is_connected().then(|| { .push_maybe(device.is_connected().then(|| {
popup_button( popup_button(
Some(Message::DisconnectDevice(path.clone())), Some(Message::DisconnectDevice(path.clone())),
&descriptions[device_disconnect], &descriptions[device_disconnect],
) )
})) }))
.push(popup_button(
Some(Message::RenameDevice(path.clone())),
&descriptions[device_rename],
))
.push_maybe(device.paired.then(|| { .push_maybe(device.paired.then(|| {
popup_button( popup_button(
Some(Message::ForgetDevice(path.clone())), Some(Message::ForgetDevice(path.clone())),

View file

@ -197,6 +197,7 @@ impl<Message: Clone> Widget<Message, cosmic::Theme, Renderer> for Arrangement<'_
); );
shell.capture_event(); shell.capture_event();
shell.request_redraw();
} }
} }
} }

View file

@ -14,8 +14,8 @@ use nmrs::agent::{SecretAgent, SecretAgentFlags, SecretRequest, SecretResponder,
use nmrs::raw::zbus; use nmrs::raw::zbus;
use nmrs::raw::zvariant::{Dict, OwnedObjectPath, OwnedValue, Str, Value}; use nmrs::raw::zvariant::{Dict, OwnedObjectPath, OwnedValue, Str, Value};
use nmrs::{ use nmrs::{
ActiveConnection, ConnectType, ConnectionOptions, EapOptions, NetworkEvent, NetworkManager, ActiveConnection, ConnectByUuidConfig, ConnectType, ConnectionOptions, EapOptions,
SavedConnection, SettingsSummary, WifiKeyMgmt, WifiSecurity, NetworkEvent, NetworkManager, SavedConnection, SettingsSummary, WifiKeyMgmt, WifiSecurity,
}; };
use secure_string::SecureString; use secure_string::SecureString;
use tokio::sync::oneshot; use tokio::sync::oneshot;
@ -620,7 +620,10 @@ async fn handle_request(nm: &NetworkManager, req: Request) -> Event {
) )
.await .await
.is_ok(), .is_ok(),
Request::ActivateVpn(uuid) => nm.connect_vpn_by_uuid(uuid).await.is_ok(), Request::ActivateVpn(uuid) => nm
.connect_by_uuid(uuid, ConnectByUuidConfig::default())
.await
.is_ok(),
Request::Deactivate(uuid) => deactivate_by_uuid(nm, uuid).await.is_ok(), Request::Deactivate(uuid) => deactivate_by_uuid(nm, uuid).await.is_ok(),
Request::Disconnect(ssid) => disconnect_wifi_by_ssid(nm, ssid).await.is_ok(), Request::Disconnect(ssid) => disconnect_wifi_by_ssid(nm, ssid).await.is_ok(),
Request::Forget(ssid) => nm.forget(ssid).await.is_ok(), Request::Forget(ssid) => nm.forget(ssid).await.is_ok(),
@ -907,7 +910,7 @@ async fn disconnect_wifi_by_ssid(nm: &NetworkManager, ssid: &str) -> Result<(),
} }
async fn deactivate_by_uuid(nm: &NetworkManager, uuid: &str) -> Result<(), Error> { async fn deactivate_by_uuid(nm: &NetworkManager, uuid: &str) -> Result<(), Error> {
if nm.disconnect_vpn_by_uuid(uuid).await.is_ok() { if nm.disconnect_by_uuid(uuid).await.is_ok() {
return Ok(()); return Ok(());
} }

View file

@ -5,8 +5,7 @@ use super::model;
use cosmic::desktop::{ use cosmic::desktop::{
DesktopEntryCache, DesktopLookupContext, DesktopResolveOptions, resolve_desktop_entry, DesktopEntryCache, DesktopLookupContext, DesktopResolveOptions, resolve_desktop_entry,
}; };
use cosmic::iced::futures; use cosmic::iced::{self, Alignment, Length, futures, window};
use cosmic::iced::{self, Alignment, Length, window};
use cosmic::widget::space::horizontal as horizontal_space; use cosmic::widget::space::horizontal as horizontal_space;
use cosmic::{Apply, Element, surface, widget}; use cosmic::{Apply, Element, surface, widget};
use cosmic_config::{Config, ConfigGet}; use cosmic_config::{Config, ConfigGet};

View file

@ -807,3 +807,38 @@ full-name = Fulde navn
invalid-username = Ugyldigt brugernavn. invalid-username = Ugyldigt brugernavn.
password-mismatch = Adgangskode og bekræftelse skal være ens. password-mismatch = Adgangskode og bekræftelse skal være ens.
save = Gem save = Gem
xdg-entry-bluetooth-comment = Håndter Bluetoothenheder
xdg-entry-default-apps-comment = Standardwebbrowser, mailklient, filhåndtering og andre programmer
xdg-entry-appearance-keywords = COSMIC;Accent;Farve;Ikon;Skrifttype;Tema
xdg-entry-dock-keywords = COSMIC;Dock;Panel;Applet
xdg-entry-a11y = Tilgængelighed
xdg-entry-desktop-keywords = COSMIC;Skrivebord;
xdg-entry-displays-comment = Administrer skærmkonfigurationsindstillinger
xdg-entry-default-apps = Standardprogrammer
xdg-entry-applications-comment = Standardprogrammer, opstartsprogrammer og X11 program kompatibilitetsindstillinger
xdg-entry-about-keywords = COSMIC;Om
xdg-entry-a11y-keywords = COSMIC;Tilgængelighed;A11y;Skærm;Oplæser;Forstørrelse;Kontrast;Farve;
xdg-entry-desktop = Skrivebord
xdg-entry-date-time-keywords = COSMIC;Tid;Zone;
xdg-entry-keyboard = Tastatur
xdg-entry-a11y-comment = Skærmoplæsning, forstørrelse, høj kontrast og farvefiltre
xdg-entry-displays = Skærme
xdg-entry-date-time = Dato & tid
xdg-entry-input-comment = Tastatur- og museindstillinger
xdg-entry-bluetooth-keywords = COSMIC;Bluetooth;
xdg-entry-dock = Dock
xdg-entry-about-comment = Enhedsnavn, hardwareoplysninger og standardindstillinger for operativsystemet
xdg-entry-appearance-comment = Accentfarver og temaer
xdg-entry-input-keywords = COSMIC;Input;Tastatur;Mus;Mus;
xdg-entry-comment = Indstillingsprogram for COSMIC skrivebord
xdg-entry-applications = Applikationer
xdg-entry-default-apps-keywords = COSMIC;Standard;Program
xdg-entry-keywords = COSMIC;Indstillinger;
xdg-entry-about = Om
xdg-entry-input = Inputenheder
xdg-entry-applications-keywords = COSMIC;Standard;Program;Opstart;X11;Kompatibilitet
xdg-entry-appearance = Udseende
xdg-entry-displays-keywords = COSMIC;Skærm;
xdg-entry-date-time-comment = Tidszone, automatiske ur-indstillinger og tidsformat
xdg-entry-desktop-comment = Baggrund, udseende, panel, dock, vindueshåndtering og arbejdsområder
xdg-entry-dock-comment = En valgfri bjælke til apps og applets

View file

@ -96,7 +96,7 @@ system-shortcut = Σύστημα
.home-folder = Άνοιγμα προσωπικού φακέλου .home-folder = Άνοιγμα προσωπικού φακέλου
.keyboard-brightness-down = Μείωση φωτεινότητας πληκτρολογίου .keyboard-brightness-down = Μείωση φωτεινότητας πληκτρολογίου
.keyboard-brightness-up = Αύξηση φωτεινότητας πληκτρολογίου .keyboard-brightness-up = Αύξηση φωτεινότητας πληκτρολογίου
.launcher = Άνοιγμα εκκινητή .launcher = Άνοιγμα γραμμής εκκίνησης
.log-out = Αποσύνδεση .log-out = Αποσύνδεση
.lock-screen = Κλείδωμα οθόνης .lock-screen = Κλείδωμα οθόνης
.mute = Σίγαση εξόδου ήχου .mute = Σίγαση εξόδου ήχου
@ -116,7 +116,7 @@ system-shortcut = Σύστημα
.window-switcher-previous = Εναλλαγή μεταξύ των ανοικτών παραθύρων (αντίστροφα) .window-switcher-previous = Εναλλαγή μεταξύ των ανοικτών παραθύρων (αντίστροφα)
.workspace-overview = Άνοιγμα επισκόπησης χώρων εργασίας .workspace-overview = Άνοιγμα επισκόπησης χώρων εργασίας
super-key = Ενέργεια πλήκτρου Super super-key = Ενέργεια πλήκτρου Super
.launcher = Άνοιγμα μενού εκκίνησης .launcher = Άνοιγμα γραμμής εκκίνησης
.workspaces = Άνοιγμα χώρων εργασίας .workspaces = Άνοιγμα χώρων εργασίας
.applications = Άνοιγμα εφαρμογών .applications = Άνοιγμα εφαρμογών
.none = Καμία .none = Καμία
@ -164,7 +164,7 @@ all-displays = Όλες οι οθόνες
scheduling = Προγραμματισμός scheduling = Προγραμματισμός
.manual = Χειροκίνητο πρόγραμμα .manual = Χειροκίνητο πρόγραμμα
frosted = Εφέ ημιδιαφανούς γυαλιού στο περιβάλλον συστήματος frosted = Εφέ ημιδιαφανούς γυαλιού στο περιβάλλον συστήματος
.desc = Εφαρμόζει θόλωση του φόντου της γραμμής συστήματος, της μπάρας εφαρμογών, του μενού εκκίνησης και της βιβλιοθήκης εφαρμογών .desc = Εφαρμόζει θόλωση του φόντου της γραμμής συστήματος, της μπάρας εφαρμογών, της γραμμής εκκίνησης και της βιβλιοθήκης εφαρμογών
about-hardware = Υλικό about-hardware = Υλικό
.model = Μοντέλο υλικού .model = Μοντέλο υλικού
.memory = Μνήμη .memory = Μνήμη
@ -227,6 +227,8 @@ accessibility = Προσβασιμότητα
.high-contrast = Λειτουργία υψηλής αντίθεσης .high-contrast = Λειτουργία υψηλής αντίθεσης
.invert-colors = Αναστροφή χρωμάτων .invert-colors = Αναστροφή χρωμάτων
.color-filters = Φίλτρα χρωμάτων .color-filters = Φίλτρα χρωμάτων
.shake-cursor = Ανακίνηση για εντοπισμό του κέρσορα
.shake-cursor-desc = Ανακινήστε γρήγορα το ποντίκι για να μεγεθυνθεί προσωρινά ο κέρσορας
container-background = Φόντο πλαισίων container-background = Φόντο πλαισίων
.desc-detail = Το χρώμα φόντου πλαισίων χρησιμοποιείται για την πλαϊνή στήλη πλοήγησης, το πλευρικό συρτάρι, τα παράθυρα διαλόγων και παρόμοια γραφικά στοιχεία. Από προεπιλογή, το χρώμα φόντου πλαισίων προκύπτει αυτόματα από το φόντο των παραθύρων. .desc-detail = Το χρώμα φόντου πλαισίων χρησιμοποιείται για την πλαϊνή στήλη πλοήγησης, το πλευρικό συρτάρι, τα παράθυρα διαλόγων και παρόμοια γραφικά στοιχεία. Από προεπιλογή, το χρώμα φόντου πλαισίων προκύπτει αυτόματα από το φόντο των παραθύρων.
.reset = Επαναφορά στο αυτόματο .reset = Επαναφορά στο αυτόματο
@ -380,7 +382,7 @@ style = Στυλ
.square = Τετράγωνο .square = Τετράγωνο
.frosted-glass = Ημιδιαφανές γυαλί .frosted-glass = Ημιδιαφανές γυαλί
.frosted-system-interface = Περιβάλλον συστήματος .frosted-system-interface = Περιβάλλον συστήματος
.frosted-system-interface-desc = Εφαρμόζει το εφέ ημιδιαφανούς γυαλιού στο μενού εκκίνησης, τη βιβλιοθήκη εφαρμογών, την επισκόπηση χώρων εργασίας και τα στοιχεία ελέγχου στην οθόνη .frosted-system-interface-desc = Εφαρμόζει το εφέ ημιδιαφανούς γυαλιού στη γραμμή εκκίνησης, τη βιβλιοθήκη εφαρμογών, την επισκόπηση χώρων εργασίας και τα στοιχεία ελέγχου στην οθόνη
.frosted-windows = Παράθυρα .frosted-windows = Παράθυρα
.frosted-windows-desc = Εφαρμόζει το εφέ ημιδιαφανούς γυαλιού στα παράθυρα και τους διαλόγους .frosted-windows-desc = Εφαρμόζει το εφέ ημιδιαφανούς γυαλιού στα παράθυρα και τους διαλόγους
.frosted-panels = Γραμμές συστήματος .frosted-panels = Γραμμές συστήματος
@ -390,7 +392,7 @@ style = Στυλ
.frosted-thickness = Βαθμός θολότητας .frosted-thickness = Βαθμός θολότητας
.less = λίγο .less = λίγο
.more = πολύ .more = πολύ
.glass-opacity = Διαφάνεια γυαλιού .glass-opacity = Αδιαφάνεια γυαλιού
panel-applets = Διαμόρφωση panel-applets = Διαμόρφωση
.dock-desc = Διαμόρφωση των μικροεφαρμογών της μπάρας εφαρμογών .dock-desc = Διαμόρφωση των μικροεφαρμογών της μπάρας εφαρμογών
.desc = Διαμόρφωση των μικροεφαρμογών της γραμμής συστήματος .desc = Διαμόρφωση των μικροεφαρμογών της γραμμής συστήματος
@ -653,7 +655,7 @@ color = Χρώμα
.profile = Προφίλ χρωμάτων .profile = Προφίλ χρωμάτων
.sidebar = Προφίλ χρωμάτων .sidebar = Προφίλ χρωμάτων
.temperature = Θερμοκρασία χρωμάτων .temperature = Θερμοκρασία χρωμάτων
hex = Δεκαεξαδικό hex = 16αδικό
magnifier = Μεγεθυντικός φακός magnifier = Μεγεθυντικός φακός
.controls = .controls =
Ή χρησιμοποιήστε αυτές τις συντομεύσεις: { $zoom_in -> Ή χρησιμοποιήστε αυτές τις συντομεύσεις: { $zoom_in ->
@ -694,7 +696,7 @@ sound-device-port-unplugged = Αποσυνδεδεμένο
workspaces-overview = Επισκόπηση χώρων εργασίας workspaces-overview = Επισκόπηση χώρων εργασίας
.action-on-typing = Ενέργεια κατά την πληκτρολόγηση .action-on-typing = Ενέργεια κατά την πληκτρολόγηση
.none = Καμία .none = Καμία
.launcher = Άνοιγμα μενού εκκίνησης .launcher = Άνοιγμα γραμμής εκκίνησης
.applications = Άνοιγμα εφαρμογών .applications = Άνοιγμα εφαρμογών
time-region = Περιοχή και γλώσσα time-region = Περιοχή και γλώσσα
power = Ενέργεια και μπαταρία power = Ενέργεια και μπαταρία

View file

@ -233,6 +233,7 @@ online-accounts = Online accounts
activate = Activate activate = Activate
confirm = Confirm confirm = Confirm
enable = Enable enable = Enable
rename = Rename
bluetooth = Bluetooth bluetooth = Bluetooth
.status = This system is visible as { $aliases } while Bluetooth settings are open. .status = This system is visible as { $aliases } while Bluetooth settings are open.
@ -260,6 +261,8 @@ bluetooth-display-passkey = Bluetooth Pairing
bluetooth-display-pin = Bluetooth Pairing bluetooth-display-pin = Bluetooth Pairing
.description = Please type the following PIN on { $device }, then press Enter .description = Please type the following PIN on { $device }, then press Enter
bluetooth-rename-device = Rename Device
bluetooth-available = Nearby devices bluetooth-available = Nearby devices
bluetooth-adapters = Bluetooth adapters bluetooth-adapters = Bluetooth adapters

0
i18n/fil/cosmic_settings.ftl vendored Normal file
View file

View file

@ -284,7 +284,7 @@ container-background = Felületi elemek háttere
.desc = Navigációs oldalsávhoz, oldalsó menühöz, párbeszédablakhoz és hasonló modulokhoz használandó .desc = Navigációs oldalsávhoz, oldalsó menühöz, párbeszédablakhoz és hasonló modulokhoz használandó
control-tint = Vezérlőelemek színezése control-tint = Vezérlőelemek színezése
.desc = Szabványos gombok hátterére, keresési bemenetekre, szövegbevitelre és hasonló összetevőkre használandó .desc = Szabványos gombok hátterére, keresési bemenetekre, szövegbevitelre és hasonló összetevőkre használandó
frosted = Tejüveghatás a rendszerfelületen frosted = Mattüveghatás a rendszerfelületen
.desc = A háttér elmosását alkalmazza a panelre, a dokkra, a kisalkalmazásokra, az indítóra és az alkalmazáskönyvtárra .desc = A háttér elmosását alkalmazza a panelre, a dokkra, a kisalkalmazásokra, az indítóra és az alkalmazáskönyvtárra
enable-export = Jelenlegi téma alkalmazása a GNOME-alkalmazásokra enable-export = Jelenlegi téma alkalmazása a GNOME-alkalmazásokra
.desc = Nem minden eszközkészlet támogatja az automatikus váltást. Előfordulhat, hogy a téma módosítása után újra kell indítani a nem COSMIC-alkalmazásokat. .desc = Nem minden eszközkészlet támogatja az automatikus váltást. Előfordulhat, hogy a téma módosítása után újra kell indítani a nem COSMIC-alkalmazásokat.
@ -296,15 +296,15 @@ style = Stílus
.round = Lekerekített .round = Lekerekített
.slightly-round = Enyhén lekerekített .slightly-round = Enyhén lekerekített
.square = Szögletes .square = Szögletes
.frosted-glass = Tejüveghatás .frosted-glass = Mattüveghatás
.frosted-system-interface = Rendszerfelület .frosted-system-interface = Rendszerfelület
.frosted-system-interface-desc = Tejüveghatás alkalmazása az Indítóra, az alkalmazáskönyvtárra, a munkaterület-áttekintőre és a képernyőn megjelenő vezérlőkre .frosted-system-interface-desc = Mattüveghatás alkalmazása az Indítóra, az alkalmazáskönyvtárra, a munkaterület-áttekintőre és a képernyőn megjelenő vezérlőkre
.frosted-windows = Ablakok .frosted-windows = Ablakok
.frosted-windows-desc = Tejüveghatás alkalmazása az ablakokra és a párbeszédablakokra .frosted-windows-desc = Mattüveghatás alkalmazása az ablakokra és a párbeszédablakokra
.frosted-panels = Panelek .frosted-panels = Panelek
.frosted-panels-desc = Tejüveghatás alkalmazása a panelre és a dokkra .frosted-panels-desc = Mattüveghatás alkalmazása a panelre és a dokkra
.frosted-applets = Kisalkalmazások .frosted-applets = Kisalkalmazások
.frosted-applets-desc = Tejüveghatás alkalmazása a panelen és a dokkon lévő kisalkalmazások menüire .frosted-applets-desc = Mattüveghatás alkalmazása a panelen és a dokkon lévő kisalkalmazások menüire
.frosted-thickness = Homályosítás mértéke .frosted-thickness = Homályosítás mértéke
.less = kevesebb .less = kevesebb
.more = több .more = több

View file

@ -249,7 +249,7 @@ hearing = Guhdarîkirin
preferred-languages = Zimanên bijarte preferred-languages = Zimanên bijarte
.desc = Rêza zimanan diyar dike ka kîjan ziman ji bo navrûya bikarhêner tê bikaranîn. Guhertin di têketina din de dikevin bandorê. .desc = Rêza zimanan diyar dike ka kîjan ziman ji bo navrûya bikarhêner tê bikaranîn. Guhertin di têketina din de dikevin bandorê.
sound-hd-audio = Dengê HD sound-hd-audio = Dengê HD
network-and-wireless = Tor & Bêtêlî network-and-wireless = Tor
panel-style = Şêwaz panel-style = Şêwaz
.anchor-gap = Valahiya di navbera destgeh û qeraxên dîmenderê de .anchor-gap = Valahiya di navbera destgeh û qeraxên dîmenderê de
.dock-anchor-gap = Valahiya di navbera bender û qeraxên dîmenderê de .dock-anchor-gap = Valahiya di navbera bender û qeraxên dîmenderê de
@ -742,7 +742,7 @@ xdg-entry-wallpaper = Wêneya dîwêr
xdg-entry-keyboard = Kilîtdank xdg-entry-keyboard = Kilîtdank
xdg-entry-a11y-comment = Xwînerê dîmenderê, mezinker, berevajiya bilind, û parzûnên rengan xdg-entry-a11y-comment = Xwînerê dîmenderê, mezinker, berevajiya bilind, û parzûnên rengan
xdg-entry-displays = Dîmender xdg-entry-displays = Dîmender
xdg-entry-network = Tor & Bêtêlî xdg-entry-network = Tor
sound = Deng sound = Deng
xdg-entry-date-time = Dîrok & Dem xdg-entry-date-time = Dîrok & Dem
notifications = Agahdarî notifications = Agahdarî

View file

@ -499,14 +499,14 @@ battery = Batterij
} }
connected-devices = Verbonden apparaten connected-devices = Verbonden apparaten
.unknown = Onbekend apparaat .unknown = Onbekend apparaat
power-mode = Energieverbruik power-mode = Prestaties en energieverbruik
.battery = Energiebesparing .battery = Energiebesparing
.battery-desc = Verminderd energieverbruik en stille prestaties. .battery-desc = Verminderde prestaties en lager energieverbruik.
.balanced = Gebalanceerd .balanced = Gebalanceerd
.balanced-desc = Normale prestaties en batterieverbruik. .balanced-desc = Normale prestaties en matig energieverbruik.
.performance = Hoge Prestatie .performance = Krachtige prestaties
.performance-desc = Hoge prestatie en energieverbruik. .performance-desc = Maximale prestaties en hoger energieverbruik.
.no-backend = Backend niet gevonden. Installeer system76-power of power-profiles-daemon. .no-backend = Backend niet gevonden. Installeer "system76-power" of "power-profiles-daemon".
power-saving = Energiebesparingsopties power-saving = Energiebesparingsopties
.turn-off-screen-after = Beeldscherm uitschakelen na .turn-off-screen-after = Beeldscherm uitschakelen na
.auto-suspend = Automatische slaapstand .auto-suspend = Automatische slaapstand
@ -739,11 +739,11 @@ time-date = Datum en tijd
time-zone = Tijdzone time-zone = Tijdzone
.auto = Tijdzone automatisch bepalen .auto = Tijdzone automatisch bepalen
.auto-info = Vereist locatiebepaling en internettoegang .auto-info = Vereist locatiebepaling en internettoegang
time-format = Datum- en tijdweergave time-format = Datum- en tijdnotatie
.twenty-four = 24-uurs tijd .twenty-four = 24‑uursnotatie
.show-seconds = Laat seconden zien .show-seconds = Seconden weergeven
.first = De week begint op .first = De week begint op
.show-date = Datum weergeven op het paneel boven .show-date = Datum weergeven op het paneel
.friday = Vrijdag .friday = Vrijdag
.saturday = Zaterdag .saturday = Zaterdag
.sunday = Zondag .sunday = Zondag

View file

@ -32,7 +32,7 @@ fn device_type_to_icon(device_type: &str) -> &'static str {
#[derive(Default, Debug, Clone)] #[derive(Default, Debug, Clone)]
pub struct Device { pub struct Device {
alias: Option<String>, pub alias: Option<String>,
pub address: String, pub address: String,
pub adapter: OwnedObjectPath, pub adapter: OwnedObjectPath,
pub enabled: Active, pub enabled: Active,
@ -46,7 +46,7 @@ impl Device {
let (address, adapter, alias) = join!( let (address, adapter, alias) = join!(
proxy.device.address(), proxy.device.address(),
proxy.device.adapter(), proxy.device.adapter(),
proxy.device.name() proxy.device.alias()
); );
let address = address?; let address = address?;
if address.is_empty() { if address.is_empty() {
@ -56,7 +56,10 @@ impl Device {
if adapter.is_empty() { if adapter.is_empty() {
return Err(zbus::Error::Failure("Device has no adapter".to_owned())); return Err(zbus::Error::Failure("Device has no adapter".to_owned()));
} }
let alias = alias.ok(); let alias = match alias {
Ok(alias) if !alias.is_empty() && alias != address.replace(':', "-") => Some(alias),
_ => proxy.device.name().await.ok(),
};
let device_type: String = proxy.icon().await; let device_type: String = proxy.icon().await;
let paired = proxy.device.paired().await.unwrap_or(false); let paired = proxy.device.paired().await.unwrap_or(false);
let enabled = if proxy.device.connected().await.unwrap_or(false) { let enabled = if proxy.device.connected().await.unwrap_or(false) {
@ -309,6 +312,33 @@ pub async fn forget_device(connection: zbus::Connection, device_path: OwnedObjec
} }
} }
pub async fn rename_device(
connection: zbus::Connection,
device_path: OwnedObjectPath,
name: String,
) -> Event {
let proxy = match bluez_zbus::get_device(&connection, device_path.clone()).await {
Err(why) => {
tracing::error!("Unable to get the device: {why}");
return Event::DeviceFailed(device_path);
}
Ok(proxy) => proxy,
};
for attempt in 1..5 {
let result = proxy.device.set_alias(&name).await;
if let Err(why) = result {
tracing::warn!("Unable to rename device: {why}");
tokio::time::sleep(Duration::from_millis(1000 * attempt)).await;
} else {
return Event::Ok;
}
}
Event::DeviceRenameFailed(device_path)
}
pub async fn get_devices(connection: zbus::Connection, adapter_path: OwnedObjectPath) -> Event { pub async fn get_devices(connection: zbus::Connection, adapter_path: OwnedObjectPath) -> Event {
// TODO error handling // TODO error handling
let result: zbus::Result<HashMap<OwnedObjectPath, Device>> = async { let result: zbus::Result<HashMap<OwnedObjectPath, Device>> = async {

View file

@ -21,6 +21,7 @@ pub enum Event {
DBusError(zbus::Error), DBusError(zbus::Error),
DBusServiceUnknown, DBusServiceUnknown,
DeviceFailed(OwnedObjectPath), DeviceFailed(OwnedObjectPath),
DeviceRenameFailed(OwnedObjectPath),
Ok, Ok,
NameHasNoOwner, NameHasNoOwner,
RemovedAdapter(OwnedObjectPath), RemovedAdapter(OwnedObjectPath),