Compare commits

...

5 Commits

Author SHA1 Message Date
21pages
590e344ff5 case-insensitive search in group peer filter
Signed-off-by: 21pages <sunboeasy@gmail.com>
2026-02-22 12:58:41 +08:00
21pages
76b0f69618 group peer filter match both user's display name and user's name
Signed-off-by: 21pages <sunboeasy@gmail.com>
2026-02-22 12:46:28 +08:00
21pages
22e72cea69 improve display name handling
- Append (@username) when multiple users share the same display name
  - Trim whitespace from display_name before comparison and display
  - Add missing translate() for Logout button on desktop

Signed-off-by: 21pages <sunboeasy@gmail.com>
2026-02-21 20:11:17 +08:00
rustdesk
5fc0367abd 1. GUID key (...Uninstall\{GUID}) is MSI-native metadata generated by Windows Installer.
2. Non-GUID key (...Uninstall\RustDesk) is explicitly written by RustDesk’s MSI compatibility component in res/msi/Package/Components/Regs.wxs:44, populated by preprocess.py --arp from .github/workflows/
     flutter-build.yml:262.

  So they were not using the same EstimatedSize logic:

  - MSI GUID key: MSI-calculated size (KB).
  - RustDesk key: custom script value from res/msi/preprocess.py:339 (previously bytes, now fixed to KB).

  That mismatch is exactly why you saw different sizes.
2026-02-19 17:52:17 +08:00
rustdesk
9111bfc1de - UI display: display_name first
- Fallback: name
  - Technical identity: still name

  ### What changed

  - Added account display helpers and display_name state in user model:
      - flutter/lib/models/user_model.dart:16
  - Account/logout label now uses display_name (@name) when both exist:
      - flutter/lib/mobile/pages/settings_page.dart:689
      - flutter/lib/desktop/pages/desktop_setting_page.dart:2016
      - flutter/lib/desktop/pages/desktop_setting_page.dart:2135
  - Desktop Account info now shows both when applicable:
      - Display Name: ...
      - Username: ...
      - flutter/lib/desktop/pages/desktop_setting_page.dart:2039
  - Previously done group-list behavior remains:
      - group user list displays display_name with name fallback
      - flutter/lib/common/widgets/my_group.dart:187
  - Persistence path for display_name remains enabled (including group cache/submodule field):
      - libs/hbb_common/src/config.rs:2347
  - src/client.rs:2630
  - LoginRequest.my_name now resolves as:
      1. OPTION_DISPLAY_NAME (manual override)
      2. user_info.display_name
      3. user_info.name
      4. OS username fallback
2026-02-19 09:43:55 +08:00
58 changed files with 153 additions and 26 deletions

View File

@@ -25,6 +25,7 @@ enum UserStatus { kDisabled, kNormal, kUnverified }
// Is all the fields of the user needed? // Is all the fields of the user needed?
class UserPayload { class UserPayload {
String name = ''; String name = '';
String displayName = '';
String email = ''; String email = '';
String note = ''; String note = '';
String? verifier; String? verifier;
@@ -33,6 +34,7 @@ class UserPayload {
UserPayload.fromJson(Map<String, dynamic> json) UserPayload.fromJson(Map<String, dynamic> json)
: name = json['name'] ?? '', : name = json['name'] ?? '',
displayName = json['display_name'] ?? '',
email = json['email'] ?? '', email = json['email'] ?? '',
note = json['note'] ?? '', note = json['note'] ?? '',
verifier = json['verifier'], verifier = json['verifier'],
@@ -46,6 +48,7 @@ class UserPayload {
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> map = { final Map<String, dynamic> map = {
'name': name, 'name': name,
'display_name': displayName,
'status': status == UserStatus.kDisabled 'status': status == UserStatus.kDisabled
? 0 ? 0
: status == UserStatus.kUnverified : status == UserStatus.kUnverified
@@ -58,9 +61,14 @@ class UserPayload {
Map<String, dynamic> toGroupCacheJson() { Map<String, dynamic> toGroupCacheJson() {
final Map<String, dynamic> map = { final Map<String, dynamic> map = {
'name': name, 'name': name,
'display_name': displayName,
}; };
return map; return map;
} }
String get displayNameOrName {
return displayName.trim().isEmpty ? name : displayName;
}
} }
class PeerPayload { class PeerPayload {

View File

@@ -158,12 +158,18 @@ class _MyGroupState extends State<MyGroup> {
return Obx(() { return Obx(() {
final userItems = gFFI.groupModel.users.where((p0) { final userItems = gFFI.groupModel.users.where((p0) {
if (searchAccessibleItemNameText.isNotEmpty) { if (searchAccessibleItemNameText.isNotEmpty) {
return p0.name final search = searchAccessibleItemNameText.value.toLowerCase();
.toLowerCase() return p0.name.toLowerCase().contains(search) ||
.contains(searchAccessibleItemNameText.value.toLowerCase()); p0.displayNameOrName.toLowerCase().contains(search);
} }
return true; return true;
}).toList(); }).toList();
// Count occurrences of each displayNameOrName to detect duplicates
final displayNameCount = <String, int>{};
for (final u in userItems) {
final dn = u.displayNameOrName;
displayNameCount[dn] = (displayNameCount[dn] ?? 0) + 1;
}
final deviceGroupItems = gFFI.groupModel.deviceGroups.where((p0) { final deviceGroupItems = gFFI.groupModel.deviceGroups.where((p0) {
if (searchAccessibleItemNameText.isNotEmpty) { if (searchAccessibleItemNameText.isNotEmpty) {
return p0.name return p0.name
@@ -177,7 +183,8 @@ class _MyGroupState extends State<MyGroup> {
itemCount: deviceGroupItems.length + userItems.length, itemCount: deviceGroupItems.length + userItems.length,
itemBuilder: (context, index) => index < deviceGroupItems.length itemBuilder: (context, index) => index < deviceGroupItems.length
? _buildDeviceGroupItem(deviceGroupItems[index]) ? _buildDeviceGroupItem(deviceGroupItems[index])
: _buildUserItem(userItems[index - deviceGroupItems.length])); : _buildUserItem(userItems[index - deviceGroupItems.length],
displayNameCount));
var maxHeight = max(MediaQuery.of(context).size.height / 6, 100.0); var maxHeight = max(MediaQuery.of(context).size.height / 6, 100.0);
return Obx(() => stateGlobal.isPortrait.isFalse return Obx(() => stateGlobal.isPortrait.isFalse
? listView(false) ? listView(false)
@@ -185,8 +192,14 @@ class _MyGroupState extends State<MyGroup> {
}); });
} }
Widget _buildUserItem(UserPayload user) { Widget _buildUserItem(UserPayload user, Map<String, int> displayNameCount) {
final username = user.name; final username = user.name;
final dn = user.displayNameOrName;
final isDuplicate = (displayNameCount[dn] ?? 0) > 1;
final displayName =
isDuplicate && user.displayName.trim().isNotEmpty
? '${user.displayName} (@$username)'
: dn;
return InkWell(onTap: () { return InkWell(onTap: () {
isSelectedDeviceGroup.value = false; isSelectedDeviceGroup.value = false;
if (selectedAccessibleItemName.value != username) { if (selectedAccessibleItemName.value != username) {
@@ -222,14 +235,14 @@ class _MyGroupState extends State<MyGroup> {
alignment: Alignment.center, alignment: Alignment.center,
child: Center( child: Center(
child: Text( child: Text(
username.characters.first.toUpperCase(), displayName.characters.first.toUpperCase(),
style: TextStyle(color: Colors.white), style: TextStyle(color: Colors.white),
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
), ),
), ),
).marginOnly(right: 4), ).marginOnly(right: 4),
if (isMe) Flexible(child: Text(username)), if (isMe) Flexible(child: Text(displayName)),
if (isMe) if (isMe)
Flexible( Flexible(
child: Container( child: Container(
@@ -246,7 +259,7 @@ class _MyGroupState extends State<MyGroup> {
), ),
), ),
), ),
if (!isMe) Expanded(child: Text(username)), if (!isMe) Expanded(child: Text(displayName)),
], ],
).paddingSymmetric(vertical: 4), ).paddingSymmetric(vertical: 4),
), ),

View File

@@ -570,11 +570,14 @@ class MyGroupPeerView extends BasePeersView {
static bool filter(Peer peer) { static bool filter(Peer peer) {
final model = gFFI.groupModel; final model = gFFI.groupModel;
if (model.searchAccessibleItemNameText.isNotEmpty) { if (model.searchAccessibleItemNameText.isNotEmpty) {
final text = model.searchAccessibleItemNameText.value; final text = model.searchAccessibleItemNameText.value.toLowerCase();
final searchPeersOfUser = peer.loginName.contains(text) && final searchPeersOfUser = model.users.any((user) =>
model.users.any((user) => user.name == peer.loginName); user.name == peer.loginName &&
final searchPeersOfDeviceGroup = peer.device_group_name.contains(text) && (user.name.toLowerCase().contains(text) ||
model.deviceGroups.any((g) => g.name == peer.device_group_name); user.displayNameOrName.toLowerCase().contains(text)));
final searchPeersOfDeviceGroup =
peer.device_group_name.toLowerCase().contains(text) &&
model.deviceGroups.any((g) => g.name == peer.device_group_name);
if (!searchPeersOfUser && !searchPeersOfDeviceGroup) { if (!searchPeersOfUser && !searchPeersOfDeviceGroup) {
return false; return false;
} }

View File

@@ -2016,7 +2016,9 @@ class _AccountState extends State<_Account> {
Widget accountAction() { Widget accountAction() {
return Obx(() => _Button( return Obx(() => _Button(
gFFI.userModel.userName.value.isEmpty ? 'Login' : 'Logout', gFFI.userModel.userName.value.isEmpty
? 'Login'
: '${translate('Logout')} (${gFFI.userModel.accountLabelWithHandle})',
() => { () => {
gFFI.userModel.userName.value.isEmpty gFFI.userModel.userName.value.isEmpty
? loginDialog() ? loginDialog()
@@ -2037,6 +2039,10 @@ class _AccountState extends State<_Account> {
offstage: gFFI.userModel.userName.value.isEmpty, offstage: gFFI.userModel.userName.value.isEmpty,
child: Column( child: Column(
children: [ children: [
if (gFFI.userModel.displayName.value.trim().isNotEmpty &&
gFFI.userModel.displayName.value.trim() !=
gFFI.userModel.userName.value.trim())
text('Display Name', gFFI.userModel.displayName.value.trim()),
text('Username', gFFI.userModel.userName.value), text('Username', gFFI.userModel.userName.value),
// text('Group', gFFI.groupModel.groupName.value), // text('Group', gFFI.groupModel.groupName.value),
], ],
@@ -2130,7 +2136,9 @@ class _PluginState extends State<_Plugin> {
Widget accountAction() { Widget accountAction() {
return Obx(() => _Button( return Obx(() => _Button(
gFFI.userModel.userName.value.isEmpty ? 'Login' : 'Logout', gFFI.userModel.userName.value.isEmpty
? 'Login'
: '${translate('Logout')} (${gFFI.userModel.accountLabelWithHandle})',
() => { () => {
gFFI.userModel.userName.value.isEmpty gFFI.userModel.userName.value.isEmpty
? loginDialog() ? loginDialog()

View File

@@ -688,7 +688,7 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
SettingsTile( SettingsTile(
title: Obx(() => Text(gFFI.userModel.userName.value.isEmpty title: Obx(() => Text(gFFI.userModel.userName.value.isEmpty
? translate('Login') ? translate('Login')
: '${translate('Logout')} (${gFFI.userModel.userName.value})')), : '${translate('Logout')} (${gFFI.userModel.accountLabelWithHandle})')),
leading: Icon(Icons.person), leading: Icon(Icons.person),
onPressed: (context) { onPressed: (context) {
if (gFFI.userModel.userName.value.isEmpty) { if (gFFI.userModel.userName.value.isEmpty) {

View File

@@ -16,9 +16,23 @@ bool refreshingUser = false;
class UserModel { class UserModel {
final RxString userName = ''.obs; final RxString userName = ''.obs;
final RxString displayName = ''.obs;
final RxBool isAdmin = false.obs; final RxBool isAdmin = false.obs;
final RxString networkError = ''.obs; final RxString networkError = ''.obs;
bool get isLogin => userName.isNotEmpty; bool get isLogin => userName.isNotEmpty;
String get displayNameOrUserName =>
displayName.value.trim().isEmpty ? userName.value : displayName.value;
String get accountLabelWithHandle {
final username = userName.value.trim();
if (username.isEmpty) {
return '';
}
final preferred = displayName.value.trim();
if (preferred.isEmpty || preferred == username) {
return username;
}
return '$preferred (@$username)';
}
WeakReference<FFI> parent; WeakReference<FFI> parent;
UserModel(this.parent) { UserModel(this.parent) {
@@ -98,7 +112,8 @@ class UserModel {
_updateLocalUserInfo() { _updateLocalUserInfo() {
final userInfo = getLocalUserInfo(); final userInfo = getLocalUserInfo();
if (userInfo != null) { if (userInfo != null) {
userName.value = userInfo['name']; userName.value = (userInfo['name'] ?? '').toString();
displayName.value = (userInfo['display_name'] ?? '').toString();
} }
} }
@@ -110,10 +125,12 @@ class UserModel {
await gFFI.groupModel.reset(); await gFFI.groupModel.reset();
} }
userName.value = ''; userName.value = '';
displayName.value = '';
} }
_parseAndUpdateUser(UserPayload user) { _parseAndUpdateUser(UserPayload user) {
userName.value = user.name; userName.value = user.name;
displayName.value = user.displayName;
isAdmin.value = user.isAdmin; isAdmin.value = user.isAdmin;
bind.mainSetLocalOption(key: 'user_info', value: jsonEncode(user)); bind.mainSetLocalOption(key: 'user_info', value: jsonEncode(user));
if (isWeb) { if (isWeb) {

View File

@@ -336,7 +336,9 @@ def gen_custom_ARPSYSTEMCOMPONENT_True(args, dist_dir):
f'{indent}<RegistryValue Type="integer" Name="Language" Value="[ProductLanguage]" />\n' f'{indent}<RegistryValue Type="integer" Name="Language" Value="[ProductLanguage]" />\n'
) )
estimated_size = get_folder_size(dist_dir) # EstimatedSize in uninstall registry must be in KB.
estimated_size_bytes = get_folder_size(dist_dir)
estimated_size = max(1, (estimated_size_bytes + 1023) // 1024)
lines_new.append( lines_new.append(
f'{indent}<RegistryValue Type="integer" Name="EstimatedSize" Value="{estimated_size}" />\n' f'{indent}<RegistryValue Type="integer" Name="EstimatedSize" Value="{estimated_size}" />\n'
) )

View File

@@ -2630,10 +2630,13 @@ impl LoginConfigHandler {
display_name = display_name =
serde_json::from_str::<serde_json::Value>(&LocalConfig::get_option("user_info")) serde_json::from_str::<serde_json::Value>(&LocalConfig::get_option("user_info"))
.map(|x| { .map(|x| {
x.get("name") x.get("display_name")
.map(|x| x.as_str().unwrap_or_default()) .and_then(|x| x.as_str())
.map(|x| x.trim())
.filter(|x| !x.is_empty())
.or_else(|| x.get("name").and_then(|x| x.as_str()))
.map(|x| x.to_owned())
.unwrap_or_default() .unwrap_or_default()
.to_owned()
}) })
.unwrap_or_default(); .unwrap_or_default();
} }

View File

@@ -80,6 +80,8 @@ pub enum UserStatus {
pub struct UserPayload { pub struct UserPayload {
pub name: String, pub name: String,
#[serde(default)] #[serde(default)]
pub display_name: Option<String>,
#[serde(default)]
pub email: Option<String>, pub email: Option<String>,
#[serde(default)] #[serde(default)]
pub note: Option<String>, pub note: Option<String>,
@@ -268,7 +270,12 @@ impl OidcSession {
); );
LocalConfig::set_option( LocalConfig::set_option(
"user_info".to_owned(), "user_info".to_owned(),
serde_json::json!({ "name": auth_body.user.name, "status": auth_body.user.status }).to_string(), serde_json::json!({
"name": auth_body.user.name,
"display_name": auth_body.user.display_name,
"status": auth_body.user.status
})
.to_string(),
); );
} }
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "متابعة مع {}"), ("Continue with {}", "متابعة مع {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Працягнуць з {}"), ("Continue with {}", "Працягнуць з {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Продължи с {}"), ("Continue with {}", "Продължи с {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Continua amb {}"), ("Continue with {}", "Continua amb {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "使用 {} 登录"), ("Continue with {}", "使用 {} 登录"),
("Display Name", "显示名称"),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Pokračovat s {}"), ("Continue with {}", "Pokračovat s {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Fortsæt med {}"), ("Continue with {}", "Fortsæt med {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", "Bildschirm während ausgehender Sitzungen aktiv halten"), ("keep-awake-during-outgoing-sessions-label", "Bildschirm während ausgehender Sitzungen aktiv halten"),
("keep-awake-during-incoming-sessions-label", "Bildschirm während eingehender Sitzungen aktiv halten"), ("keep-awake-during-incoming-sessions-label", "Bildschirm während eingehender Sitzungen aktiv halten"),
("Continue with {}", "Fortfahren mit {}"), ("Continue with {}", "Fortfahren mit {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Συνέχεια με {}"), ("Continue with {}", "Συνέχεια με {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", ""), ("Continue with {}", ""),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Continuar con {}"), ("Continue with {}", "Continuar con {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Jätka koos {}"), ("Continue with {}", "Jätka koos {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "{} honekin jarraitu"), ("Continue with {}", "{} honekin jarraitu"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "ادامه با {}"), ("Continue with {}", "ادامه با {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Jatka käyttäen {}"), ("Continue with {}", "Jatka käyttäen {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", "Maintenir lécran allumé lors des sessions sortantes"), ("keep-awake-during-outgoing-sessions-label", "Maintenir lécran allumé lors des sessions sortantes"),
("keep-awake-during-incoming-sessions-label", "Maintenir lécran allumé lors des sessions entrantes"), ("keep-awake-during-incoming-sessions-label", "Maintenir lécran allumé lors des sessions entrantes"),
("Continue with {}", "Continuer avec {}"), ("Continue with {}", "Continuer avec {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "{}-ით გაგრძელება"), ("Continue with {}", "{}-ით გაგრძელება"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "המשך עם {}"), ("Continue with {}", "המשך עם {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Nastavi sa {}"), ("Continue with {}", "Nastavi sa {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", "Képernyő aktív állapotban tartása a kimenő munkamenetek során"), ("keep-awake-during-outgoing-sessions-label", "Képernyő aktív állapotban tartása a kimenő munkamenetek során"),
("keep-awake-during-incoming-sessions-label", "Képernyő aktív állapotban tartása a bejövő munkamenetek során"), ("keep-awake-during-incoming-sessions-label", "Képernyő aktív állapotban tartása a bejövő munkamenetek során"),
("Continue with {}", "Folytatás a következővel: {}"), ("Continue with {}", "Folytatás a következővel: {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Lanjutkan dengan {}"), ("Continue with {}", "Lanjutkan dengan {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", "Mantieni lo schermo attivo durante le sessioni in uscita"), ("keep-awake-during-outgoing-sessions-label", "Mantieni lo schermo attivo durante le sessioni in uscita"),
("keep-awake-during-incoming-sessions-label", "Mantieni lo schermo attivo durante le sessioni in ingresso"), ("keep-awake-during-incoming-sessions-label", "Mantieni lo schermo attivo durante le sessioni in ingresso"),
("Continue with {}", "Continua con {}"), ("Continue with {}", "Continua con {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "{} で続行"), ("Continue with {}", "{} で続行"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", "발신 세션 중 화면 켜짐 유지"), ("keep-awake-during-outgoing-sessions-label", "발신 세션 중 화면 켜짐 유지"),
("keep-awake-during-incoming-sessions-label", "수신 세션 중 화면 켜짐 유지"), ("keep-awake-during-incoming-sessions-label", "수신 세션 중 화면 켜짐 유지"),
("Continue with {}", "{}(으)로 계속"), ("Continue with {}", "{}(으)로 계속"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", ""), ("Continue with {}", ""),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Tęsti su {}"), ("Continue with {}", "Tęsti su {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Turpināt ar {}"), ("Continue with {}", "Turpināt ar {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Fortsett med {}"), ("Continue with {}", "Fortsett med {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", "Houd het scherm open tijdens de uitgaande sessies."), ("keep-awake-during-outgoing-sessions-label", "Houd het scherm open tijdens de uitgaande sessies."),
("keep-awake-during-incoming-sessions-label", "Houd het scherm open tijdens de inkomende sessies."), ("keep-awake-during-incoming-sessions-label", "Houd het scherm open tijdens de inkomende sessies."),
("Continue with {}", "Ga verder met {}"), ("Continue with {}", "Ga verder met {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", "Utrzymuj urządzenie w stanie aktywnym podczas sesji wychodzących"), ("keep-awake-during-outgoing-sessions-label", "Utrzymuj urządzenie w stanie aktywnym podczas sesji wychodzących"),
("keep-awake-during-incoming-sessions-label", "Utrzymuj urządzenie w stanie aktywnym podczas sesji przychodzących"), ("keep-awake-during-incoming-sessions-label", "Utrzymuj urządzenie w stanie aktywnym podczas sesji przychodzących"),
("Continue with {}", "Kontynuuj z {}"), ("Continue with {}", "Kontynuuj z {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", ""), ("Continue with {}", ""),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", "Manter tela ativa durante sessões de saída"), ("keep-awake-during-outgoing-sessions-label", "Manter tela ativa durante sessões de saída"),
("keep-awake-during-incoming-sessions-label", "Manter tela ativa durante sessões de entrada"), ("keep-awake-during-incoming-sessions-label", "Manter tela ativa durante sessões de entrada"),
("Continue with {}", "Continuar com {}"), ("Continue with {}", "Continuar com {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Continuă cu {}"), ("Continue with {}", "Continuă cu {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", "Не отключать экран во время исходящих сеансов"), ("keep-awake-during-outgoing-sessions-label", "Не отключать экран во время исходящих сеансов"),
("keep-awake-during-incoming-sessions-label", "Не отключать экран во время входящих сеансов"), ("keep-awake-during-incoming-sessions-label", "Не отключать экран во время входящих сеансов"),
("Continue with {}", "Продолжить с {}"), ("Continue with {}", "Продолжить с {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Sighi cun {}"), ("Continue with {}", "Sighi cun {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Pokračovať s {}"), ("Continue with {}", "Pokračovať s {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Nadaljuj z {}"), ("Continue with {}", "Nadaljuj z {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Vazhdo me {}"), ("Continue with {}", "Vazhdo me {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Nastavi sa {}"), ("Continue with {}", "Nastavi sa {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Fortsätt med {}"), ("Continue with {}", "Fortsätt med {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "{} உடன் தொடர்"), ("Continue with {}", "{} உடன் தொடர்"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", ""), ("Continue with {}", ""),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "ทำต่อด้วย {}"), ("Continue with {}", "ทำต่อด้วย {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", "Giden oturumlar süresince ekranıık tutun"), ("keep-awake-during-outgoing-sessions-label", "Giden oturumlar süresince ekranıık tutun"),
("keep-awake-during-incoming-sessions-label", "Gelen oturumlar süresince ekranıık tutun"), ("keep-awake-during-incoming-sessions-label", "Gelen oturumlar süresince ekranıık tutun"),
("Continue with {}", "{} ile devam et"), ("Continue with {}", "{} ile devam et"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", "在連出工作階段期間保持螢幕喚醒"), ("keep-awake-during-outgoing-sessions-label", "在連出工作階段期間保持螢幕喚醒"),
("keep-awake-during-incoming-sessions-label", "在連入工作階段期間保持螢幕喚醒"), ("keep-awake-during-incoming-sessions-label", "在連入工作階段期間保持螢幕喚醒"),
("Continue with {}", "使用 {} 登入"), ("Continue with {}", "使用 {} 登入"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Продовжити з {}"), ("Continue with {}", "Продовжити з {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -739,5 +739,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("keep-awake-during-outgoing-sessions-label", ""), ("keep-awake-during-outgoing-sessions-label", ""),
("keep-awake-during-incoming-sessions-label", ""), ("keep-awake-during-incoming-sessions-label", ""),
("Continue with {}", "Tiếp tục với {}"), ("Continue with {}", "Tiếp tục với {}"),
("Display Name", ""),
].iter().cloned().collect(); ].iter().cloned().collect();
} }

View File

@@ -358,6 +358,22 @@ function getUserName() {
return ''; return '';
} }
function getAccountLabelWithHandle() {
try {
var user = JSON.parse(handler.get_local_option("user_info"));
var username = (user.name || '').trim();
if (!username) {
return '';
}
var displayName = (user.display_name || '').trim();
if (!displayName || displayName == username) {
return username;
}
return displayName + " (@" + username + ")";
} catch(e) {}
return '';
}
// Shared dialog functions // Shared dialog functions
function open_custom_server_dialog() { function open_custom_server_dialog() {
var configOptions = handler.get_options(); var configOptions = handler.get_options();
@@ -493,7 +509,7 @@ class MyIdMenu: Reactor.Component {
} }
function renderPop() { function renderPop() {
var username = handler.get_local_option("access_token") ? getUserName() : ''; var accountLabel = handler.get_local_option("access_token") ? getAccountLabelWithHandle() : '';
return <popup> return <popup>
<menu.context #config-options> <menu.context #config-options>
{!disable_settings && <li #enable-keyboard><span>{svg_checkmark}</span>{translate('Enable keyboard/mouse')}</li>} {!disable_settings && <li #enable-keyboard><span>{svg_checkmark}</span>{translate('Enable keyboard/mouse')}</li>}
@@ -521,8 +537,8 @@ class MyIdMenu: Reactor.Component {
{!disable_settings && <DirectServer />} {!disable_settings && <DirectServer />}
{!disable_settings && false && handler.using_public_server() && <li #allow-always-relay><span>{svg_checkmark}</span>{translate('Always connect via relay')}</li>} {!disable_settings && false && handler.using_public_server() && <li #allow-always-relay><span>{svg_checkmark}</span>{translate('Always connect via relay')}</li>}
{!disable_change_id && handler.is_ok_change_id() ? <div .separator /> : ""} {!disable_change_id && handler.is_ok_change_id() ? <div .separator /> : ""}
{!disable_account && (username ? {!disable_account && (accountLabel ?
<li #logout>{translate('Logout')} ({username})</li> : <li #logout>{translate('Logout')} ({accountLabel})</li> :
<li #login>{translate('Login')}</li>)} <li #login>{translate('Login')}</li>)}
{!disable_change_id && !disable_settings && handler.is_ok_change_id() && key_confirmed && connect_status > 0 ? <li #change-id>{translate('Change ID')}</li> : ""} {!disable_change_id && !disable_settings && handler.is_ok_change_id() && key_confirmed && connect_status > 0 ? <li #change-id>{translate('Change ID')}</li> : ""}
<div .separator /> <div .separator />
@@ -1430,6 +1446,9 @@ checkConnectStatus();
function set_local_user_info(user) { function set_local_user_info(user) {
var user_info = {name: user.name}; var user_info = {name: user.name};
if (user.display_name) {
user_info.display_name = user.display_name;
}
if (user.status) { if (user.status) {
user_info.status = user.status; user_info.status = user.status;
} }