From ea6505f839a730b9bb14abe173d37b96c9a5c553 Mon Sep 17 00:00:00 2001 From: fuleyi Date: Tue, 3 Sep 2024 19:34:00 +0800 Subject: [PATCH] chore: Based on the professional path, change the interface style to the org.deepin.dde.MODE1 format. Based on the professional path, change the interface style to the org.deepin.dde.MODE1 format. Task: https://pms.uniontech.com/task-view-361181.html --- .gitignore | 12 +- .obs/workflows.yml | 44 + .reuse/dep5 | 2 +- .tx/config | 12 +- .tx/deepin.conf | 2 +- CHANGELOG.md | 6 +- Makefile | 125 +- {accounts => accounts1}/accounts.go | 2 +- {accounts => accounts1}/accounts_dbusutil.go | 103 +- .../checkers/checkers_test.go | 0 {accounts => accounts1}/checkers/common.go | 0 .../checkers/common_test.go | 0 {accounts => accounts1}/checkers/password.go | 0 .../checkers/testdata/passwd | 0 {accounts => accounts1}/checkers/username.go | 0 {accounts => accounts1}/deepinversion.go | 0 {accounts => accounts1}/deepinversion_test.go | 0 .../exported_methods_auto.go | 9 + {accounts => accounts1}/handle_event.go | 2 +- {accounts => accounts1}/image_blur.go | 6 +- {accounts => accounts1}/left_space.go | 0 .../logined/exported_methods_auto.go | 0 {accounts => accounts1}/logined/login.go | 8 +- {accounts => accounts1}/logined/user_info.go | 4 +- .../logined/user_info_test.go | 0 {accounts => accounts1}/manager.go | 10 +- {accounts => accounts1}/manager_ifc.go | 46 +- {accounts => accounts1}/reminder_info.c | 0 {accounts => accounts1}/reminder_info.go | 0 {accounts => accounts1}/reminder_info.h | 0 {accounts => accounts1}/testdata/keyboard_us | 0 .../testdata/keyboard_us_chr | 0 {accounts => accounts1}/testdata/locale | 0 {accounts => accounts1}/testdata/shells | 0 {accounts => accounts1}/user.go | 35 +- .../user_chpwd_union_id.go | 8 +- {accounts => accounts1}/user_created_time.go | 0 {accounts => accounts1}/user_ifc.go | 73 +- {accounts => accounts1}/user_test.go | 2 +- {accounts => accounts1}/users/common.go | 0 {accounts => accounts1}/users/common_test.go | 0 .../users/display_manager.go | 2 +- .../users/display_manager.org | 0 {accounts => accounts1}/users/guest.go | 0 {accounts => accounts1}/users/list.go | 0 {accounts => accounts1}/users/manager.go | 0 {accounts => accounts1}/users/passwd.c | 0 {accounts => accounts1}/users/passwd.go | 0 {accounts => accounts1}/users/passwd.h | 0 {accounts => accounts1}/users/prop.go | 0 .../users/testdata/adduser.conf | 0 .../users/testdata/adduser1.conf | 0 .../users/testdata/autologin/custom.conf | 0 .../testdata/autologin/custom_autologin.conf | 0 .../autologin/default-display-manager | 0 .../autologin/display-manager.service | 0 .../users/testdata/autologin/kdmrc | 0 .../users/testdata/autologin/kdmrc_autologin | 0 .../users/testdata/autologin/lightdm.conf | 0 .../users/testdata/autologin/lightdm.service | 0 .../testdata/autologin/lightdm_autologin.conf | 0 .../users/testdata/autologin/lxdm.conf | 0 .../testdata/autologin/lxdm_autologin.conf | 0 .../users/testdata/autologin/sddm.conf | 0 .../testdata/autologin/sddm_autologin.conf | 0 .../users/testdata/autologin/slim.conf | 0 .../testdata/autologin/slim_autologin.conf | 0 {accounts => accounts1}/users/testdata/group | 0 .../users/testdata/login.defs | 0 {accounts => accounts1}/users/testdata/passwd | 0 {accounts => accounts1}/users/testdata/shadow | 0 .../users/testdata/sudoers_arch | 0 .../users/testdata/sudoers_deepin | 0 {accounts => accounts1}/users/users_test.go | 0 {accounts => accounts1}/utils.go | 26 +- {accounts => accounts1}/utils_test.go | 2 +- appearance/README.md | 88 - appearance/appearance.go | 142 -- appearance/appearance_test.go | 90 - appearance/background/background.go | 325 ---- appearance/background/background_test.go | 48 - appearance/background/custom_wallpapers.go | 206 -- .../background/custom_wallpapers_test.go | 51 - appearance/background/list.go | 136 -- appearance/background/list_test.go | 75 - .../testdata/Theme1/wallpapers/desktop.jpg | Bin 682794 -> 0 bytes .../testdata/Theme2/wallpapers/README.md | 1 - .../testdata/fakeimages/empty/notimage.jpg | 0 .../testdata/fakeimages/fakeimage1.jpg | 1 - .../testdata/fakeimages/fakeimage2.jpg | 1 - appearance/cursor.c | 52 - appearance/cursor.h | 11 - appearance/deepin_qt_theme.go | 99 - appearance/exported_methods_auto.go | 80 - appearance/font_conf_version.go | 50 - appearance/font_conf_version_test.go | 15 - appearance/fonts/family.go | 199 -- appearance/fonts/family_cache.go | 111 -- appearance/fonts/font_list.c | 184 -- appearance/fonts/font_list.h | 25 - appearance/fonts/wrapper.go | 257 --- appearance/fsnotify.go | 169 -- appearance/fsnotify_test.go | 21 - appearance/handle_gsetting.go | 166 -- appearance/ifc.go | 319 --- appearance/listener.go | 19 - appearance/manager.go | 1714 ----------------- appearance/manager_test.go | 16 - appearance/scale.go | 94 - appearance/subthemes/themes.go | 211 -- appearance/sync_config.go | 309 --- appearance/testdata/fontVersionConf | 1 - appearance/theme_auto.go | 65 - appearance/theme_auto_test.go | 16 - appearance/wallpaper-slideshow.go | 257 --- {apps => apps1}/alrecorder.go | 14 +- {apps => apps1}/debug.go | 3 +- {apps => apps1}/dfwatcher.go | 2 +- {apps => apps1}/exported_methods_auto.go | 2 +- {apps => apps1}/file_event.go | 2 +- {apps => apps1}/fs_watcher.go | 2 +- {apps => apps1}/main.go | 2 +- {apps => apps1}/subrecorder.go | 13 +- {apps => apps1}/utils.go | 2 +- {apps => apps1}/utils_test.go | 2 +- {audio => audio1}/alsa.go | 70 +- {audio => audio1}/audio.go | 86 +- {audio => audio1}/audio_config.go | 4 +- {audio => audio1}/audio_dbusutil.go | 2 +- {audio => audio1}/audio_events.go | 12 +- {audio => audio1}/audio_test.go | 10 +- {audio => audio1}/bluez_audio.go | 22 +- {audio => audio1}/card.go | 4 +- {audio => audio1}/card_profile_workaround.go | 6 +- {audio => audio1}/card_test.go | 0 {audio => audio1}/config.go | 0 {audio => audio1}/config_keeper.go | 0 {audio => audio1}/config_keeper_test.go | 0 {audio => audio1}/config_test.go | 0 {audio => audio1}/exported_methods_auto.go | 0 {audio => audio1}/meter.go | 4 +- {audio => audio1}/module.go | 0 {audio => audio1}/port.go | 0 {audio => audio1}/port_test.go | 0 {audio => audio1}/priority_manager.go | 0 {audio => audio1}/priority_old.go | 40 +- {audio => audio1}/priority_policy.go | 15 +- {audio => audio1}/priority_test.go | 2 +- {audio => audio1}/profile.go | 0 {audio => audio1}/sink.go | 3 +- {audio => audio1}/sinkinput.go | 2 +- {audio => audio1}/source.go | 3 +- {audio => audio1}/sync_config.go | 4 +- {audio => audio1}/testdata/bluezAudio.json | 0 {audio => audio1}/util.go | 6 +- {audio => audio1}/util_test.go | 0 bin/backlight_helper/ddcci/ddcci.go | 8 +- bin/backlight_helper/ddcci/manager.go | 6 +- bin/backlight_helper/main.go | 8 +- bin/dde-authority/authority.go | 80 +- bin/dde-authority/exported_methods_auto.go | 5 + bin/dde-authority/fprint_transaction.go | 4 +- bin/dde-authority/main.go | 4 +- bin/dde-authority/pam_transaction.go | 2 +- bin/dde-authority/transaction.go | 2 +- bin/dde-greeter-setter/manager.go | 6 +- bin/dde-lockservice/livecd.go | 37 +- bin/dde-lockservice/manager.go | 8 +- bin/dde-session-daemon/daemon.go | 13 +- bin/dde-session-daemon/main.go | 12 +- bin/dde-session-daemon/module.go | 46 +- bin/dde-system-daemon/bluetooth.go | 2 +- bin/dde-system-daemon/gesture.go | 6 +- bin/dde-system-daemon/main.go | 42 +- bin/dde-system-daemon/network.go | 4 +- bin/dde-system-daemon/plymouth.go | 2 +- bin/dde-system-daemon/tty.go | 2 +- bin/dde-system-daemon/utils.go | 4 +- bin/dde-system-daemon/virtual.go | 10 +- bin/dde-system-daemon/wallpaper.go | 88 +- bin/default-file-manager/main.c | 35 - bin/default-file-manager/main.go | 105 + bin/default-terminal/main.go | 77 +- bin/langselector/main.go | 2 +- bin/search/ifc.go | 2 +- bin/search/main.go | 6 +- bin/soundeffect/main.go | 2 +- bin/theme-thumb-tool/main.go | 103 - bin/theme-thumb-tool/main_test.go | 43 - .../testdata/moveThumbFiles/source1/f1 | 0 bin/theme-thumb-tool/thumbnail.go | 126 -- bin/user-config/config_datas.go | 2 +- {bluetooth => bluetooth1}/adapter.go | 2 +- {bluetooth => bluetooth1}/agent.go | 96 +- {bluetooth => bluetooth1}/bluetooth.go | 19 +- .../bluetooth_dbusutil.go | 0 {bluetooth => bluetooth1}/bluetooth_ifc.go | 16 +- {bluetooth => bluetooth1}/bluez_profile.go | 2 +- {bluetooth => bluetooth1}/bluez_uuid.go | 0 {bluetooth => bluetooth1}/develop.md | 0 {bluetooth => bluetooth1}/device.go | 2 +- {bluetooth => bluetooth1}/doc.go | 0 .../exported_methods_auto.go | 0 {bluetooth => bluetooth1}/init.go | 2 +- {bluetooth => bluetooth1}/main.go | 0 {bluetooth => bluetooth1}/obex_agent.go | 7 +- {bluetooth => bluetooth1}/utils.go | 0 {bluetooth => bluetooth1}/utils_notify.go | 4 +- {bluetooth => bluetooth1}/utils_test.go | 0 {clipboard => clipboard1}/clipboard_test.go | 2 +- {clipboard => clipboard1}/event_captor.go | 0 .../exported_methods_auto.go | 0 {clipboard => clipboard1}/manager.go | 83 +- {clipboard => clipboard1}/manager_debug.go | 2 +- {clipboard => clipboard1}/manager_test.go | 2 +- {clipboard => clipboard1}/mocks/XClient.go | 0 {clipboard => clipboard1}/module.go | 7 +- {clipboard => clipboard1}/util.go | 0 {clipboard => clipboard1}/x_client.go | 0 common/bluetooth/bluetooth.go | 4 +- common/dconfig/dconfig.go | 2 +- common/dsync/dsync.go | 4 +- common/sessionmsg/sessionmsg.go | 6 +- dbus/accounts.go | 4 +- dbus/dbus.go | 2 +- debian/changelog | 12 + debian/control | 1 - debian/rules | 9 +- debug/debug.go | 2 +- dock/app_entries.go | 219 --- dock/app_entry.go | 330 ---- dock/app_entry_ifc.go | 276 --- dock/app_entry_menu.go | 247 --- dock/app_info.go | 176 -- dock/bamf.go | 36 - dock/daemon.go | 102 - dock/desktop_file_path.go | 91 - dock/desktop_file_path_test.go | 75 - dock/dock_dbusutil.go | 111 -- dock/dock_manager.go | 592 ------ dock/dock_manager_dock_app.go | 230 --- dock/dock_manager_entries.go | 187 -- dock/dock_manager_hide_state.go | 387 ---- dock/dock_manager_hide_state_test.go | 30 - dock/dock_manager_init.go | 361 ---- dock/dock_manager_xevent.go | 436 ----- dock/exported_methods_auto.go | 170 -- dock/identify_window.go | 638 ------ dock/identify_window_pattern.go | 311 --- dock/init.go | 113 -- dock/kwindow_info.go | 315 --- dock/menu.go | 105 - dock/menu_test.go | 50 - dock/plugin_settings.go | 136 -- dock/process_info.go | 142 -- dock/sync_config.go | 123 -- dock/testdata/firefox.desktop | 223 --- dock/types.go | 114 -- dock/util.go | 123 -- dock/util_test.go | 38 - dock/window_info.go | 451 ----- dock/window_infos.go | 37 - dock/window_infos_test.go | 52 - dock/window_slice.go | 62 - dock/window_slice_test.go | 26 - dock/wl_manager.go | 281 --- dock/xutils.go | 661 ------- docs/aireplane-mode.md | 4 +- docs/authority.md | 14 +- docs/calendar/ifc.md | 6 +- docs/service_trigger.md | 8 +- docs/session-power.md | 4 +- {fprintd => fprintd1}/common/common.go | 6 +- {fprintd => fprintd1}/device.go | 10 +- .../exported_methods_auto.go | 2 +- {fprintd => fprintd1}/fprintd.go | 4 +- {fprintd => fprintd1}/fprintd_dbusutil.go | 4 +- {fprintd => fprintd1}/huawei_device.go | 10 +- {fprintd => fprintd1}/manager.go | 16 +- gesture/config_test.go | 109 -- {gesture => gesture1}/built-in.go | 2 +- {gesture => gesture1}/config.go | 2 +- gesture1/config_test.go | 109 ++ {gesture => gesture1}/daemon.go | 8 +- .../exported_methods_auto.go | 2 +- {gesture => gesture1}/manager.go | 31 +- {gesture => gesture1}/manager_ifc.go | 4 +- {gesture => gesture1}/testdata/gesture | 4 +- {gesture => gesture1}/utils.go | 6 +- {gesture => gesture1}/utils_test.go | 4 +- go.mod | 47 + go.sum | 144 ++ grub2/edit_auth_ifc.go | 2 +- grub2/fstart_ifc.go | 6 +- grub2/grub2.go | 6 +- grub2/grub2_ifc.go | 12 +- grub2/inhibitor.go | 4 +- grub2/theme_ifc.go | 2 +- grub2/utils.go | 4 +- grub_gfx/main.go | 10 +- housekeeping/init.go | 63 +- .../exported_methods_auto.go | 0 .../image_effect.go | 6 +- {image_effect => image_effect1}/module.go | 2 +- {image_effect => image_effect1}/utils.go | 0 inputdevices/stub.go | 48 - .../app_layout_config.go | 0 .../exported_methods_auto.go | 0 .../handle_gsettings.go | 0 {inputdevices => inputdevices1}/ifc.go | 4 +- .../inputdevices.go | 0 .../inputdevices_dbusutil.go | 0 .../inputdevices_test.go | 0 .../iso639/auto.go | 0 .../iso639/iso639.go | 0 {inputdevices => inputdevices1}/keyboard.go | 4 +- {inputdevices => inputdevices1}/kwayland.go | 5 +- .../layout_list.go | 2 +- {inputdevices => inputdevices1}/listen.c | 0 {inputdevices => inputdevices1}/listen.h | 0 {inputdevices => inputdevices1}/manager.go | 2 +- {inputdevices => inputdevices1}/mouse.go | 0 inputdevices1/stub.go | 48 + .../sync_config.go | 0 .../testdata/base.xml | 0 .../testdata/dde-desktop-cmdline | Bin .../testdata/keyboard | 0 .../testdata/syndaemon.pid | 0 .../testdata/users.ini | 0 {inputdevices => inputdevices1}/touchpad.go | 8 +- {inputdevices => inputdevices1}/trackpoint.go | 0 {inputdevices => inputdevices1}/utils.go | 0 {inputdevices => inputdevices1}/utils_test.go | 0 {inputdevices => inputdevices1}/wacom.go | 2 +- {inputdevices => inputdevices1}/wm_wrapper.go | 0 {inputdevices => inputdevices1}/wrapper.go | 2 +- .../audio_controller.go | 8 +- {keybinding => keybinding1}/config.go | 0 {keybinding => keybinding1}/daemon.go | 4 +- .../display_controller.go | 11 +- .../exported_methods_auto.go | 5 + {keybinding => keybinding1}/huawei_mic.go | 2 +- .../kbd_light_controller.go | 4 +- {keybinding => keybinding1}/lock_state.go | 6 +- {keybinding => keybinding1}/manager.go | 226 ++- .../manager_handlers.go | 2 +- {keybinding => keybinding1}/manager_ifc.go | 29 +- .../manager_ifc_deprecated.go | 4 +- .../media_player_controller.go | 10 +- .../select_keystroke.go | 2 +- .../shortcuts/action.go | 0 .../shortcuts/custom_shortcut.go | 8 +- .../shortcuts/gsettings_shortcut.go | 2 +- .../shortcuts/id_name_map.go | 108 +- {keybinding => keybinding1}/shortcuts/key.go | 0 .../shortcuts/keystroke.go | 0 .../shortcuts/keystroke_test.go | 0 .../shortcuts/kwin_shortcut.go | 4 +- .../shortcuts/media_shortcut.go | 4 +- .../shortcuts/shortcut.go | 2 +- .../shortcuts/shortcut_manager.go | 16 +- .../shortcuts/shortcut_manager_test.go | 0 .../shortcuts/system_shortcut.go | 10 +- .../shortcuts/xrecord_event_handler.go | 0 .../shortcuts/xrecord_event_handler_test.go | 0 .../special_keycode.go | 25 +- {keybinding => keybinding1}/testdata/hotkey | 0 .../testdata/hotkey_disable | 0 .../touchpad_controller.go | 6 +- {keybinding => keybinding1}/util/util.go | 4 +- {keybinding => keybinding1}/utils.go | 14 +- {keybinding => keybinding1}/utils_test.go | 0 .../exported_methods_auto.go | 0 .../langselector_dbusutil.go | 0 {langselector => langselector1}/locale.go | 18 +- {langselector => langselector1}/locale_ifc.go | 8 +- .../locale_test.go | 0 {langselector => langselector1}/main.go | 2 +- .../testdata/pam_environment | 0 .../testdata/support_languages.json | 0 {lastore => lastore1}/agent.go | 10 +- {lastore => lastore1}/agent_ifc.go | 6 +- {lastore => lastore1}/daemon.go | 14 +- .../exported_methods_auto.go | 0 {lastore => lastore1}/lastore.go | 10 +- {lastore => lastore1}/sync_config.go | 2 +- {lastore => lastore1}/tools.go | 0 {lastore => lastore1}/tools_test.go | 0 launcher/manager.go | 12 +- launcher/manager_ifc.go | 4 +- launcher/manager_uninstall.go | 2 +- loader/module.go | 2 +- mime/manager.go | 2 +- misc/conf/com.deepin.daemon.Daemon.conf | 28 - misc/conf/com.deepin.daemon.Fprintd.conf | 18 - .../com.deepin.daemon.SwapSchedHelper.conf | 19 - misc/conf/com.deepin.daemon.Timedated.conf | 26 - .../com.deepin.daemon.helper.Backlight.conf | 26 - misc/conf/com.deepin.system.Bluetooth.conf | 31 - ...ter.conf => org.deepin.dde.Accounts1.conf} | 14 +- ...conf => org.deepin.dde.AirplaneMode1.conf} | 4 +- ...on.Apps.conf => org.deepin.dde.Apps1.conf} | 4 +- ...ty.conf => org.deepin.dde.Authority1.conf} | 10 +- ...f => org.deepin.dde.BacklightHelper1.conf} | 18 +- misc/conf/org.deepin.dde.Bluetooth1.conf | 31 + misc/conf/org.deepin.dde.Daemon1.conf | 28 + ...play.conf => org.deepin.dde.Display1.conf} | 12 +- misc/conf/org.deepin.dde.Fprintd1.conf | 18 + ...ture.conf => org.deepin.dde.Gesture1.conf} | 12 +- ...unts.conf => org.deepin.dde.Greeter1.conf} | 14 +- ...n.Grub2.conf => org.deepin.dde.Grub2.conf} | 4 +- ...es.conf => org.deepin.dde.ImageBlur1.conf} | 4 +- ....conf => org.deepin.dde.ImageEffect1.conf} | 4 +- misc/conf/org.deepin.dde.InputDevices1.conf | 18 + ...ent.conf => org.deepin.dde.KeyEvent1.conf} | 12 +- ....conf => org.deepin.dde.LockService1.conf} | 12 +- ...work.conf => org.deepin.dde.Network1.conf} | 12 +- ....Power.conf => org.deepin.dde.Power1.conf} | 20 +- misc/conf/org.deepin.dde.PowerManager1.conf | 28 + ...f => org.deepin.dde.SwapSchedHelper1.conf} | 5 +- misc/conf/org.deepin.dde.SystemInfo1.conf | 18 + misc/conf/org.deepin.dde.Timedate1.conf | 26 + ...on.Uadp.conf => org.deepin.dde.Uadp1.conf} | 12 +- misc/dde-daemon/gesture.json | 4 +- .../dde-daemon/keybinding/system_actions.json | 20 +- .../org.deepin.dde.daemon.audio.json | 11 + .../org.deepin.dde.daemon.keybinding.json | 10 + .../com.deepin.daemon.airplane-mode.policy | 19 - ...y.in => org.deepin.dde.Fprintd1.policy.in} | 8 +- ...licy.in => org.deepin.dde.Grub2.policy.in} | 4 +- ....in => org.deepin.dde.accounts1.policy.in} | 38 +- ...unts.pkla => org.deepin.dde.accounts.pkla} | 2 +- ...rintd.pkla => org.deepin.dde.fprintd.pkla} | 0 ...n.Grub2.pkla => org.deepin.dde.grub2.pkla} | 2 +- misc/scripts/dde-lock.sh | 3 + .../dde-system-daemon-power-refresh.sh | 2 +- .../com.deepin.LastoreSessionHelper.service | 4 - .../com.deepin.api.XEventMonitor.service | 3 - .../com.deepin.daemon.Appearance.service | 3 - misc/services/com.deepin.daemon.Audio.service | 3 - .../com.deepin.daemon.Bluetooth.service | 3 - .../com.deepin.daemon.EventLog.service | 3 - .../com.deepin.daemon.InputDevices.service | 3 - .../com.deepin.daemon.Keybinding.service | 3 - misc/services/com.deepin.daemon.Mime.service | 3 - .../com.deepin.daemon.Network.service | 3 - misc/services/com.deepin.daemon.Power.service | 3 - .../com.deepin.daemon.SessionWatcher.service | 3 - .../com.deepin.daemon.SystemInfo.service | 3 - .../com.deepin.daemon.Timedate.service | 3 - misc/services/com.deepin.daemon.Zone.service | 3 - .../com.deepin.dde.daemon.Dock.service | 3 - .../com.deepin.dde.daemon.Launcher.service | 3 - misc/services/org.deepin.dde.Audio1.service | 4 + .../org.deepin.dde.Bluetooth1.service | 4 + .../org.deepin.dde.InputDevices1.service | 4 + .../org.deepin.dde.Keybinding1.service | 4 + ...e => org.deepin.dde.LangSelector1.service} | 2 +- ...g.deepin.dde.LastoreSessionHelper1.service | 4 + misc/services/org.deepin.dde.Network1.service | 4 + misc/services/org.deepin.dde.Power1.service | 4 + ...service => org.deepin.dde.Search1.service} | 2 +- .../org.deepin.dde.SessionWatcher1.service | 4 + ...ce => org.deepin.dde.SoundEffect1.service} | 2 +- .../org.deepin.dde.SystemInfo1.service | 4 + .../services/org.deepin.dde.Timedate1.service | 4 + .../org.deepin.dde.XEventMonitor1.service | 4 + misc/services/org.deepin.dde.Zone1.service | 4 + .../com.deepin.daemon.Accounts.service | 5 - .../com.deepin.daemon.AirplaneMode.service | 4 - .../com.deepin.daemon.Apps.service | 4 - .../com.deepin.daemon.Authority.service | 4 - .../com.deepin.daemon.Daemon.service | 4 - .../com.deepin.daemon.Fprintd.service | 4 - .../com.deepin.daemon.Gesture.service | 4 - .../com.deepin.daemon.Greeter.service | 4 - .../com.deepin.daemon.Grub2.service | 4 - .../com.deepin.daemon.ImageEffect.service | 4 - .../com.deepin.daemon.SwapSchedHelper.service | 4 - .../com.deepin.daemon.Timedated.service | 4 - .../com.deepin.daemon.Uadp.service | 4 - ...com.deepin.daemon.helper.Backlight.service | 4 - .../com.deepin.dde.LockService.service | 4 - .../com.deepin.system.Bluetooth.service | 4 - .../com.deepin.system.Display.service | 4 - .../com.deepin.system.Network.service | 4 - .../com.deepin.system.Power.service | 4 - .../org.deepin.dde.Accounts1.service | 4 + .../org.deepin.dde.AirplaneMode1.service | 4 + .../org.deepin.dde.Apps1.service | 4 + .../org.deepin.dde.Authority1.service | 4 + .../org.deepin.dde.BacklightHelper1.service | 5 + .../org.deepin.dde.Bluetooth1.service | 4 + .../org.deepin.dde.Daemon1.service | 4 + .../org.deepin.dde.Display1.service | 4 + .../org.deepin.dde.Fprintd1.service | 4 + .../org.deepin.dde.Gesture1.service | 4 + .../org.deepin.dde.Greeter1.service | 4 + .../org.deepin.dde.Grub2.service | 4 + .../org.deepin.dde.ImageEffect1.service | 4 + .../org.deepin.dde.LockService1.service | 5 + .../org.deepin.dde.Network1.service | 4 + .../org.deepin.dde.Power1.service | 4 + .../org.deepin.dde.SwapSchedHelper1.service | 4 + .../org.deepin.dde.Timedate1.service | 4 + .../org.deepin.dde.Uadp1.service | 4 + .../system/deepin-accounts1-daemon.service | 27 + .../services/system/deepin-authority.service | 36 + .../system/deepin-greeter-setter.service | 36 + .../services/system/deepin-grub2.service | 44 + .../system/deepin-helper-backlight.service | 37 + .../services/system/deepin-user-lock.service | 39 + .../user/org.dde.session.Daemon1.service | 20 + .../deepin-accounts1-daemon.service} | 7 +- .../policy_ady.ts | 25 - .../policy_af_ZA.ts | 25 - .../policy_am_ET.ts | 25 - .../policy_ar_EG.ts | 25 - .../policy_ast.ts | 25 - .../policy_az.ts | 25 - .../policy_bqi.ts | 25 - .../policy_ca.ts | 25 - .../policy_cgg.ts | 25 - .../policy_de_CH.ts | 25 - .../policy_de_DE.ts | 25 - .../policy_el_GR.ts | 25 - .../policy_en_AU.ts | 25 - .../policy_en_GB.ts | 25 - .../policy_en_NO.ts | 25 - .../policy_en_US.ts | 25 - .../policy_es.ts | 25 - .../policy_fi.ts | 25 - .../policy_fil.ts | 25 - .../policy_gl_ES.ts | 25 - .../policy_hi_IN.ts | 25 - .../policy_id_ID.ts | 25 - .../policy_kab.ts | 25 - .../policy_km_KH.ts | 25 - .../policy_kn_IN.ts | 25 - .../policy_ku_IQ.ts | 25 - .../policy_ky@Arab.ts | 25 - .../policy_pam.ts | 25 - .../policy_pt_BR.ts | 25 - .../policy_ru_UA.ts | 25 - .../policy_sv_SE.ts | 25 - .../policy_tzm.ts | 25 - .../policy_ug.ts | 25 - .../policy_uk.ts | 25 - .../policy.ts | 16 +- .../policy_ady.ts | 16 +- .../policy_af.ts | 16 +- .../policy_af_ZA.ts | 16 +- .../policy_ak.ts | 16 +- .../policy_am.ts | 16 +- .../policy_am_ET.ts | 16 +- .../policy_ar.ts | 16 +- .../policy_ar_EG.ts | 16 +- .../policy_ast.ts | 16 +- .../policy_az.ts | 16 +- .../policy_bg.ts | 16 +- .../policy_bn.ts | 16 +- .../policy_bo.ts | 16 +- .../policy_bqi.ts | 16 +- .../policy_br.ts | 16 +- .../policy_ca.ts | 16 +- .../policy_cgg.ts | 16 +- .../policy_cs.ts | 16 +- .../policy_da.ts | 16 +- .../policy_de.ts | 16 +- .../policy_de_CH.ts | 16 +- .../policy_de_DE.ts | 16 +- .../policy_el.ts | 16 +- .../policy_el_GR.ts | 16 +- .../policy_en_AU.ts | 16 +- .../policy_en_GB.ts | 16 +- .../policy_en_NO.ts | 16 +- .../policy_en_US.ts | 16 +- .../policy_eo.ts | 16 +- .../policy_es.ts | 16 +- .../policy_es_MX.ts | 16 +- .../policy_et.ts | 16 +- .../policy_eu.ts | 16 +- .../policy_fa.ts | 16 +- .../policy_fi.ts | 16 +- .../policy_fil.ts | 16 +- .../policy_fr.ts | 16 +- .../policy_gl.ts | 16 +- .../policy_gl_ES.ts | 16 +- .../policy_he.ts | 16 +- .../policy_hi_IN.ts | 16 +- .../policy_hr.ts | 16 +- .../policy_hu.ts | 16 +- .../policy_hy.ts | 16 +- .../policy_id.ts | 16 +- .../policy_id_ID.ts | 16 +- .../policy_it.ts | 16 +- .../policy_ja.ts | 16 +- .../policy_ka.ts | 16 +- .../policy_kab.ts | 16 +- .../policy_kk.ts | 16 +- .../policy_km_KH.ts | 16 +- .../policy_kn_IN.ts | 16 +- .../policy_ko.ts | 16 +- .../policy_ku.ts | 16 +- .../policy_ku_IQ.ts | 16 +- .../policy_ky.ts | 16 +- .../policy_ky@Arab.ts | 16 +- .../policy_la.ts | 16 +- .../policy_lo.ts | 16 +- .../policy_lt.ts | 16 +- .../policy_lv.ts | 16 +- .../policy_ml.ts | 16 +- .../policy_mn.ts | 16 +- .../policy_mr.ts | 16 +- .../policy_ms.ts | 16 +- .../policy_nb.ts | 16 +- .../policy_ne.ts | 16 +- .../policy_nl.ts | 16 +- .../policy_pa.ts | 16 +- .../policy_pam.ts | 16 +- .../policy_pl.ts | 16 +- .../policy_ps.ts | 16 +- .../policy_pt.ts | 16 +- .../policy_pt_BR.ts | 16 +- .../policy_qu.ts | 45 + .../policy_ro.ts | 16 +- .../policy_ru.ts | 16 +- .../policy_ru_UA.ts | 16 +- .../policy_sc.ts | 16 +- .../policy_si.ts | 16 +- .../policy_sk.ts | 16 +- .../policy_sl.ts | 16 +- .../policy_sq.ts | 16 +- .../policy_sr.ts | 16 +- .../policy_sv.ts | 16 +- .../policy_sv_SE.ts | 16 +- .../policy_sw.ts | 16 +- .../policy_ta.ts | 16 +- .../policy_te.ts | 16 +- .../policy_th.ts | 16 +- .../policy_tr.ts | 16 +- .../policy_tzm.ts | 16 +- .../policy_ug.ts | 16 +- .../policy_uk.ts | 16 +- .../policy_ur.ts | 16 +- .../policy_uz.ts | 16 +- .../policy_vi.ts | 16 +- .../policy_zh_CN.ts | 16 +- .../policy_zh_HK.ts | 16 +- .../policy_zh_TW.ts | 16 +- .../policy.ts | 8 +- .../org.deepin.dde.Grub2.policy/policy_ady.ts | 25 + .../policy_af.ts | 10 +- .../policy_af_ZA.ts | 25 + .../policy_ak.ts | 10 +- .../policy_am.ts | 10 +- .../policy_am_ET.ts | 25 + .../policy_ar.ts | 10 +- .../policy_ar_EG.ts | 25 + .../org.deepin.dde.Grub2.policy/policy_ast.ts | 25 + .../org.deepin.dde.Grub2.policy/policy_az.ts | 25 + .../policy_bg.ts | 10 +- .../policy_bn.ts | 10 +- .../policy_bo.ts | 8 +- .../org.deepin.dde.Grub2.policy/policy_bqi.ts | 25 + .../policy_br.ts | 10 +- .../org.deepin.dde.Grub2.policy/policy_ca.ts | 25 + .../org.deepin.dde.Grub2.policy/policy_cgg.ts | 25 + .../policy_cs.ts | 10 +- .../policy_da.ts | 10 +- .../policy_de.ts | 10 +- .../policy_de_CH.ts | 25 + .../policy_de_DE.ts | 25 + .../policy_el.ts | 10 +- .../policy_el_GR.ts | 25 + .../policy_en_AU.ts | 25 + .../policy_en_GB.ts | 25 + .../policy_en_NO.ts | 25 + .../policy_en_US.ts | 25 + .../policy_eo.ts | 10 +- .../org.deepin.dde.Grub2.policy/policy_es.ts | 25 + .../policy_es_419.ts | 8 +- .../policy_es_MX.ts | 8 +- .../policy_et.ts | 10 +- .../policy_eu.ts | 10 +- .../policy_fa.ts | 10 +- .../org.deepin.dde.Grub2.policy/policy_fi.ts | 25 + .../org.deepin.dde.Grub2.policy/policy_fil.ts | 25 + .../policy_fr.ts | 10 +- .../policy_gl.ts | 10 +- .../policy_gl_ES.ts | 25 + .../policy_he.ts | 10 +- .../policy_hi_IN.ts | 25 + .../policy_hr.ts | 10 +- .../policy_hu.ts | 8 +- .../policy_hy.ts | 10 +- .../policy_id.ts | 10 +- .../policy_id_ID.ts | 25 + .../policy_it.ts | 10 +- .../policy_ja.ts | 10 +- .../policy_ka.ts | 10 +- .../org.deepin.dde.Grub2.policy/policy_kab.ts | 25 + .../policy_kk.ts | 10 +- .../policy_km_KH.ts | 25 + .../policy_kn_IN.ts | 25 + .../policy_ko.ts | 10 +- .../policy_ku.ts | 10 +- .../policy_ku_IQ.ts | 25 + .../policy_ky.ts | 10 +- .../policy_ky@Arab.ts | 25 + .../policy_la.ts | 10 +- .../policy_lo.ts | 10 +- .../policy_lt.ts | 10 +- .../policy_lv.ts | 10 +- .../policy_ml.ts | 10 +- .../policy_mn.ts | 10 +- .../policy_mr.ts | 10 +- .../policy_ms.ts | 10 +- .../policy_nb.ts | 10 +- .../policy_ne.ts | 10 +- .../policy_nl.ts | 8 +- .../policy_pa.ts | 10 +- .../org.deepin.dde.Grub2.policy/policy_pam.ts | 25 + .../policy_pl.ts | 8 +- .../policy_ps.ts | 10 +- .../policy_pt.ts | 10 +- .../policy_pt_BR.ts | 25 + .../org.deepin.dde.Grub2.policy/policy_qu.ts | 25 + .../policy_ro.ts | 10 +- .../policy_ru.ts | 10 +- .../policy_ru_UA.ts | 25 + .../policy_sc.ts | 10 +- .../policy_si.ts | 10 +- .../policy_sk.ts | 10 +- .../policy_sl.ts | 10 +- .../policy_sq.ts | 8 +- .../policy_sr.ts | 10 +- .../policy_sv.ts | 10 +- .../policy_sv_SE.ts | 25 + .../policy_sw.ts | 10 +- .../policy_ta.ts | 10 +- .../policy_te.ts | 10 +- .../policy_th.ts | 10 +- .../policy_tr.ts | 10 +- .../org.deepin.dde.Grub2.policy/policy_tzm.ts | 25 + .../org.deepin.dde.Grub2.policy/policy_ug.ts | 25 + .../org.deepin.dde.Grub2.policy/policy_uk.ts | 25 + .../policy_ur.ts | 10 +- .../policy_uz.ts | 10 +- .../policy_vi.ts | 10 +- .../policy_zh_CN.ts | 8 +- .../policy_zh_HK.ts | 8 +- .../policy_zh_TW.ts | 8 +- .../policy.ts | 56 +- .../policy_ady.ts | 56 +- .../policy_af.ts | 56 +- .../policy_af_ZA.ts | 56 +- .../policy_ak.ts | 56 +- .../policy_am.ts | 56 +- .../policy_am_ET.ts | 56 +- .../policy_ar.ts | 56 +- .../policy_ar_EG.ts | 56 +- .../policy_ast.ts | 56 +- .../policy_az.ts | 56 +- .../policy_bg.ts | 56 +- .../policy_bn.ts | 56 +- .../policy_bo.ts | 56 +- .../policy_bqi.ts | 56 +- .../policy_br.ts | 56 +- .../policy_ca.ts | 56 +- .../policy_cgg.ts | 56 +- .../policy_cs.ts | 56 +- .../policy_da.ts | 56 +- .../policy_de.ts | 56 +- .../policy_de_CH.ts | 56 +- .../policy_de_DE.ts | 56 +- .../policy_el.ts | 56 +- .../policy_el_GR.ts | 56 +- .../policy_en_AU.ts | 56 +- .../policy_en_GB.ts | 56 +- .../policy_en_NO.ts | 56 +- .../policy_en_US.ts | 56 +- .../policy_eo.ts | 56 +- .../policy_es.ts | 56 +- .../policy_es_419.ts | 28 +- .../policy_es_MX.ts | 28 +- .../policy_et.ts | 56 +- .../policy_eu.ts | 56 +- .../policy_fa.ts | 56 +- .../policy_fi.ts | 56 +- .../policy_fil.ts | 56 +- .../policy_fr.ts | 56 +- .../policy_gl.ts | 56 +- .../policy_gl_ES.ts | 56 +- .../policy_he.ts | 56 +- .../policy_hi_IN.ts | 56 +- .../policy_hr.ts | 56 +- .../policy_hu.ts | 56 +- .../policy_hy.ts | 56 +- .../policy_id.ts | 56 +- .../policy_id_ID.ts | 56 +- .../policy_it.ts | 56 +- .../policy_ja.ts | 56 +- .../policy_ka.ts | 56 +- .../policy_kab.ts | 56 +- .../policy_kk.ts | 56 +- .../policy_km_KH.ts | 56 +- .../policy_kn_IN.ts | 56 +- .../policy_ko.ts | 56 +- .../policy_ku.ts | 56 +- .../policy_ku_IQ.ts | 56 +- .../policy_ky.ts | 56 +- .../policy_ky@Arab.ts | 56 +- .../policy_la.ts | 56 +- .../policy_lo.ts | 56 +- .../policy_lt.ts | 56 +- .../policy_lv.ts | 56 +- .../policy_ml.ts | 56 +- .../policy_mn.ts | 56 +- .../policy_mr.ts | 56 +- .../policy_ms.ts | 56 +- .../policy_nb.ts | 56 +- .../policy_ne.ts | 56 +- .../policy_nl.ts | 56 +- .../policy_pa.ts | 56 +- .../policy_pam.ts | 56 +- .../policy_pl.ts | 56 +- .../policy_ps.ts | 56 +- .../policy_pt.ts | 56 +- .../policy_pt_BR.ts | 64 +- .../policy_qu.ts | 115 ++ .../policy_ro.ts | 56 +- .../policy_ru.ts | 56 +- .../policy_ru_UA.ts | 56 +- .../policy_sc.ts | 56 +- .../policy_si.ts | 56 +- .../policy_sk.ts | 56 +- .../policy_sl.ts | 56 +- .../policy_sq.ts | 56 +- .../policy_sr.ts | 56 +- .../policy_sv.ts | 56 +- .../policy_sv_SE.ts | 56 +- .../policy_sw.ts | 56 +- .../policy_ta.ts | 56 +- .../policy_te.ts | 56 +- .../policy_th.ts | 56 +- .../policy_tr.ts | 56 +- .../policy_tzm.ts | 56 +- .../policy_ug.ts | 56 +- .../policy_uk.ts | 56 +- .../policy_ur.ts | 56 +- .../policy_uz.ts | 56 +- .../policy_vi.ts | 56 +- .../policy_zh_CN.ts | 56 +- .../policy_zh_HK.ts | 56 +- .../policy_zh_TW.ts | 56 +- misc/udev-rules/80-deepin-fprintd.rules | 2 +- {network => network1}/README.md | 24 +- {network => network1}/decode_ssid.go | 0 .../examples/python/README.md | 0 .../dbus_gen/com_deepin_daemon_Network.py | 4 +- ...deepin_daemon_Network_ConnectionSession.py | 0 .../dbus_gen/dbus_dde_daemon_network.xml | 2 +- ...s_dde_daemon_network_connectionsession.xml | 0 .../examples/python/gen_dbus_code.sh | 10 +- {network => network1}/examples/python/main.py | 4 +- .../examples/python/utils_dbus.py | 2 +- .../examples/set_wired_static_ip.sh | 4 +- .../exported_methods_auto.go | 0 {network => network1}/manager.go | 52 +- {network => network1}/manager_accesspoint.go | 10 +- {network => network1}/manager_active_conn.go | 8 +- {network => network1}/manager_connection.go | 6 +- {network => network1}/manager_dbusutil.go | 0 {network => network1}/manager_device.go | 33 +- {network => network1}/manager_ip_conflict.go | 8 +- {network => network1}/manager_proxy.go | 2 +- {network => network1}/manager_stub.go | 4 +- {network => network1}/module.go | 4 +- {network => network1}/nm/README.md | 0 {network => network1}/nm/nm_consts_gen.go | 0 {network => network1}/nm/nm_extends_consts.go | 0 {network => network1}/nm_custom_type.go | 2 +- {network => network1}/nm_generator/Makefile | 0 {network => network1}/nm_generator/README.md | 0 .../nm_generator/gen_nm_consts.py | 0 {network => network1}/nm_generator/main.go | 0 .../nm_generator/nm_consts_gen.yml | 0 .../nm_generator/nm_consts_keys_override.yml | 0 .../nm_docs/NetworkManager.conf.html | 0 .../nm_docs/NetworkManager.devhelp2 | 0 .../nm_generator/nm_docs/NetworkManager.html | 0 .../nm_generator/nm_docs/dbus-types.html | 0 ...reedesktop.NetworkManager.AccessPoint.html | 0 ...eedesktop.NetworkManager.AgentManager.html | 0 ...ktop.NetworkManager.Connection.Active.html | 0 ...reedesktop.NetworkManager.DHCP4Config.html | 0 ...reedesktop.NetworkManager.DHCP6Config.html | 0 ...reedesktop.NetworkManager.Device.Adsl.html | 0 ...sktop.NetworkManager.Device.Bluetooth.html | 0 ...reedesktop.NetworkManager.Device.Bond.html | 0 ...edesktop.NetworkManager.Device.Bridge.html | 0 ...desktop.NetworkManager.Device.Generic.html | 0 ...esktop.NetworkManager.Device.IPTunnel.html | 0 ...ktop.NetworkManager.Device.Infiniband.html | 0 ...desktop.NetworkManager.Device.Macvlan.html | 0 ...eedesktop.NetworkManager.Device.Modem.html | 0 ...esktop.NetworkManager.Device.OlpcMesh.html | 0 ...ktop.NetworkManager.Device.Statistics.html | 0 ...reedesktop.NetworkManager.Device.Team.html | 0 ...freedesktop.NetworkManager.Device.Tun.html | 0 ...reedesktop.NetworkManager.Device.Veth.html | 0 ...reedesktop.NetworkManager.Device.Vlan.html | 0 ...eedesktop.NetworkManager.Device.Vxlan.html | 0 ...eedesktop.NetworkManager.Device.WiMax.html | 0 ...eedesktop.NetworkManager.Device.Wired.html | 0 ...esktop.NetworkManager.Device.Wireless.html | 0 ...org.freedesktop.NetworkManager.Device.html | 0 ....freedesktop.NetworkManager.IP4Config.html | 0 ....freedesktop.NetworkManager.IP6Config.html | 0 ...us-org.freedesktop.NetworkManager.PPP.html | 0 ...reedesktop.NetworkManager.SecretAgent.html | 0 ...op.NetworkManager.Settings.Connection.html | 0 ...g.freedesktop.NetworkManager.Settings.html | 0 ...desktop.NetworkManager.VPN.Connection.html | 0 ...freedesktop.NetworkManager.VPN.Plugin.html | 0 .../gdbus-org.freedesktop.NetworkManager.html | 0 .../nm_generator/nm_docs/home.png | Bin .../nm_generator/nm_docs/index.html | 0 .../nm_generator/nm_docs/ix01.html | 0 .../nm_generator/nm_docs/left-insensitive.png | Bin .../nm_generator/nm_docs/left.png | Bin .../nm_generator/nm_docs/license.html | 0 .../nm_generator/nm_docs/manpages.html | 0 .../nm_generator/nm_docs/nm-dbus-types.html | 0 .../nm_generator/nm_docs/nm-online.html | 0 .../nm_docs/nm-settings-keyfile.html | 0 .../nm_generator/nm_docs/nm-settings.html | 0 .../nm_docs/nm-vpn-dbus-types.html | 0 .../nm_generator/nm_docs/nmcli-examples.html | 0 .../nm_generator/nm_docs/nmcli.html | 0 .../nm_generator/nm_docs/nmtui.html | 0 .../nm_generator/nm_docs/ref-settings.html | 0 .../nm_docs/right-insensitive.png | Bin .../nm_generator/nm_docs/right.png | Bin .../nm_generator/nm_docs/secrets-flags.html | 0 .../nm_generator/nm_docs/spec.html | 0 .../nm_generator/nm_docs/style.css | 0 .../nm_generator/nm_docs/up-insensitive.png | Bin .../nm_generator/nm_docs/up.png | Bin .../nm_generator/nm_girs/NM-1.0_1.10.0.gir | 0 .../nm_generator/nm_girs/NM-1.0_1.2.4.gir | 0 .../nm_generator/nm_girs/NM-1.0_1.4.2.gir | 0 .../nm_generator/nm_girs/NM-1.0_1.6.0.gir | 0 .../nm_generator/nm_girs/NM-1.0_1.8.2.gir | 0 .../nm_generator/nm_logicset_keys.yml | 0 .../nm_generator/nm_virtual_sections.yml | 0 .../nm_generator/nm_vpn_alias_settings.yml | 0 {network => network1}/nm_generator/tpl.go | 0 {network => network1}/nm_generator/utils.go | 0 {network => network1}/nm_key_converter.go | 12 +- .../nm_key_converter_test.go | 2 +- {network => network1}/nm_key_edit.go | 2 +- {network => network1}/nm_key_type.go | 0 {network => network1}/nm_setting_802_1x.go | 2 +- {network => network1}/nm_setting_beans_gen.go | 2 +- .../nm_setting_ip4_config.go | 2 +- .../nm_setting_ip6_config.go | 2 +- {network => network1}/nm_setting_vpn.go | 0 {network => network1}/nm_setting_wired.go | 6 +- {network => network1}/nm_setting_wireless.go | 6 +- .../nm_setting_wireless_security.go | 2 +- {network => network1}/proxychains/check.go | 0 {network => network1}/proxychains/config.go | 2 +- .../proxychains/exported_methods_auto.go | 0 .../proxychains/proxychains.go | 8 +- .../proxychains/utils_notify.go | 4 +- {network => network1}/secret_agent.go | 11 +- {network => network1}/state_handler.go | 8 +- {network => network1}/sync_config.go | 6 +- {network => network1}/testdata/ca.crt | 0 {network => network1}/testdata/ca.key | 0 {network => network1}/testdata/client.crt | 0 {network => network1}/testdata/client.key | 0 {network => network1}/utils.go | 10 +- {network => network1}/utils_dbus.go | 10 +- {network => network1}/utils_dbus_mm.go | 4 +- {network => network1}/utils_dbus_nm.go | 6 +- {network => network1}/utils_ethtool.go | 0 {network => network1}/utils_ip.go | 0 {network => network1}/utils_ip_be_test.go | 2 + {network => network1}/utils_ip_le_test.go | 1 + {network => network1}/utils_ip_test.go | 0 {network => network1}/utils_notify.go | 6 +- {network => network1}/utils_test.go | 2 +- {network => network1}/utils_udev.c | 0 {network => network1}/utils_udev.go | 0 {network => network1}/utils_udev.h | 0 rpm/dde-daemon.spec | 20 +- {screenedge => screenedge1}/daemon.go | 2 +- .../exported_methods_auto.go | 0 {screenedge => screenedge1}/init.go | 0 {screenedge => screenedge1}/manager.go | 10 +- {screenedge => screenedge1}/manager_ifc.go | 2 +- {screenedge => screenedge1}/settings.go | 0 {screenedge => screenedge1}/sync_config.go | 0 .../exported_methods_auto.go | 0 {screensaver => screensaver1}/module.go | 2 +- {screensaver => screensaver1}/screensaver.go | 8 +- {screensaver => screensaver1}/sync_config.go | 4 +- service_trigger/dbus_agent.go | 4 +- service_trigger/dbus_signal_monitor.go | 2 +- service_trigger/manager.go | 6 +- service_trigger/service.go | 2 +- session/common/common.go | 6 +- session/eventlog/app_event.go | 4 +- session/eventlog/dconfig_event.go | 4 +- session/eventlog/event_collector.go | 8 +- .../{power => power1}/ambient_light_test.go | 0 session/{power => power1}/constant.go | 0 session/{power => power1}/count_ticker.go | 0 session/{power => power1}/daemon.go | 2 +- session/{power => power1}/delayed_task.go | 0 .../exported_methods_auto.go | 0 session/{power => power1}/helper.go | 24 +- session/{power => power1}/lid_switch.go | 8 +- session/{power => power1}/manager.go | 53 +- .../manager_ambient_light.go | 0 session/{power => power1}/manager_events.go | 6 +- session/{power => power1}/manager_stub.go | 4 +- session/{power => power1}/power_dbusutil.go | 0 session/{power => power1}/power_save_plan.go | 12 +- session/{power => power1}/power_test.go | 0 session/{power => power1}/sleep_inhibit.go | 15 +- session/{power => power1}/submodule.go | 0 session/{power => power1}/sync_config.go | 0 session/{power => power1}/utils.go | 18 +- session/{power => power1}/warn_level.go | 0 .../{power => power1}/warn_level_config.go | 3 +- .../exported_methods_auto.go | 0 session/{uadpagent => uadpagent1}/module.go | 2 +- .../{uadpagent => uadpagent1}/uadpagent.go | 12 +- .../exported_methods_auto.go | 0 .../manager.go | 10 +- .../sessionwatcher.go | 2 +- {sessionwatcher => sessionwatcher1}/utils.go | 0 .../exported_methods_auto.go | 0 {soundeffect => soundeffect1}/manager.go | 8 +- {soundeffect => soundeffect1}/soundeffect.go | 0 .../airplane_mode.go | 0 .../airplane_mode_dbusutil.go | 0 .../config.go | 0 .../define.go | 0 .../exported_methods_auto.go | 0 .../manager.go | 13 +- .../rfkill.go | 51 +- .../utils.go | 0 .../a2dp_workaround.go | 2 +- system/{bluetooth => bluetooth1}/adapter.go | 6 +- system/{bluetooth => bluetooth1}/agent.go | 96 +- .../auto_connect_manager.go | 6 +- system/{bluetooth => bluetooth1}/bluetooth.go | 50 +- .../bluetooth_dbusutil.go | 0 .../bluetooth_ifc.go | 8 +- .../bluez_profile.go | 0 .../{bluetooth => bluetooth1}/bluez_uuid.go | 0 system/{bluetooth => bluetooth1}/config.go | 0 .../{bluetooth => bluetooth1}/config_test.go | 2 +- system/{bluetooth => bluetooth1}/device.go | 20 +- system/{bluetooth => bluetooth1}/doc.go | 0 .../exported_methods_auto.go | 0 system/{bluetooth => bluetooth1}/init.go | 0 system/{bluetooth => bluetooth1}/module.go | 0 system/{bluetooth => bluetooth1}/utils.go | 0 .../{bluetooth => bluetooth1}/utils_notify.go | 0 .../{bluetooth => bluetooth1}/utils_test.go | 0 system/{display => display1}/display_test.go | 2 +- system/{display => display1}/displaycfg.go | 8 +- .../exported_methods_auto.go | 2 +- system/{display => display1}/module.go | 2 +- system/{gesture => gesture1}/config.go | 2 +- system/{gesture => gesture1}/config_test.go | 2 +- system/{gesture => gesture1}/core.c | 0 system/{gesture => gesture1}/core.h | 0 .../exported_methods_auto.go | 2 +- system/{gesture => gesture1}/gesture.go | 20 +- system/{gesture => gesture1}/gesture_test.go | 4 +- system/{gesture => gesture1}/testdata/conf | 0 .../{gesture => gesture1}/touchscreen_core.c | 962 ++++----- .../{gesture => gesture1}/touchscreen_core.h | 0 system/{gesture => gesture1}/utils.c | 0 system/{gesture => gesture1}/utils.h | 0 system/hostname/hostname.go | 6 +- .../{inputdevices => inputdevices1}/daemon.go | 8 +- .../dde-libinput.c | 0 .../dde-libinput.h | 0 .../exported_methods_auto.go | 2 +- .../inputdevices.go | 31 +- .../inputdevices_dbusutil.go | 6 +- .../inputdevices_ifc.go | 5 +- .../inputdevices_test.go | 4 +- .../libinput.go | 4 +- .../libinput_test.go | 2 +- .../touchpad.go | 22 +- .../touchscreen.go | 8 +- system/{keyevent => keyevent1}/daemon.go | 8 +- .../exported_methods_auto.go | 2 +- system/{keyevent => keyevent1}/keycode.go | 2 +- .../{keyevent => keyevent1}/libinput_bridge.c | 0 .../libinput_bridge.go | 4 +- .../{keyevent => keyevent1}/libinput_bridge.h | 0 system/{keyevent => keyevent1}/manager.go | 8 +- .../{keyevent => keyevent1}/manager_test.go | 2 +- .../private_keycode.go | 2 +- system/lang/lang.go | 69 +- system/{network => network1}/cherry.go | 9 +- system/{network => network1}/config.go | 2 +- system/{network => network1}/config_test.go | 2 +- .../exported_methods_auto.go | 2 +- system/{network => network1}/network.go | 14 +- .../{network => network1}/network_dbusutil.go | 2 +- system/{network => network1}/network_test.go | 4 +- system/{network => network1}/ping.go | 4 +- system/{network => network1}/ping_test.go | 2 +- .../testdata/config.json | 0 .../testdata/config2.json | 0 system/{network => network1}/utils.go | 6 +- system/{network => network1}/utils_udev.c | 0 system/{network => network1}/utils_udev.h | 0 system/{power => power1}/battery.go | 2 +- system/{power => power1}/battery_display.go | 0 .../{power => power1}/battery_display_test.go | 0 system/{power => power1}/battery_history.go | 0 .../{power => power1}/battery_history_test.go | 0 system/{power => power1}/battery_test.go | 0 system/{power => power1}/daemon.go | 2 +- .../exported_methods_auto.go | 0 system/{power => power1}/lid_switch.go | 0 system/{power => power1}/lid_switch_common.go | 15 +- .../lid_switch_common_test.go | 0 system/{power => power1}/lid_switch_sw.go | 0 system/{power => power1}/manager.go | 6 +- system/{power => power1}/manager_ifc.go | 6 +- system/{power => power1}/manager_powersave.go | 0 system/{power => power1}/power_dbusutil.go | 0 system/{power => power1}/power_key_edit.go | 2 +- .../{power => power1}/power_key_edit_test.go | 2 +- system/{power => power1}/power_test.go | 2 +- .../testdata/scaling_available_governors | 0 .../testdata/scaling_governor | 0 .../testdata/scaling_governor2 | 0 .../testdata/setGovernor/scaling_governor | 0 .../daemon.go | 6 +- .../exported_methods_auto.go | 0 .../manager.go | 4 +- .../power_manager_dbusutil.go | 0 .../utils.go | 0 .../exported_methods_auto.go | 0 system/{swapsched => swapsched1}/swapsched.go | 10 +- .../exported_methods_auto.go | 0 system/{systeminfo => systeminfo1}/manager.go | 10 +- .../{systeminfo => systeminfo1}/systeminfo.go | 2 +- .../systeminfo_dbusutil.go | 0 .../systeminfo_test.go | 0 .../exported_methods_auto.go | 0 system/{timedated => timedate1}/manager.go | 27 +- .../{timedated => timedate1}/manager_ifc.go | 4 +- system/{timedated => timedate1}/timedated.go | 2 +- .../timedated_dbusutil.go | 0 system/{uadp => uadp1}/aes.go | 0 system/{uadp => uadp1}/crypto.c | 0 system/{uadp => uadp1}/crypto.go | 0 system/{uadp => uadp1}/crypto.h | 0 system/{uadp => uadp1}/crypto_test.go | 0 system/{uadp => uadp1}/daemon.go | 6 +- system/{uadp => uadp1}/data_manager.go | 0 system/{uadp => uadp1}/data_manager_test.go | 0 system/{uadp => uadp1}/dde_tc.c | 0 system/{uadp => uadp1}/dde_tc.h | 0 system/{uadp => uadp1}/dde_tc_copy.h | 0 .../{uadp => uadp1}/exported_methods_auto.go | 0 system/{uadp => uadp1}/manager.go | 2 +- {systeminfo => systeminfo1}/cache.go | 0 {systeminfo => systeminfo1}/cpu.go | 35 +- {systeminfo => systeminfo1}/disk.go | 5 +- {systeminfo => systeminfo1}/distro.go | 0 .../exported_methods_auto.go | 0 {systeminfo => systeminfo1}/info.go | 20 +- {systeminfo => systeminfo1}/info_test.go | 0 {systeminfo => systeminfo1}/init.go | 0 {systeminfo => systeminfo1}/lsblk_disk.go | 2 +- .../testdata/arm-cpuinfo | 0 {systeminfo => systeminfo1}/testdata/cpuinfo | 0 .../testdata/deepin-version | 0 .../testdata/hw_kirin-cpuinfo | 0 .../testdata/loonson3-cpuinfo | 0 {systeminfo => systeminfo1}/testdata/lsCPU | 0 .../testdata/lsb-release | 0 {systeminfo => systeminfo1}/testdata/meminfo | 0 .../testdata/sw-cpuinfo | 0 .../testdata/systeminfo.cache | Bin {systeminfo => systeminfo1}/utils.go | 4 +- {systeminfo => systeminfo1}/version.go | 0 {timedate => timedate1}/daemon.go | 4 +- {timedate => timedate1}/daemon_test.go | 0 .../exported_methods_auto.go | 0 {timedate => timedate1}/handle_event.go | 0 {timedate => timedate1}/init.go | 0 {timedate => timedate1}/manager.go | 22 +- {timedate => timedate1}/manager_format.go | 26 +- {timedate => timedate1}/manager_ifc.go | 4 +- {timedate => timedate1}/manager_test.go | 0 {timedate => timedate1}/timedate_dbusutil.go | 0 .../timedate_format_dbusutil.go | 0 {timedate => timedate1}/utils.go | 0 {timedate => timedate1}/utils_test.go | 0 .../zoneinfo/testdata/dst_data | 0 .../zoneinfo/testdata/zone1970.tab | 0 {timedate => timedate1}/zoneinfo/timestamp.c | 0 {timedate => timedate1}/zoneinfo/timestamp.h | 0 {timedate => timedate1}/zoneinfo/wrapper.go | 0 {timedate => timedate1}/zoneinfo/zdump.c | 0 {timedate => timedate1}/zoneinfo/zdump.h | 0 {timedate => timedate1}/zoneinfo/zone.go | 0 {timedate => timedate1}/zoneinfo/zone_test.go | 0 {trayicon => trayicon1}/daemon.go | 4 +- {trayicon => trayicon1}/daemon_test.go | 0 .../exported_methods_auto.go | 4 +- {trayicon => trayicon1}/icon.go | 0 {trayicon => trayicon1}/init.go | 2 +- .../status-notifier-watcher.go | 4 +- .../status-notifier-watcher_test.go | 4 +- {trayicon => trayicon1}/tools.go | 0 {trayicon => trayicon1}/trayicon_dbusutil.go | 0 {trayicon => trayicon1}/traymanager.go | 2 +- {trayicon => trayicon1}/traymanager_ifc.go | 6 +- .../traymanager_ifc_test.go | 0 .../daemon.go | 6 +- .../daemon_test.go | 0 .../exported_methods_auto.go | 0 .../manager.go | 26 +- .../manager_test.go | 2 +- .../mousearea_test.go | 0 .../utils.go | 2 +- .../utils_test.go | 22 +- 1245 files changed, 10097 insertions(+), 20391 deletions(-) create mode 100644 .obs/workflows.yml rename {accounts => accounts1}/accounts.go (97%) rename {accounts => accounts1}/accounts_dbusutil.go (97%) rename {accounts => accounts1}/checkers/checkers_test.go (100%) rename {accounts => accounts1}/checkers/common.go (100%) rename {accounts => accounts1}/checkers/common_test.go (100%) rename {accounts => accounts1}/checkers/password.go (100%) rename {accounts => accounts1}/checkers/testdata/passwd (100%) rename {accounts => accounts1}/checkers/username.go (100%) rename {accounts => accounts1}/deepinversion.go (100%) rename {accounts => accounts1}/deepinversion_test.go (100%) rename {accounts => accounts1}/exported_methods_auto.go (97%) rename {accounts => accounts1}/handle_event.go (99%) rename {accounts => accounts1}/image_blur.go (96%) rename {accounts => accounts1}/left_space.go (100%) rename {accounts => accounts1}/logined/exported_methods_auto.go (100%) rename {accounts => accounts1}/logined/login.go (96%) rename {accounts => accounts1}/logined/user_info.go (95%) rename {accounts => accounts1}/logined/user_info_test.go (100%) rename {accounts => accounts1}/manager.go (98%) rename {accounts => accounts1}/manager_ifc.go (90%) rename {accounts => accounts1}/reminder_info.c (100%) rename {accounts => accounts1}/reminder_info.go (100%) rename {accounts => accounts1}/reminder_info.h (100%) rename {accounts => accounts1}/testdata/keyboard_us (100%) rename {accounts => accounts1}/testdata/keyboard_us_chr (100%) rename {accounts => accounts1}/testdata/locale (100%) rename {accounts => accounts1}/testdata/shells (100%) rename {accounts => accounts1}/user.go (96%) rename {accounts => accounts1}/user_chpwd_union_id.go (98%) rename {accounts => accounts1}/user_created_time.go (100%) rename {accounts => accounts1}/user_ifc.go (93%) rename {accounts => accounts1}/user_test.go (91%) rename {accounts => accounts1}/users/common.go (100%) rename {accounts => accounts1}/users/common_test.go (100%) rename {accounts => accounts1}/users/display_manager.go (99%) rename {accounts => accounts1}/users/display_manager.org (100%) rename {accounts => accounts1}/users/guest.go (100%) rename {accounts => accounts1}/users/list.go (100%) rename {accounts => accounts1}/users/manager.go (100%) rename {accounts => accounts1}/users/passwd.c (100%) rename {accounts => accounts1}/users/passwd.go (100%) rename {accounts => accounts1}/users/passwd.h (100%) rename {accounts => accounts1}/users/prop.go (100%) rename {accounts => accounts1}/users/testdata/adduser.conf (100%) rename {accounts => accounts1}/users/testdata/adduser1.conf (100%) rename {accounts => accounts1}/users/testdata/autologin/custom.conf (100%) rename {accounts => accounts1}/users/testdata/autologin/custom_autologin.conf (100%) rename {accounts => accounts1}/users/testdata/autologin/default-display-manager (100%) rename {accounts => accounts1}/users/testdata/autologin/display-manager.service (100%) rename {accounts => accounts1}/users/testdata/autologin/kdmrc (100%) rename {accounts => accounts1}/users/testdata/autologin/kdmrc_autologin (100%) rename {accounts => accounts1}/users/testdata/autologin/lightdm.conf (100%) rename {accounts => accounts1}/users/testdata/autologin/lightdm.service (100%) rename {accounts => accounts1}/users/testdata/autologin/lightdm_autologin.conf (100%) rename {accounts => accounts1}/users/testdata/autologin/lxdm.conf (100%) rename {accounts => accounts1}/users/testdata/autologin/lxdm_autologin.conf (100%) rename {accounts => accounts1}/users/testdata/autologin/sddm.conf (100%) rename {accounts => accounts1}/users/testdata/autologin/sddm_autologin.conf (100%) rename {accounts => accounts1}/users/testdata/autologin/slim.conf (100%) rename {accounts => accounts1}/users/testdata/autologin/slim_autologin.conf (100%) rename {accounts => accounts1}/users/testdata/group (100%) rename {accounts => accounts1}/users/testdata/login.defs (100%) rename {accounts => accounts1}/users/testdata/passwd (100%) rename {accounts => accounts1}/users/testdata/shadow (100%) rename {accounts => accounts1}/users/testdata/sudoers_arch (100%) rename {accounts => accounts1}/users/testdata/sudoers_deepin (100%) rename {accounts => accounts1}/users/users_test.go (100%) rename {accounts => accounts1}/utils.go (85%) rename {accounts => accounts1}/utils_test.go (98%) delete mode 100644 appearance/README.md delete mode 100644 appearance/appearance.go delete mode 100644 appearance/appearance_test.go delete mode 100644 appearance/background/background.go delete mode 100644 appearance/background/background_test.go delete mode 100644 appearance/background/custom_wallpapers.go delete mode 100644 appearance/background/custom_wallpapers_test.go delete mode 100644 appearance/background/list.go delete mode 100644 appearance/background/list_test.go delete mode 100644 appearance/background/testdata/Theme1/wallpapers/desktop.jpg delete mode 100644 appearance/background/testdata/Theme2/wallpapers/README.md delete mode 100644 appearance/background/testdata/fakeimages/empty/notimage.jpg delete mode 100644 appearance/background/testdata/fakeimages/fakeimage1.jpg delete mode 100644 appearance/background/testdata/fakeimages/fakeimage2.jpg delete mode 100644 appearance/cursor.c delete mode 100644 appearance/cursor.h delete mode 100644 appearance/deepin_qt_theme.go delete mode 100644 appearance/exported_methods_auto.go delete mode 100644 appearance/font_conf_version.go delete mode 100644 appearance/font_conf_version_test.go delete mode 100644 appearance/fonts/family.go delete mode 100644 appearance/fonts/family_cache.go delete mode 100644 appearance/fonts/font_list.c delete mode 100644 appearance/fonts/font_list.h delete mode 100644 appearance/fonts/wrapper.go delete mode 100644 appearance/fsnotify.go delete mode 100644 appearance/fsnotify_test.go delete mode 100644 appearance/handle_gsetting.go delete mode 100644 appearance/ifc.go delete mode 100644 appearance/listener.go delete mode 100644 appearance/manager.go delete mode 100644 appearance/manager_test.go delete mode 100644 appearance/scale.go delete mode 100644 appearance/subthemes/themes.go delete mode 100644 appearance/sync_config.go delete mode 100644 appearance/testdata/fontVersionConf delete mode 100644 appearance/theme_auto.go delete mode 100644 appearance/theme_auto_test.go delete mode 100644 appearance/wallpaper-slideshow.go rename {apps => apps1}/alrecorder.go (96%) rename {apps => apps1}/debug.go (92%) rename {apps => apps1}/dfwatcher.go (99%) rename {apps => apps1}/exported_methods_auto.go (98%) rename {apps => apps1}/file_event.go (98%) rename {apps => apps1}/fs_watcher.go (99%) rename {apps => apps1}/main.go (98%) rename {apps => apps1}/subrecorder.go (96%) rename {apps => apps1}/utils.go (99%) rename {apps => apps1}/utils_test.go (99%) rename {audio => audio1}/alsa.go (69%) rename {audio => audio1}/audio.go (95%) rename {audio => audio1}/audio_config.go (97%) rename {audio => audio1}/audio_dbusutil.go (99%) rename {audio => audio1}/audio_events.go (98%) rename {audio => audio1}/audio_test.go (87%) rename {audio => audio1}/bluez_audio.go (91%) rename {audio => audio1}/card.go (98%) rename {audio => audio1}/card_profile_workaround.go (94%) rename {audio => audio1}/card_test.go (100%) rename {audio => audio1}/config.go (100%) rename {audio => audio1}/config_keeper.go (100%) rename {audio => audio1}/config_keeper_test.go (100%) rename {audio => audio1}/config_test.go (100%) rename {audio => audio1}/exported_methods_auto.go (100%) rename {audio => audio1}/meter.go (93%) rename {audio => audio1}/module.go (100%) rename {audio => audio1}/port.go (100%) rename {audio => audio1}/port_test.go (100%) rename {audio => audio1}/priority_manager.go (100%) rename {audio => audio1}/priority_old.go (94%) rename {audio => audio1}/priority_policy.go (99%) rename {audio => audio1}/priority_test.go (99%) rename {audio => audio1}/profile.go (100%) rename {audio => audio1}/sink.go (99%) rename {audio => audio1}/sinkinput.go (99%) rename {audio => audio1}/source.go (99%) rename {audio => audio1}/sync_config.go (97%) rename {audio => audio1}/testdata/bluezAudio.json (100%) rename {audio => audio1}/util.go (93%) rename {audio => audio1}/util_test.go (100%) delete mode 100644 bin/default-file-manager/main.c create mode 100644 bin/default-file-manager/main.go delete mode 100644 bin/theme-thumb-tool/main.go delete mode 100644 bin/theme-thumb-tool/main_test.go delete mode 100644 bin/theme-thumb-tool/testdata/moveThumbFiles/source1/f1 delete mode 100644 bin/theme-thumb-tool/thumbnail.go rename {bluetooth => bluetooth1}/adapter.go (98%) rename {bluetooth => bluetooth1}/agent.go (70%) rename {bluetooth => bluetooth1}/bluetooth.go (97%) rename {bluetooth => bluetooth1}/bluetooth_dbusutil.go (100%) rename {bluetooth => bluetooth1}/bluetooth_ifc.go (93%) rename {bluetooth => bluetooth1}/bluez_profile.go (98%) rename {bluetooth => bluetooth1}/bluez_uuid.go (100%) rename {bluetooth => bluetooth1}/develop.md (100%) rename {bluetooth => bluetooth1}/device.go (99%) rename {bluetooth => bluetooth1}/doc.go (100%) rename {bluetooth => bluetooth1}/exported_methods_auto.go (100%) rename {bluetooth => bluetooth1}/init.go (100%) rename {bluetooth => bluetooth1}/main.go (100%) rename {bluetooth => bluetooth1}/obex_agent.go (98%) rename {bluetooth => bluetooth1}/utils.go (100%) rename {bluetooth => bluetooth1}/utils_notify.go (97%) rename {bluetooth => bluetooth1}/utils_test.go (100%) rename {clipboard => clipboard1}/clipboard_test.go (98%) rename {clipboard => clipboard1}/event_captor.go (100%) rename {clipboard => clipboard1}/exported_methods_auto.go (100%) rename {clipboard => clipboard1}/manager.go (90%) rename {clipboard => clipboard1}/manager_debug.go (99%) rename {clipboard => clipboard1}/manager_test.go (98%) rename {clipboard => clipboard1}/mocks/XClient.go (100%) rename {clipboard => clipboard1}/module.go (89%) rename {clipboard => clipboard1}/util.go (100%) rename {clipboard => clipboard1}/x_client.go (100%) delete mode 100644 dock/app_entries.go delete mode 100644 dock/app_entry.go delete mode 100644 dock/app_entry_ifc.go delete mode 100644 dock/app_entry_menu.go delete mode 100644 dock/app_info.go delete mode 100644 dock/bamf.go delete mode 100644 dock/daemon.go delete mode 100644 dock/desktop_file_path.go delete mode 100644 dock/desktop_file_path_test.go delete mode 100644 dock/dock_dbusutil.go delete mode 100644 dock/dock_manager.go delete mode 100644 dock/dock_manager_dock_app.go delete mode 100644 dock/dock_manager_entries.go delete mode 100644 dock/dock_manager_hide_state.go delete mode 100644 dock/dock_manager_hide_state_test.go delete mode 100644 dock/dock_manager_init.go delete mode 100644 dock/dock_manager_xevent.go delete mode 100644 dock/exported_methods_auto.go delete mode 100644 dock/identify_window.go delete mode 100644 dock/identify_window_pattern.go delete mode 100644 dock/init.go delete mode 100644 dock/kwindow_info.go delete mode 100644 dock/menu.go delete mode 100644 dock/menu_test.go delete mode 100644 dock/plugin_settings.go delete mode 100644 dock/process_info.go delete mode 100644 dock/sync_config.go delete mode 100644 dock/testdata/firefox.desktop delete mode 100644 dock/types.go delete mode 100644 dock/util.go delete mode 100644 dock/util_test.go delete mode 100644 dock/window_info.go delete mode 100644 dock/window_infos.go delete mode 100644 dock/window_infos_test.go delete mode 100644 dock/window_slice.go delete mode 100644 dock/window_slice_test.go delete mode 100644 dock/wl_manager.go delete mode 100644 dock/xutils.go rename {fprintd => fprintd1}/common/common.go (87%) rename {fprintd => fprintd1}/device.go (95%) rename {fprintd => fprintd1}/exported_methods_auto.go (99%) rename {fprintd => fprintd1}/fprintd.go (98%) rename {fprintd => fprintd1}/fprintd_dbusutil.go (88%) rename {fprintd => fprintd1}/huawei_device.go (98%) rename {fprintd => fprintd1}/manager.go (95%) delete mode 100644 gesture/config_test.go rename {gesture => gesture1}/built-in.go (99%) rename {gesture => gesture1}/config.go (99%) create mode 100644 gesture1/config_test.go rename {gesture => gesture1}/daemon.go (93%) rename {gesture => gesture1}/exported_methods_auto.go (98%) rename {gesture => gesture1}/manager.go (95%) rename {gesture => gesture1}/manager_ifc.go (97%) rename {gesture => gesture1}/testdata/gesture (92%) rename {gesture => gesture1}/utils.go (95%) rename {gesture => gesture1}/utils_test.go (86%) create mode 100644 go.mod create mode 100644 go.sum rename {image_effect => image_effect1}/exported_methods_auto.go (100%) rename {image_effect => image_effect1}/image_effect.go (98%) rename {image_effect => image_effect1}/module.go (100%) rename {image_effect => image_effect1}/utils.go (100%) delete mode 100644 inputdevices/stub.go rename {inputdevices => inputdevices1}/app_layout_config.go (100%) rename {inputdevices => inputdevices1}/exported_methods_auto.go (100%) rename {inputdevices => inputdevices1}/handle_gsettings.go (100%) rename {inputdevices => inputdevices1}/ifc.go (96%) rename {inputdevices => inputdevices1}/inputdevices.go (100%) rename {inputdevices => inputdevices1}/inputdevices_dbusutil.go (100%) rename {inputdevices => inputdevices1}/inputdevices_test.go (100%) rename {inputdevices => inputdevices1}/iso639/auto.go (100%) rename {inputdevices => inputdevices1}/iso639/iso639.go (100%) rename {inputdevices => inputdevices1}/keyboard.go (99%) rename {inputdevices => inputdevices1}/kwayland.go (97%) rename {inputdevices => inputdevices1}/layout_list.go (98%) rename {inputdevices => inputdevices1}/listen.c (100%) rename {inputdevices => inputdevices1}/listen.h (100%) rename {inputdevices => inputdevices1}/manager.go (98%) rename {inputdevices => inputdevices1}/mouse.go (100%) create mode 100644 inputdevices1/stub.go rename {inputdevices => inputdevices1}/sync_config.go (100%) rename {inputdevices => inputdevices1}/testdata/base.xml (100%) rename {inputdevices => inputdevices1}/testdata/dde-desktop-cmdline (100%) rename {inputdevices => inputdevices1}/testdata/keyboard (100%) rename {inputdevices => inputdevices1}/testdata/syndaemon.pid (100%) rename {inputdevices => inputdevices1}/testdata/users.ini (100%) rename {inputdevices => inputdevices1}/touchpad.go (98%) rename {inputdevices => inputdevices1}/trackpoint.go (100%) rename {inputdevices => inputdevices1}/utils.go (100%) rename {inputdevices => inputdevices1}/utils_test.go (100%) rename {inputdevices => inputdevices1}/wacom.go (100%) rename {inputdevices => inputdevices1}/wm_wrapper.go (100%) rename {inputdevices => inputdevices1}/wrapper.go (99%) rename {keybinding => keybinding1}/audio_controller.go (95%) rename {keybinding => keybinding1}/config.go (100%) rename {keybinding => keybinding1}/daemon.go (96%) rename {keybinding => keybinding1}/display_controller.go (91%) rename {keybinding => keybinding1}/exported_methods_auto.go (95%) rename {keybinding => keybinding1}/huawei_mic.go (97%) rename {keybinding => keybinding1}/kbd_light_controller.go (94%) rename {keybinding => keybinding1}/lock_state.go (96%) rename {keybinding => keybinding1}/manager.go (83%) rename {keybinding => keybinding1}/manager_handlers.go (98%) rename {keybinding => keybinding1}/manager_ifc.go (94%) rename {keybinding => keybinding1}/manager_ifc_deprecated.go (96%) rename {keybinding => keybinding1}/media_player_controller.go (91%) rename {keybinding => keybinding1}/select_keystroke.go (97%) rename {keybinding => keybinding1}/shortcuts/action.go (100%) rename {keybinding => keybinding1}/shortcuts/custom_shortcut.go (96%) rename {keybinding => keybinding1}/shortcuts/gsettings_shortcut.go (96%) rename {keybinding => keybinding1}/shortcuts/id_name_map.go (70%) rename {keybinding => keybinding1}/shortcuts/key.go (100%) rename {keybinding => keybinding1}/shortcuts/keystroke.go (100%) rename {keybinding => keybinding1}/shortcuts/keystroke_test.go (100%) rename {keybinding => keybinding1}/shortcuts/kwin_shortcut.go (93%) rename {keybinding => keybinding1}/shortcuts/media_shortcut.go (96%) rename {keybinding => keybinding1}/shortcuts/shortcut.go (98%) rename {keybinding => keybinding1}/shortcuts/shortcut_manager.go (98%) rename {keybinding => keybinding1}/shortcuts/shortcut_manager_test.go (100%) rename {keybinding => keybinding1}/shortcuts/system_shortcut.go (87%) rename {keybinding => keybinding1}/shortcuts/xrecord_event_handler.go (100%) rename {keybinding => keybinding1}/shortcuts/xrecord_event_handler_test.go (100%) rename {keybinding => keybinding1}/special_keycode.go (91%) rename {keybinding => keybinding1}/testdata/hotkey (100%) rename {keybinding => keybinding1}/testdata/hotkey_disable (100%) rename {keybinding => keybinding1}/touchpad_controller.go (89%) rename {keybinding => keybinding1}/util/util.go (95%) rename {keybinding => keybinding1}/utils.go (95%) rename {keybinding => keybinding1}/utils_test.go (100%) rename {langselector => langselector1}/exported_methods_auto.go (100%) rename {langselector => langselector1}/langselector_dbusutil.go (100%) rename {langselector => langselector1}/locale.go (97%) rename {langselector => langselector1}/locale_ifc.go (95%) rename {langselector => langselector1}/locale_test.go (100%) rename {langselector => langselector1}/main.go (96%) rename {langselector => langselector1}/testdata/pam_environment (100%) rename {langselector => langselector1}/testdata/support_languages.json (100%) rename {lastore => lastore1}/agent.go (87%) rename {lastore => lastore1}/agent_ifc.go (96%) rename {lastore => lastore1}/daemon.go (94%) rename {lastore => lastore1}/exported_methods_auto.go (100%) rename {lastore => lastore1}/lastore.go (84%) rename {lastore => lastore1}/sync_config.go (98%) rename {lastore => lastore1}/tools.go (100%) rename {lastore => lastore1}/tools_test.go (100%) delete mode 100644 misc/conf/com.deepin.daemon.Daemon.conf delete mode 100644 misc/conf/com.deepin.daemon.Fprintd.conf delete mode 100644 misc/conf/com.deepin.daemon.SwapSchedHelper.conf delete mode 100644 misc/conf/com.deepin.daemon.Timedated.conf delete mode 100644 misc/conf/com.deepin.daemon.helper.Backlight.conf delete mode 100644 misc/conf/com.deepin.system.Bluetooth.conf rename misc/conf/{com.deepin.daemon.Greeter.conf => org.deepin.dde.Accounts1.conf} (59%) rename misc/conf/{com.deepin.system.SystemInfo.conf => org.deepin.dde.AirplaneMode1.conf} (79%) rename misc/conf/{com.deepin.daemon.Apps.conf => org.deepin.dde.Apps1.conf} (80%) rename misc/conf/{com.deepin.daemon.Authority.conf => org.deepin.dde.Authority1.conf} (60%) rename misc/conf/{com.deepin.daemon.PowerManager.conf => org.deepin.dde.BacklightHelper1.conf} (56%) create mode 100644 misc/conf/org.deepin.dde.Bluetooth1.conf create mode 100644 misc/conf/org.deepin.dde.Daemon1.conf rename misc/conf/{com.deepin.system.Display.conf => org.deepin.dde.Display1.conf} (64%) create mode 100644 misc/conf/org.deepin.dde.Fprintd1.conf rename misc/conf/{com.deepin.daemon.Gesture.conf => org.deepin.dde.Gesture1.conf} (59%) rename misc/conf/{com.deepin.daemon.Accounts.conf => org.deepin.dde.Greeter1.conf} (58%) rename misc/conf/{com.deepin.daemon.Grub2.conf => org.deepin.dde.Grub2.conf} (80%) rename misc/conf/{com.deepin.system.InputDevices.conf => org.deepin.dde.ImageBlur1.conf} (78%) rename misc/conf/{com.deepin.daemon.ImageEffect.conf => org.deepin.dde.ImageEffect1.conf} (78%) create mode 100644 misc/conf/org.deepin.dde.InputDevices1.conf rename misc/conf/{com.deepin.daemon.KeyEvent.conf => org.deepin.dde.KeyEvent1.conf} (64%) rename misc/conf/{com.deepin.dde.LockService.conf => org.deepin.dde.LockService1.conf} (58%) rename misc/conf/{com.deepin.system.Network.conf => org.deepin.dde.Network1.conf} (64%) rename misc/conf/{com.deepin.system.Power.conf => org.deepin.dde.Power1.conf} (56%) create mode 100644 misc/conf/org.deepin.dde.PowerManager1.conf rename misc/conf/{com.deepin.daemon.AirplaneMode.conf => org.deepin.dde.SwapSchedHelper1.conf} (71%) create mode 100644 misc/conf/org.deepin.dde.SystemInfo1.conf create mode 100644 misc/conf/org.deepin.dde.Timedate1.conf rename misc/conf/{com.deepin.daemon.Uadp.conf => org.deepin.dde.Uadp1.conf} (66%) delete mode 100644 misc/polkit-action/com.deepin.daemon.airplane-mode.policy rename misc/polkit-action/{com.deepin.daemon.Fprintd.policy.in => org.deepin.dde.Fprintd1.policy.in} (86%) rename misc/polkit-action/{com.deepin.daemon.Grub2.policy.in => org.deepin.dde.Grub2.policy.in} (90%) rename misc/polkit-action/{com.deepin.daemon.accounts.policy.in => org.deepin.dde.accounts1.policy.in} (70%) rename misc/polkit-localauthority/{com.deepin.daemon.Accounts.pkla => org.deepin.dde.accounts.pkla} (66%) rename misc/polkit-localauthority/{com.deepin.daemon.Fprintd.pkla => org.deepin.dde.fprintd.pkla} (100%) rename misc/polkit-localauthority/{com.deepin.daemon.Grub2.pkla => org.deepin.dde.grub2.pkla} (66%) create mode 100644 misc/scripts/dde-lock.sh delete mode 100644 misc/services/com.deepin.LastoreSessionHelper.service delete mode 100644 misc/services/com.deepin.api.XEventMonitor.service delete mode 100644 misc/services/com.deepin.daemon.Appearance.service delete mode 100644 misc/services/com.deepin.daemon.Audio.service delete mode 100644 misc/services/com.deepin.daemon.Bluetooth.service delete mode 100644 misc/services/com.deepin.daemon.EventLog.service delete mode 100644 misc/services/com.deepin.daemon.InputDevices.service delete mode 100644 misc/services/com.deepin.daemon.Keybinding.service delete mode 100644 misc/services/com.deepin.daemon.Mime.service delete mode 100644 misc/services/com.deepin.daemon.Network.service delete mode 100644 misc/services/com.deepin.daemon.Power.service delete mode 100644 misc/services/com.deepin.daemon.SessionWatcher.service delete mode 100644 misc/services/com.deepin.daemon.SystemInfo.service delete mode 100644 misc/services/com.deepin.daemon.Timedate.service delete mode 100644 misc/services/com.deepin.daemon.Zone.service delete mode 100644 misc/services/com.deepin.dde.daemon.Dock.service delete mode 100644 misc/services/com.deepin.dde.daemon.Launcher.service create mode 100644 misc/services/org.deepin.dde.Audio1.service create mode 100644 misc/services/org.deepin.dde.Bluetooth1.service create mode 100644 misc/services/org.deepin.dde.InputDevices1.service create mode 100644 misc/services/org.deepin.dde.Keybinding1.service rename misc/services/{com.deepin.daemon.LangSelector.service => org.deepin.dde.LangSelector1.service} (61%) create mode 100644 misc/services/org.deepin.dde.LastoreSessionHelper1.service create mode 100644 misc/services/org.deepin.dde.Network1.service create mode 100644 misc/services/org.deepin.dde.Power1.service rename misc/services/{com.deepin.daemon.Search.service => org.deepin.dde.Search1.service} (62%) create mode 100644 misc/services/org.deepin.dde.SessionWatcher1.service rename misc/services/{com.deepin.daemon.SoundEffect.service => org.deepin.dde.SoundEffect1.service} (61%) create mode 100644 misc/services/org.deepin.dde.SystemInfo1.service create mode 100644 misc/services/org.deepin.dde.Timedate1.service create mode 100644 misc/services/org.deepin.dde.XEventMonitor1.service create mode 100644 misc/services/org.deepin.dde.Zone1.service delete mode 100644 misc/system-services/com.deepin.daemon.Accounts.service delete mode 100644 misc/system-services/com.deepin.daemon.AirplaneMode.service delete mode 100644 misc/system-services/com.deepin.daemon.Apps.service delete mode 100644 misc/system-services/com.deepin.daemon.Authority.service delete mode 100644 misc/system-services/com.deepin.daemon.Daemon.service delete mode 100644 misc/system-services/com.deepin.daemon.Fprintd.service delete mode 100644 misc/system-services/com.deepin.daemon.Gesture.service delete mode 100644 misc/system-services/com.deepin.daemon.Greeter.service delete mode 100644 misc/system-services/com.deepin.daemon.Grub2.service delete mode 100644 misc/system-services/com.deepin.daemon.ImageEffect.service delete mode 100644 misc/system-services/com.deepin.daemon.SwapSchedHelper.service delete mode 100644 misc/system-services/com.deepin.daemon.Timedated.service delete mode 100644 misc/system-services/com.deepin.daemon.Uadp.service delete mode 100644 misc/system-services/com.deepin.daemon.helper.Backlight.service delete mode 100644 misc/system-services/com.deepin.dde.LockService.service delete mode 100644 misc/system-services/com.deepin.system.Bluetooth.service delete mode 100644 misc/system-services/com.deepin.system.Display.service delete mode 100644 misc/system-services/com.deepin.system.Network.service delete mode 100644 misc/system-services/com.deepin.system.Power.service create mode 100644 misc/system-services/org.deepin.dde.Accounts1.service create mode 100644 misc/system-services/org.deepin.dde.AirplaneMode1.service create mode 100644 misc/system-services/org.deepin.dde.Apps1.service create mode 100644 misc/system-services/org.deepin.dde.Authority1.service create mode 100644 misc/system-services/org.deepin.dde.BacklightHelper1.service create mode 100644 misc/system-services/org.deepin.dde.Bluetooth1.service create mode 100644 misc/system-services/org.deepin.dde.Daemon1.service create mode 100644 misc/system-services/org.deepin.dde.Display1.service create mode 100644 misc/system-services/org.deepin.dde.Fprintd1.service create mode 100644 misc/system-services/org.deepin.dde.Gesture1.service create mode 100644 misc/system-services/org.deepin.dde.Greeter1.service create mode 100644 misc/system-services/org.deepin.dde.Grub2.service create mode 100644 misc/system-services/org.deepin.dde.ImageEffect1.service create mode 100644 misc/system-services/org.deepin.dde.LockService1.service create mode 100644 misc/system-services/org.deepin.dde.Network1.service create mode 100644 misc/system-services/org.deepin.dde.Power1.service create mode 100644 misc/system-services/org.deepin.dde.SwapSchedHelper1.service create mode 100644 misc/system-services/org.deepin.dde.Timedate1.service create mode 100644 misc/system-services/org.deepin.dde.Uadp1.service create mode 100644 misc/systemd/services/system/deepin-accounts1-daemon.service create mode 100644 misc/systemd/services/system/deepin-authority.service create mode 100644 misc/systemd/services/system/deepin-greeter-setter.service create mode 100644 misc/systemd/services/system/deepin-grub2.service create mode 100644 misc/systemd/services/system/deepin-helper-backlight.service create mode 100644 misc/systemd/services/system/deepin-user-lock.service create mode 100644 misc/systemd/services/user/org.dde.session.Daemon1.service rename misc/systemd/{services/deepin-accounts-daemon.service => system-services/deepin-accounts1-daemon.service} (87%) delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_ady.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_af_ZA.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_am_ET.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_ar_EG.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_ast.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_az.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_bqi.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_ca.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_cgg.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_de_CH.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_de_DE.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_el_GR.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_en_AU.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_en_GB.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_en_NO.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_en_US.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_es.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_fi.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_fil.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_gl_ES.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_hi_IN.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_id_ID.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_kab.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_km_KH.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_kn_IN.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_ku_IQ.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_ky@Arab.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_pam.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_pt_BR.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_ru_UA.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_sv_SE.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_tzm.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_ug.ts delete mode 100644 misc/ts/com.deepin.daemon.Grub2.policy/policy_uk.ts rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy.ts (66%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ady.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_af.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_af_ZA.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ak.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_am.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_am_ET.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ar.ts (67%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ar_EG.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ast.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_az.ts (68%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_bg.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_bn.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_bo.ts (72%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_bqi.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_br.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ca.ts (67%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_cgg.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_cs.ts (68%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_da.ts (66%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_de.ts (68%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_de_CH.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_de_DE.ts (67%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_el.ts (71%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_el_GR.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_en_AU.ts (66%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_en_GB.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_en_NO.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_en_US.ts (66%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_eo.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_es.ts (68%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_es_MX.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_et.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_eu.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_fa.ts (66%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_fi.ts (66%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_fil.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_fr.ts (68%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_gl.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_gl_ES.ts (68%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_he.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_hi_IN.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_hr.ts (66%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_hu.ts (67%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_hy.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_id.ts (66%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_id_ID.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_it.ts (67%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ja.ts (67%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ka.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_kab.ts (66%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_kk.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_km_KH.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_kn_IN.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ko.ts (66%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ku.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ku_IQ.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ky.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ky@Arab.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_la.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_lo.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_lt.ts (65%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_lv.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ml.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_mn.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_mr.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ms.ts (67%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_nb.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ne.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_nl.ts (66%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_pa.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_pam.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_pl.ts (67%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ps.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_pt.ts (68%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_pt_BR.ts (67%) create mode 100644 misc/ts/org.deepin.dde.Fprintd1.policy/policy_qu.ts rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ro.ts (66%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ru.ts (72%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ru_UA.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_sc.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_si.ts (73%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_sk.ts (67%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_sl.ts (65%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_sq.ts (67%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_sr.ts (69%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_sv.ts (63%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_sv_SE.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_sw.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ta.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_te.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_th.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_tr.ts (67%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_tzm.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ug.ts (70%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_uk.ts (70%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_ur.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_uz.ts (61%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_vi.ts (66%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_zh_CN.ts (64%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_zh_HK.ts (64%) rename misc/ts/{com.deepin.daemon.Fprintd.policy => org.deepin.dde.Fprintd1.policy}/policy_zh_TW.ts (64%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy.ts (66%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_ady.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_af.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_af_ZA.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_ak.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_am.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_am_ET.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_ar.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_ar_EG.ts create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_ast.ts create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_az.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_bg.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_bn.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_bo.ts (81%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_bqi.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_br.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_ca.ts create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_cgg.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_cs.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_da.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_de.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_de_CH.ts create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_de_DE.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_el.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_el_GR.ts create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_en_AU.ts create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_en_GB.ts create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_en_NO.ts create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_en_US.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_eo.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_es.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_es_419.ts (69%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_es_MX.ts (66%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_et.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_eu.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_fa.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_fi.ts create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_fil.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_fr.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_gl.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_gl_ES.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_he.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_hi_IN.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_hr.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_hu.ts (72%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_hy.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_id.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_id_ID.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_it.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_ja.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_ka.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_kab.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_kk.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_km_KH.ts create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_kn_IN.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_ko.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_ku.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_ku_IQ.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_ky.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_ky@Arab.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_la.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_lo.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_lt.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_lv.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_ml.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_mn.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_mr.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_ms.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_nb.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_ne.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_nl.ts (71%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_pa.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_pam.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_pl.ts (71%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_ps.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_pt.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_pt_BR.ts create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_qu.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_ro.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_ru.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_ru_UA.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_sc.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_si.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_sk.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_sl.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_sq.ts (72%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_sr.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_sv.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_sv_SE.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_sw.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_ta.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_te.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_th.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_tr.ts (59%) create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_tzm.ts create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_ug.ts create mode 100644 misc/ts/org.deepin.dde.Grub2.policy/policy_uk.ts rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_ur.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_uz.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_vi.ts (59%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_zh_CN.ts (70%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_zh_HK.ts (70%) rename misc/ts/{com.deepin.daemon.Grub2.policy => org.deepin.dde.Grub2.policy}/policy_zh_TW.ts (70%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy.ts (55%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ady.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_af.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_af_ZA.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ak.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_am.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_am_ET.ts (52%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ar.ts (58%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ar_EG.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ast.ts (51%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_az.ts (57%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_bg.ts (60%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_bn.ts (62%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_bo.ts (62%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_bqi.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_br.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ca.ts (55%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_cgg.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_cs.ts (56%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_da.ts (55%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_de.ts (56%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_de_CH.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_de_DE.ts (55%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_el.ts (59%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_el_GR.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_en_AU.ts (54%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_en_GB.ts (54%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_en_NO.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_en_US.ts (54%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_eo.ts (51%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_es.ts (57%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_es_419.ts (68%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_es_MX.ts (61%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_et.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_eu.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_fa.ts (57%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_fi.ts (56%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_fil.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_fr.ts (56%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_gl.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_gl_ES.ts (55%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_he.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_hi_IN.ts (62%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_hr.ts (55%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_hu.ts (58%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_hy.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_id.ts (55%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_id_ID.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_it.ts (56%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ja.ts (56%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ka.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_kab.ts (54%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_kk.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_km_KH.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_kn_IN.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ko.ts (55%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ku.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ku_IQ.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ky.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ky@Arab.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_la.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_lo.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_lt.ts (56%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_lv.ts (51%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ml.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_mn.ts (61%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_mr.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ms.ts (55%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_nb.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ne.ts (61%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_nl.ts (55%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_pa.ts (53%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_pam.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_pl.ts (55%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ps.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_pt.ts (58%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_pt_BR.ts (52%) create mode 100644 misc/ts/org.deepin.dde.accounts1.policy/policy_qu.ts rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ro.ts (56%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ru.ts (60%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ru_UA.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_sc.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_si.ts (62%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_sk.ts (56%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_sl.ts (54%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_sq.ts (55%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_sr.ts (60%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_sv.ts (55%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_sv_SE.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_sw.ts (54%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ta.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_te.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_th.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_tr.ts (56%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_tzm.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ug.ts (60%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_uk.ts (61%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_ur.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_uz.ts (50%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_vi.ts (56%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_zh_CN.ts (53%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_zh_HK.ts (53%) rename misc/ts/{com.deepin.daemon.accounts.policy => org.deepin.dde.accounts1.policy}/policy_zh_TW.ts (53%) rename {network => network1}/README.md (96%) rename {network => network1}/decode_ssid.go (100%) rename {network => network1}/examples/python/README.md (100%) rename {network => network1}/examples/python/dbus_gen/com_deepin_daemon_Network.py (99%) rename {network => network1}/examples/python/dbus_gen/com_deepin_daemon_Network_ConnectionSession.py (100%) rename {network => network1}/examples/python/dbus_gen/dbus_dde_daemon_network.xml (99%) rename {network => network1}/examples/python/dbus_gen/dbus_dde_daemon_network_connectionsession.xml (100%) rename {network => network1}/examples/python/gen_dbus_code.sh (52%) rename {network => network1}/examples/python/main.py (85%) rename {network => network1}/examples/python/utils_dbus.py (96%) rename {network => network1}/examples/set_wired_static_ip.sh (93%) rename {network => network1}/exported_methods_auto.go (100%) rename {network => network1}/manager.go (93%) rename {network => network1}/manager_accesspoint.go (98%) rename {network => network1}/manager_active_conn.go (98%) rename {network => network1}/manager_connection.go (99%) rename {network => network1}/manager_dbusutil.go (100%) rename {network => network1}/manager_device.go (95%) rename {network => network1}/manager_ip_conflict.go (80%) rename {network => network1}/manager_proxy.go (99%) rename {network => network1}/manager_stub.go (96%) rename {network => network1}/module.go (98%) rename {network => network1}/nm/README.md (100%) rename {network => network1}/nm/nm_consts_gen.go (100%) rename {network => network1}/nm/nm_extends_consts.go (100%) rename {network => network1}/nm_custom_type.go (98%) rename {network => network1}/nm_generator/Makefile (100%) rename {network => network1}/nm_generator/README.md (100%) rename {network => network1}/nm_generator/gen_nm_consts.py (100%) rename {network => network1}/nm_generator/main.go (100%) rename {network => network1}/nm_generator/nm_consts_gen.yml (100%) rename {network => network1}/nm_generator/nm_consts_keys_override.yml (100%) rename {network => network1}/nm_generator/nm_docs/NetworkManager.conf.html (100%) rename {network => network1}/nm_generator/nm_docs/NetworkManager.devhelp2 (100%) rename {network => network1}/nm_generator/nm_docs/NetworkManager.html (100%) rename {network => network1}/nm_generator/nm_docs/dbus-types.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.AccessPoint.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.AgentManager.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Connection.Active.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.DHCP4Config.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.DHCP6Config.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Adsl.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Bluetooth.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Bond.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Bridge.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Generic.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.IPTunnel.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Infiniband.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Macvlan.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Modem.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.OlpcMesh.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Statistics.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Team.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Tun.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Veth.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Vlan.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Vxlan.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.WiMax.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Wired.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Wireless.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.IP4Config.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.IP6Config.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.PPP.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.SecretAgent.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Settings.Connection.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Settings.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.VPN.Connection.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.VPN.Plugin.html (100%) rename {network => network1}/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.html (100%) rename {network => network1}/nm_generator/nm_docs/home.png (100%) rename {network => network1}/nm_generator/nm_docs/index.html (100%) rename {network => network1}/nm_generator/nm_docs/ix01.html (100%) rename {network => network1}/nm_generator/nm_docs/left-insensitive.png (100%) rename {network => network1}/nm_generator/nm_docs/left.png (100%) rename {network => network1}/nm_generator/nm_docs/license.html (100%) rename {network => network1}/nm_generator/nm_docs/manpages.html (100%) rename {network => network1}/nm_generator/nm_docs/nm-dbus-types.html (100%) rename {network => network1}/nm_generator/nm_docs/nm-online.html (100%) rename {network => network1}/nm_generator/nm_docs/nm-settings-keyfile.html (100%) rename {network => network1}/nm_generator/nm_docs/nm-settings.html (100%) rename {network => network1}/nm_generator/nm_docs/nm-vpn-dbus-types.html (100%) rename {network => network1}/nm_generator/nm_docs/nmcli-examples.html (100%) rename {network => network1}/nm_generator/nm_docs/nmcli.html (100%) rename {network => network1}/nm_generator/nm_docs/nmtui.html (100%) rename {network => network1}/nm_generator/nm_docs/ref-settings.html (100%) rename {network => network1}/nm_generator/nm_docs/right-insensitive.png (100%) rename {network => network1}/nm_generator/nm_docs/right.png (100%) rename {network => network1}/nm_generator/nm_docs/secrets-flags.html (100%) rename {network => network1}/nm_generator/nm_docs/spec.html (100%) rename {network => network1}/nm_generator/nm_docs/style.css (100%) rename {network => network1}/nm_generator/nm_docs/up-insensitive.png (100%) rename {network => network1}/nm_generator/nm_docs/up.png (100%) rename {network => network1}/nm_generator/nm_girs/NM-1.0_1.10.0.gir (100%) rename {network => network1}/nm_generator/nm_girs/NM-1.0_1.2.4.gir (100%) rename {network => network1}/nm_generator/nm_girs/NM-1.0_1.4.2.gir (100%) rename {network => network1}/nm_generator/nm_girs/NM-1.0_1.6.0.gir (100%) rename {network => network1}/nm_generator/nm_girs/NM-1.0_1.8.2.gir (100%) rename {network => network1}/nm_generator/nm_logicset_keys.yml (100%) rename {network => network1}/nm_generator/nm_virtual_sections.yml (100%) rename {network => network1}/nm_generator/nm_vpn_alias_settings.yml (100%) rename {network => network1}/nm_generator/tpl.go (100%) rename {network => network1}/nm_generator/utils.go (100%) rename {network => network1}/nm_key_converter.go (98%) rename {network => network1}/nm_key_converter_test.go (99%) rename {network => network1}/nm_key_edit.go (98%) rename {network => network1}/nm_key_type.go (100%) rename {network => network1}/nm_setting_802_1x.go (98%) rename {network => network1}/nm_setting_beans_gen.go (99%) rename {network => network1}/nm_setting_ip4_config.go (88%) rename {network => network1}/nm_setting_ip6_config.go (87%) rename {network => network1}/nm_setting_vpn.go (100%) rename {network => network1}/nm_setting_wired.go (94%) rename {network => network1}/nm_setting_wireless.go (96%) rename {network => network1}/nm_setting_wireless_security.go (98%) rename {network => network1}/proxychains/check.go (100%) rename {network => network1}/proxychains/config.go (97%) rename {network => network1}/proxychains/exported_methods_auto.go (100%) rename {network => network1}/proxychains/proxychains.go (97%) rename {network => network1}/proxychains/utils_notify.go (90%) rename {network => network1}/secret_agent.go (99%) rename {network => network1}/state_handler.go (99%) rename {network => network1}/sync_config.go (90%) rename {network => network1}/testdata/ca.crt (100%) rename {network => network1}/testdata/ca.key (100%) rename {network => network1}/testdata/client.crt (100%) rename {network => network1}/testdata/client.key (100%) rename {network => network1}/utils.go (97%) rename {network => network1}/utils_dbus.go (82%) rename {network => network1}/utils_dbus_mm.go (98%) rename {network => network1}/utils_dbus_nm.go (99%) rename {network => network1}/utils_ethtool.go (100%) rename {network => network1}/utils_ip.go (100%) rename {network => network1}/utils_ip_be_test.go (94%) rename {network => network1}/utils_ip_le_test.go (90%) rename {network => network1}/utils_ip_test.go (100%) rename {network => network1}/utils_notify.go (97%) rename {network => network1}/utils_test.go (99%) rename {network => network1}/utils_udev.c (100%) rename {network => network1}/utils_udev.go (100%) rename {network => network1}/utils_udev.h (100%) rename {screenedge => screenedge1}/daemon.go (100%) rename {screenedge => screenedge1}/exported_methods_auto.go (100%) rename {screenedge => screenedge1}/init.go (100%) rename {screenedge => screenedge1}/manager.go (85%) rename {screenedge => screenedge1}/manager_ifc.go (98%) rename {screenedge => screenedge1}/settings.go (100%) rename {screenedge => screenedge1}/sync_config.go (100%) rename {screensaver => screensaver1}/exported_methods_auto.go (100%) rename {screensaver => screensaver1}/module.go (100%) rename {screensaver => screensaver1}/screensaver.go (96%) rename {screensaver => screensaver1}/sync_config.go (95%) rename session/{power => power1}/ambient_light_test.go (100%) rename session/{power => power1}/constant.go (100%) rename session/{power => power1}/count_ticker.go (100%) rename session/{power => power1}/daemon.go (100%) rename session/{power => power1}/delayed_task.go (100%) rename session/{power => power1}/exported_methods_auto.go (100%) rename session/{power => power1}/helper.go (73%) rename session/{power => power1}/lid_switch.go (97%) rename session/{power => power1}/manager.go (94%) rename session/{power => power1}/manager_ambient_light.go (100%) rename session/{power => power1}/manager_events.go (97%) rename session/{power => power1}/manager_stub.go (94%) rename session/{power => power1}/power_dbusutil.go (100%) rename session/{power => power1}/power_save_plan.go (99%) rename session/{power => power1}/power_test.go (100%) rename session/{power => power1}/sleep_inhibit.go (89%) rename session/{power => power1}/submodule.go (100%) rename session/{power => power1}/sync_config.go (100%) rename session/{power => power1}/utils.go (95%) rename session/{power => power1}/warn_level.go (100%) rename session/{power => power1}/warn_level_config.go (99%) rename session/{uadpagent => uadpagent1}/exported_methods_auto.go (100%) rename session/{uadpagent => uadpagent1}/module.go (100%) rename session/{uadpagent => uadpagent1}/uadpagent.go (96%) rename {sessionwatcher => sessionwatcher1}/exported_methods_auto.go (100%) rename {sessionwatcher => sessionwatcher1}/manager.go (95%) rename {sessionwatcher => sessionwatcher1}/sessionwatcher.go (100%) rename {sessionwatcher => sessionwatcher1}/utils.go (100%) rename {soundeffect => soundeffect1}/exported_methods_auto.go (100%) rename {soundeffect => soundeffect1}/manager.go (95%) rename {soundeffect => soundeffect1}/soundeffect.go (100%) rename system/{airplane_mode => airplane_mode1}/airplane_mode.go (100%) rename system/{airplane_mode => airplane_mode1}/airplane_mode_dbusutil.go (100%) rename system/{airplane_mode => airplane_mode1}/config.go (100%) rename system/{airplane_mode => airplane_mode1}/define.go (100%) rename system/{airplane_mode => airplane_mode1}/exported_methods_auto.go (100%) rename system/{airplane_mode => airplane_mode1}/manager.go (94%) rename system/{airplane_mode => airplane_mode1}/rfkill.go (87%) rename system/{airplane_mode => airplane_mode1}/utils.go (100%) rename system/{bluetooth => bluetooth1}/a2dp_workaround.go (91%) rename system/{bluetooth => bluetooth1}/adapter.go (97%) rename system/{bluetooth => bluetooth1}/agent.go (73%) rename system/{bluetooth => bluetooth1}/auto_connect_manager.go (98%) rename system/{bluetooth => bluetooth1}/bluetooth.go (95%) rename system/{bluetooth => bluetooth1}/bluetooth_dbusutil.go (100%) rename system/{bluetooth => bluetooth1}/bluetooth_ifc.go (97%) rename system/{bluetooth => bluetooth1}/bluez_profile.go (100%) rename system/{bluetooth => bluetooth1}/bluez_uuid.go (100%) rename system/{bluetooth => bluetooth1}/config.go (100%) rename system/{bluetooth => bluetooth1}/config_test.go (99%) rename system/{bluetooth => bluetooth1}/device.go (98%) rename system/{bluetooth => bluetooth1}/doc.go (100%) rename system/{bluetooth => bluetooth1}/exported_methods_auto.go (100%) rename system/{bluetooth => bluetooth1}/init.go (100%) rename system/{bluetooth => bluetooth1}/module.go (100%) rename system/{bluetooth => bluetooth1}/utils.go (100%) rename system/{bluetooth => bluetooth1}/utils_notify.go (100%) rename system/{bluetooth => bluetooth1}/utils_test.go (100%) rename system/{display => display1}/display_test.go (98%) rename system/{display => display1}/displaycfg.go (98%) rename system/{display => display1}/exported_methods_auto.go (97%) rename system/{display => display1}/module.go (98%) rename system/{gesture => gesture1}/config.go (97%) rename system/{gesture => gesture1}/config_test.go (96%) rename system/{gesture => gesture1}/core.c (100%) rename system/{gesture => gesture1}/core.h (100%) rename system/{gesture => gesture1}/exported_methods_auto.go (97%) rename system/{gesture => gesture1}/gesture.go (97%) rename system/{gesture => gesture1}/gesture_test.go (99%) rename system/{gesture => gesture1}/testdata/conf (100%) rename system/{gesture => gesture1}/touchscreen_core.c (96%) rename system/{gesture => gesture1}/touchscreen_core.h (100%) rename system/{gesture => gesture1}/utils.c (100%) rename system/{gesture => gesture1}/utils.h (100%) rename system/{inputdevices => inputdevices1}/daemon.go (87%) rename system/{inputdevices => inputdevices1}/dde-libinput.c (100%) rename system/{inputdevices => inputdevices1}/dde-libinput.h (100%) rename system/{inputdevices => inputdevices1}/exported_methods_auto.go (96%) rename system/{inputdevices => inputdevices1}/inputdevices.go (95%) rename system/{inputdevices => inputdevices1}/inputdevices_dbusutil.go (97%) rename system/{inputdevices => inputdevices1}/inputdevices_ifc.go (87%) rename system/{inputdevices => inputdevices1}/inputdevices_test.go (95%) rename system/{inputdevices => inputdevices1}/libinput.go (98%) rename system/{inputdevices => inputdevices1}/libinput_test.go (95%) rename system/{inputdevices => inputdevices1}/touchpad.go (90%) rename system/{inputdevices => inputdevices1}/touchscreen.go (87%) rename system/{keyevent => keyevent1}/daemon.go (90%) rename system/{keyevent => keyevent1}/exported_methods_auto.go (91%) rename system/{keyevent => keyevent1}/keycode.go (99%) rename system/{keyevent => keyevent1}/libinput_bridge.c (100%) rename system/{keyevent => keyevent1}/libinput_bridge.go (97%) rename system/{keyevent => keyevent1}/libinput_bridge.h (100%) rename system/{keyevent => keyevent1}/manager.go (95%) rename system/{keyevent => keyevent1}/manager_test.go (97%) rename system/{keyevent => keyevent1}/private_keycode.go (93%) rename system/{network => network1}/cherry.go (95%) rename system/{network => network1}/config.go (98%) rename system/{network => network1}/config_test.go (97%) rename system/{network => network1}/exported_methods_auto.go (97%) rename system/{network => network1}/network.go (97%) rename system/{network => network1}/network_dbusutil.go (95%) rename system/{network => network1}/network_test.go (97%) rename system/{network => network1}/ping.go (99%) rename system/{network => network1}/ping_test.go (98%) rename system/{network => network1}/testdata/config.json (100%) rename system/{network => network1}/testdata/config2.json (100%) rename system/{network => network1}/utils.go (94%) rename system/{network => network1}/utils_udev.c (100%) rename system/{network => network1}/utils_udev.h (100%) rename system/{power => power1}/battery.go (99%) rename system/{power => power1}/battery_display.go (100%) rename system/{power => power1}/battery_display_test.go (100%) rename system/{power => power1}/battery_history.go (100%) rename system/{power => power1}/battery_history_test.go (100%) rename system/{power => power1}/battery_test.go (100%) rename system/{power => power1}/daemon.go (99%) rename system/{power => power1}/exported_methods_auto.go (100%) rename system/{power => power1}/lid_switch.go (100%) rename system/{power => power1}/lid_switch_common.go (93%) rename system/{power => power1}/lid_switch_common_test.go (100%) rename system/{power => power1}/lid_switch_sw.go (100%) rename system/{power => power1}/manager.go (99%) rename system/{power => power1}/manager_ifc.go (95%) rename system/{power => power1}/manager_powersave.go (100%) rename system/{power => power1}/power_dbusutil.go (100%) rename system/{power => power1}/power_key_edit.go (96%) rename system/{power => power1}/power_key_edit_test.go (99%) rename system/{power => power1}/power_test.go (94%) rename system/{power => power1}/testdata/scaling_available_governors (100%) rename system/{power => power1}/testdata/scaling_governor (100%) rename system/{power => power1}/testdata/scaling_governor2 (100%) rename system/{power => power1}/testdata/setGovernor/scaling_governor (100%) rename system/{power_manager => power_manager1}/daemon.go (90%) rename system/{power_manager => power_manager1}/exported_methods_auto.go (100%) rename system/{power_manager => power_manager1}/manager.go (95%) rename system/{power_manager => power_manager1}/power_manager_dbusutil.go (100%) rename system/{power_manager => power_manager1}/utils.go (100%) rename system/{swapsched => swapsched1}/exported_methods_auto.go (100%) rename system/{swapsched => swapsched1}/swapsched.go (94%) rename system/{systeminfo => systeminfo1}/exported_methods_auto.go (100%) rename system/{systeminfo => systeminfo1}/manager.go (96%) rename system/{systeminfo => systeminfo1}/systeminfo.go (99%) rename system/{systeminfo => systeminfo1}/systeminfo_dbusutil.go (100%) rename system/{systeminfo => systeminfo1}/systeminfo_test.go (100%) rename system/{timedated => timedate1}/exported_methods_auto.go (100%) rename system/{timedated => timedate1}/manager.go (91%) rename system/{timedated => timedate1}/manager_ifc.go (97%) rename system/{timedated => timedate1}/timedated.go (100%) rename system/{timedated => timedate1}/timedated_dbusutil.go (100%) rename system/{uadp => uadp1}/aes.go (100%) rename system/{uadp => uadp1}/crypto.c (100%) rename system/{uadp => uadp1}/crypto.go (100%) rename system/{uadp => uadp1}/crypto.h (100%) rename system/{uadp => uadp1}/crypto_test.go (100%) rename system/{uadp => uadp1}/daemon.go (92%) rename system/{uadp => uadp1}/data_manager.go (100%) rename system/{uadp => uadp1}/data_manager_test.go (100%) rename system/{uadp => uadp1}/dde_tc.c (100%) rename system/{uadp => uadp1}/dde_tc.h (100%) rename system/{uadp => uadp1}/dde_tc_copy.h (100%) rename system/{uadp => uadp1}/exported_methods_auto.go (100%) rename system/{uadp => uadp1}/manager.go (99%) rename {systeminfo => systeminfo1}/cache.go (100%) rename {systeminfo => systeminfo1}/cpu.go (81%) rename {systeminfo => systeminfo1}/disk.go (97%) rename {systeminfo => systeminfo1}/distro.go (100%) rename {systeminfo => systeminfo1}/exported_methods_auto.go (100%) rename {systeminfo => systeminfo1}/info.go (91%) rename {systeminfo => systeminfo1}/info_test.go (100%) rename {systeminfo => systeminfo1}/init.go (100%) rename {systeminfo => systeminfo1}/lsblk_disk.go (100%) rename {systeminfo => systeminfo1}/testdata/arm-cpuinfo (100%) rename {systeminfo => systeminfo1}/testdata/cpuinfo (100%) rename {systeminfo => systeminfo1}/testdata/deepin-version (100%) rename {systeminfo => systeminfo1}/testdata/hw_kirin-cpuinfo (100%) rename {systeminfo => systeminfo1}/testdata/loonson3-cpuinfo (100%) rename {systeminfo => systeminfo1}/testdata/lsCPU (100%) rename {systeminfo => systeminfo1}/testdata/lsb-release (100%) rename {systeminfo => systeminfo1}/testdata/meminfo (100%) rename {systeminfo => systeminfo1}/testdata/sw-cpuinfo (100%) rename {systeminfo => systeminfo1}/testdata/systeminfo.cache (100%) rename {systeminfo => systeminfo1}/utils.go (93%) rename {systeminfo => systeminfo1}/version.go (100%) rename {timedate => timedate1}/daemon.go (98%) rename {timedate => timedate1}/daemon_test.go (100%) rename {timedate => timedate1}/exported_methods_auto.go (100%) rename {timedate => timedate1}/handle_event.go (100%) rename {timedate => timedate1}/init.go (100%) rename {timedate => timedate1}/manager.go (92%) rename {timedate => timedate1}/manager_format.go (93%) rename {timedate => timedate1}/manager_ifc.go (98%) rename {timedate => timedate1}/manager_test.go (100%) rename {timedate => timedate1}/timedate_dbusutil.go (100%) rename {timedate => timedate1}/timedate_format_dbusutil.go (100%) rename {timedate => timedate1}/utils.go (100%) rename {timedate => timedate1}/utils_test.go (100%) rename {timedate => timedate1}/zoneinfo/testdata/dst_data (100%) rename {timedate => timedate1}/zoneinfo/testdata/zone1970.tab (100%) rename {timedate => timedate1}/zoneinfo/timestamp.c (100%) rename {timedate => timedate1}/zoneinfo/timestamp.h (100%) rename {timedate => timedate1}/zoneinfo/wrapper.go (100%) rename {timedate => timedate1}/zoneinfo/zdump.c (100%) rename {timedate => timedate1}/zoneinfo/zdump.h (100%) rename {timedate => timedate1}/zoneinfo/zone.go (100%) rename {timedate => timedate1}/zoneinfo/zone_test.go (100%) rename {trayicon => trayicon1}/daemon.go (98%) rename {trayicon => trayicon1}/daemon_test.go (100%) rename {trayicon => trayicon1}/exported_methods_auto.go (93%) rename {trayicon => trayicon1}/icon.go (100%) rename {trayicon => trayicon1}/init.go (100%) rename {trayicon => trayicon1}/status-notifier-watcher.go (97%) rename {trayicon => trayicon1}/status-notifier-watcher_test.go (94%) rename {trayicon => trayicon1}/tools.go (100%) rename {trayicon => trayicon1}/trayicon_dbusutil.go (100%) rename {trayicon => trayicon1}/traymanager.go (99%) rename {trayicon => trayicon1}/traymanager_ifc.go (91%) rename {trayicon => trayicon1}/traymanager_ifc_test.go (100%) rename {x_event_monitor => x_event_monitor1}/daemon.go (93%) rename {x_event_monitor => x_event_monitor1}/daemon_test.go (100%) rename {x_event_monitor => x_event_monitor1}/exported_methods_auto.go (100%) rename {x_event_monitor => x_event_monitor1}/manager.go (95%) rename {x_event_monitor => x_event_monitor1}/manager_test.go (99%) rename {x_event_monitor => x_event_monitor1}/mousearea_test.go (100%) rename {x_event_monitor => x_event_monitor1}/utils.go (86%) rename {x_event_monitor => x_event_monitor1}/utils_test.go (66%) diff --git a/.gitignore b/.gitignore index 4e8b63b00..4e401aeda 100644 --- a/.gitignore +++ b/.gitignore @@ -11,24 +11,24 @@ _* grub2/grub2 grub2/testdata/tmp_* themes/themes -network/network -accounts/accounts -audio/audio +network1/network +accounts1/accounts +audio1/audio datetime/datetime deepin-daemon/deepin-daemon desktop-toggle/desktop-toggle display/display dock-apps-builder/dock-apps-builder dock-daemon/dock-daemon -inputdevices/inputdevices -keybinding/keybinding +inputdevices1/inputdevices +keybinding1/keybinding launcher-daemon/launcher-daemon mime/mime mounts/mounts power/power system-info/system-info zone-settings/zone-settings -bluetooth/bluetooth +bluetooth1/bluetooth main_network.go bin/default-terminal/default-terminal bin/default-file-manager/default-file-manager diff --git a/.obs/workflows.yml b/.obs/workflows.yml new file mode 100644 index 000000000..9a3e95dab --- /dev/null +++ b/.obs/workflows.yml @@ -0,0 +1,44 @@ +test_build: + steps: + - link_package: + source_project: deepin:Develop:dde + source_package: %{SCM_REPOSITORY_NAME} + target_project: deepin:CI + + - configure_repositories: + project: deepin:CI + repositories: + - name: deepin_develop + paths: + - target_project: deepin:CI + target_repository: deepin_develop + architectures: + - x86_64 + - aarch64 + + - name: debian + paths: + - target_project: deepin:CI + target_repository: debian_sid + architectures: + - x86_64 + + filters: + event: pull_request + +tag_build: + steps: + - branch_package: + source_project: deepin:Develop:dde + source_package: %{SCM_REPOSITORY_NAME} + target_project: deepin:Unstable:dde + filters: + event: tag_push + +commit_build: + steps: + - trigger_services: + project: deepin:Develop:dde + package: %{SCM_REPOSITORY_NAME} + filters: + event: push diff --git a/.reuse/dep5 b/.reuse/dep5 index 1e4bb1506..0c78405d4 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -9,7 +9,7 @@ Copyright: None License: CC0-1.0 # ci -Files: .github/* .gitlab-ci.yml +Files: .github/* .obs/* .gitlab-ci.yml Copyright: None License: CC0-1.0 diff --git a/.tx/config b/.tx/config index 40e38f06d..575a77a50 100644 --- a/.tx/config +++ b/.tx/config @@ -10,19 +10,19 @@ source_lang = en type = PO [o:linuxdeepin:p:deepin-desktop-environment:r:dde-daemon-grub2-policyts] -file_filter = misc/ts/com.deepin.daemon.Grub2.policy/policy_.ts -source_file = misc/ts/com.deepin.daemon.Grub2.policy/policy.ts +file_filter = misc/ts/org.deepin.dde.grub2.policy/policy_.ts +source_file = misc/ts/org.deepin.dde.grub2.policy/policy.ts source_lang = en type = QT [o:linuxdeepin:p:deepin-desktop-environment:r:dde-daemon-accounts-policyts] -file_filter = misc/ts/com.deepin.daemon.accounts.policy/policy_.ts -source_file = misc/ts/com.deepin.daemon.accounts.policy/policy.ts +file_filter = misc/ts/org.deepin.dde.accounts.policy/policy_.ts +source_file = misc/ts/org.deepin.dde.accounts.policy/policy.ts source_lang = en type = QT [o:linuxdeepin:p:deepin-desktop-environment:r:dde-daemon-fprintd-policyts] -file_filter = misc/ts/com.deepin.daemon.Fprintd.policy/policy_.ts -source_file = misc/ts/com.deepin.daemon.Fprintd.policy/policy.ts +file_filter = misc/ts/org.deepin.dde.fprintd.policy/policy_.ts +source_file = misc/ts/org.deepin.dde.fprintd.policy/policy.ts source_lang = en type = QT diff --git a/.tx/deepin.conf b/.tx/deepin.conf index 45cd054c3..2d7ce1709 100644 --- a/.tx/deepin.conf +++ b/.tx/deepin.conf @@ -1,2 +1,2 @@ [transifex] -branch = m20 \ No newline at end of file +branch = m23 diff --git a/CHANGELOG.md b/CHANGELOG.md index 71ce79216..470d16b16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,7 +47,7 @@ * feat(dde-session-daemon): sync login sound config after all module started * fix(soundeffect): still play login sound even if sound effect switch is off * chore: auto pull translation files from transifex -* change(api): com.deepin.daemon.Greeter add method UpdateGreeterQtTheme +* change(api): org.deepin.dde.Greeter1 add method UpdateGreeterQtTheme * fix: ScreenScaleFactors cannot be easily parsed by greeter * feat: also set the screen scale factors of the greeter * fix(accounts): user was not added to some groups when creating user @@ -68,7 +68,7 @@ * chore(langselector): remove failed test * fix(audio): trySelectBestPort do not work * change(api): sound effect add more functions -* change(api): add sytem service com.deepin.system.Network +* change(api): add sytem service org.deepin.dde.Network1 [3.23.1] 2019-03-01 * feat(bluetooth): when disconnected quickly after connecting, automatically try to connect @@ -531,7 +531,7 @@ ## [3.2.4] - 2017-11-09 #### Features -* add com.deepin.daemon.ImageBlur interface +* add org.deepin.dde.ImageBlur1 interface #### Bug Fixes * not show newly installed wechat in launcher diff --git a/Makefile b/Makefile index a2b13cddb..1533906fc 100644 --- a/Makefile +++ b/Makefile @@ -2,22 +2,110 @@ PREFIX = /usr GOPATH_DIR = gopath GOPKG_PREFIX = github.com/linuxdeepin/dde-daemon GOBUILD = go build $(GO_BUILD_FLAGS) -export GO111MODULE=off export GOPATH=$(shell go env GOPATH) +ifneq (${shell uname -m}, mips64el) + GOBUILD_OPTIONS = -ldflags '-linkmode=external -extldflags "-pie"' +endif + +TEST = \ + ${GOPKG_PREFIX}/accounts1 \ + ${GOPKG_PREFIX}/accounts1/checkers \ + ${GOPKG_PREFIX}/accounts1/logined \ + ${GOPKG_PREFIX}/accounts1/users \ + ${GOPKG_PREFIX}/appinfo \ + ${GOPKG_PREFIX}/apps1 \ + ${GOPKG_PREFIX}/audio1 \ + ${GOPKG_PREFIX}/bin/backlight_helper \ + ${GOPKG_PREFIX}/bin/backlight_helper/ddcci \ + ${GOPKG_PREFIX}/bin/dde-authority \ + ${GOPKG_PREFIX}/bin/dde-greeter-setter \ + ${GOPKG_PREFIX}/bin/dde-lockservice \ + ${GOPKG_PREFIX}/bin/dde-session-daemon \ + ${GOPKG_PREFIX}/bin/dde-system-daemon \ + ${GOPKG_PREFIX}/bin/default-terminal \ + ${GOPKG_PREFIX}/bin/grub2 \ + ${GOPKG_PREFIX}/bin/langselector \ + ${GOPKG_PREFIX}/bin/search \ + ${GOPKG_PREFIX}/bin/soundeffect \ + ${GOPKG_PREFIX}/bin/user-config \ + ${GOPKG_PREFIX}/bluetooth1 \ + ${GOPKG_PREFIX}/calltrace \ + ${GOPKG_PREFIX}/clipboard1 \ + ${GOPKG_PREFIX}/clipboard1/mocks \ + ${GOPKG_PREFIX}/common/bluetooth \ + ${GOPKG_PREFIX}/common/dsync \ + ${GOPKG_PREFIX}/common/sessionmsg \ + ${GOPKG_PREFIX}/dbus \ + ${GOPKG_PREFIX}/debug \ + ${GOPKG_PREFIX}/fprintd1 \ + ${GOPKG_PREFIX}/fprintd1/common \ + ${GOPKG_PREFIX}/gesture1 \ + ${GOPKG_PREFIX}/graph \ + ${GOPKG_PREFIX}/grub2 \ + ${GOPKG_PREFIX}/grub_common \ + ${GOPKG_PREFIX}/grub_gfx \ + ${GOPKG_PREFIX}/housekeeping \ + ${GOPKG_PREFIX}/image_effect1 \ + ${GOPKG_PREFIX}/inputdevices1 \ + ${GOPKG_PREFIX}/inputdevices1/iso639 \ + ${GOPKG_PREFIX}/iw \ + ${GOPKG_PREFIX}/keybinding1 \ + ${GOPKG_PREFIX}/keybinding1/shortcuts \ + ${GOPKG_PREFIX}/keybinding1/util \ + ${GOPKG_PREFIX}/langselector1 \ + ${GOPKG_PREFIX}/lastore1 \ + ${GOPKG_PREFIX}/loader \ + ${GOPKG_PREFIX}/network1 \ + ${GOPKG_PREFIX}/network1/nm \ + ${GOPKG_PREFIX}/network1/nm_generator \ + ${GOPKG_PREFIX}/network1/proxychains \ + ${GOPKG_PREFIX}/screenedge1 \ + ${GOPKG_PREFIX}/screensaver1 \ + ${GOPKG_PREFIX}/service_trigger \ + ${GOPKG_PREFIX}/session/common \ + ${GOPKG_PREFIX}/session/eventlog \ + ${GOPKG_PREFIX}/session/power1 \ + ${GOPKG_PREFIX}/session/uadpagent1 \ + ${GOPKG_PREFIX}/sessionwatcher1 \ + ${GOPKG_PREFIX}/soundeffect1 \ + ${GOPKG_PREFIX}/system/airplane_mode1 \ + ${GOPKG_PREFIX}/system/bluetooth1 \ + ${GOPKG_PREFIX}/system/display1 \ + ${GOPKG_PREFIX}/system/gesture1 \ + ${GOPKG_PREFIX}/system/hostname \ + ${GOPKG_PREFIX}/system/inputdevices1 \ + ${GOPKG_PREFIX}/system/keyevent1 \ + ${GOPKG_PREFIX}/system/lang \ + ${GOPKG_PREFIX}/system/network1 \ + ${GOPKG_PREFIX}/system/power1 \ + ${GOPKG_PREFIX}/system/power_manager1 \ + ${GOPKG_PREFIX}/system/resource_ctl \ + ${GOPKG_PREFIX}/system/scheduler \ + ${GOPKG_PREFIX}/system/swapsched1 \ + ${GOPKG_PREFIX}/system/systeminfo1 \ + ${GOPKG_PREFIX}/system/timedate1 \ + ${GOPKG_PREFIX}/system/uadp1 \ + ${GOPKG_PREFIX}/systeminfo1 \ + ${GOPKG_PREFIX}/timedate1 \ + ${GOPKG_PREFIX}/trayicon1 \ + ${GOPKG_PREFIX}/x_event_monitor1 \ + ${GOPKG_PREFIX}/bin/default-file-manager + #${GOPKG_PREFIX}/timedate1/zoneinfo \ + BINARIES = \ dde-session-daemon \ dde-system-daemon \ grub2 \ search \ - theme-thumb-tool \ backlight_helper \ langselector \ soundeffect \ dde-lockservice \ dde-authority \ default-terminal \ - dde-greeter-setter + dde-greeter-setter \ + default-file-manager LANGUAGES = $(basename $(notdir $(wildcard misc/po/*.po))) @@ -33,9 +121,6 @@ prepare: out/bin/%: prepare env GOPATH="${CURDIR}/${GOPATH_DIR}:${GOPATH}" ${GOBUILD} -o $@ ${GOBUILD_OPTIONS} ${GOPKG_PREFIX}/bin/${@F} -out/bin/default-file-manager: bin/default-file-manager/main.c - gcc $^ $(shell pkg-config --cflags --libs gio-unix-2.0) $(CFLAGS) -o $@ - out/bin/desktop-toggle: bin/desktop-toggle/main.c gcc $^ $(shell pkg-config --cflags --libs x11) $(CFLAGS) -o $@ @@ -48,22 +133,21 @@ translate: $(addsuffix /LC_MESSAGES/dde-daemon.mo, $(addprefix out/locale/, ${LA pot: deepin-update-pot misc/po/locale_config.ini -POLICIES=accounts Grub2 Fprintd +POLICIES=accounts1 Grub2 Fprintd1 ts: for i in $(POLICIES); do \ - deepin-policy-ts-convert policy2ts misc/polkit-action/com.deepin.daemon.$$i.policy.in misc/ts/com.deepin.daemon.$$i.policy; \ + deepin-policy-ts-convert policy2ts misc/polkit-action/org.deepin.dde.$$i.policy.in misc/ts/org.deepin.dde.$$i.policy; \ done ts_to_policy: for i in $(POLICIES); do \ - deepin-policy-ts-convert ts2policy misc/polkit-action/com.deepin.daemon.$$i.policy.in misc/ts/com.deepin.daemon.$$i.policy misc/polkit-action/com.deepin.daemon.$$i.policy; \ + deepin-policy-ts-convert ts2policy misc/polkit-action/org.deepin.dde.$$i.policy.in misc/ts/org.deepin.dde.$$i.policy misc/polkit-action/org.deepin.dde.$$i.policy; \ done build: prepare out/bin/default-terminal out/bin/default-file-manager out/bin/desktop-toggle $(addprefix out/bin/, ${BINARIES}) ts_to_policy icons translate test: prepare - env GOPATH="${CURDIR}/${GOPATH_DIR}:${GOPATH}" go test -v ./... - + env GOPATH="${CURDIR}/${GOPATH_DIR}:${GOPATH}" go test -v ${TEST} test-coverage: prepare env GOPATH="${CURDIR}/${GOPATH_DIR}:${GOPATH}" go test -cover -v ./... | awk '$$2 ~ "_${CURDIR}" {print $$2","$$5}' | sed "s:${CURDIR}::g" | sed 's/files\]/0\.0%/g' > coverage.csv @@ -94,8 +178,17 @@ install: build install-dde-data install-icons cp -r misc/dde-daemon/* ${DESTDIR}${PREFIX}/share/dde-daemon/ cp -r misc/usr/share/deepin ${DESTDIR}${PREFIX}/share/ + mkdir -pv ${DESTDIR}/lib/systemd/user/ + cp -f misc/systemd/services/user/* ${DESTDIR}/lib/systemd/user/ + + mkdir -pv ${DESTDIR}/lib/systemd/system/ + cp -f misc/systemd/services/system/* ${DESTDIR}/lib/systemd/system/ + + mkdir -p $(DESTDIR)$(PREFIX)/lib/systemd/user/dde-session-initialized.target.wants/ + ln -s $(PREFIX)/lib/systemd/user/org.dde.session.Daemon1.service $(DESTDIR)$(PREFIX)/lib/systemd/user/dde-session-initialized.target.wants/org.dde.session.Daemon1.service + mkdir -pv ${DESTDIR}/lib/systemd/system/ - cp -f misc/systemd/services/* ${DESTDIR}/lib/systemd/system/ + cp -f misc/systemd/system-services/* ${DESTDIR}/lib/systemd/system/ mkdir -pv ${DESTDIR}/etc/pam.d/ cp -f misc/etc/pam.d/* ${DESTDIR}/etc/pam.d/ @@ -118,9 +211,8 @@ install: build install-dde-data install-icons mkdir -pv ${DESTDIR}/lib/udev/rules.d cp -f misc/udev-rules/*.rules ${DESTDIR}/lib/udev/rules.d/ - mkdir -pv ${DESTDIR}/usr/lib/deepin-daemon/service-trigger - cp -f misc/service-trigger/*.json ${DESTDIR}/usr/lib/deepin-daemon/service-trigger/ - cp -f misc/service-trigger/*.sh ${DESTDIR}/usr/lib/deepin-daemon/service-trigger/ + mkdir -pv ${DESTDIR}${PREFIX}/lib/deepin-daemon/service-trigger + cp -f misc/service-trigger/*.json ${DESTDIR}${PREFIX}/lib/deepin-daemon/service-trigger/ mkdir -pv ${DESTDIR}/etc/NetworkManager/conf.d cp -f misc/etc/NetworkManager/conf.d/* ${DESTDIR}/etc/NetworkManager/conf.d/ @@ -130,9 +222,8 @@ install: build install-dde-data install-icons mkdir -pv ${DESTDIR}${PREFIX}/share/dsg/configs/org.deepin.dde.daemon/ cp -r misc/dsg-configs/*.json ${DESTDIR}${PREFIX}/share/dsg/configs/org.deepin.dde.daemon/ - mkdir -pv ${DESTDIR}${PREFIX}/share/dsg/configs/org.deepin.dde.lightdm-deepin-greeter - cp -r misc/dsg-configs/org.deepin.dde.lightdm-deepin-greeter/*.json ${DESTDIR}${PREFIX}/share/dsg/configs/org.deepin.dde.lightdm-deepin-greeter/ + cp -f misc/scripts/dde-lock.sh ${DESTDIR}${PREFIX}/lib/deepin-daemon/ install-dde-data: mkdir -pv ${DESTDIR}${PREFIX}/share/dde/ cp -r misc/data ${DESTDIR}${PREFIX}/share/dde/ diff --git a/accounts/accounts.go b/accounts1/accounts.go similarity index 97% rename from accounts/accounts.go rename to accounts1/accounts.go index 6df2b13be..b261209bd 100644 --- a/accounts/accounts.go +++ b/accounts1/accounts.go @@ -5,7 +5,7 @@ package accounts import ( - "github.com/linuxdeepin/dde-daemon/accounts/logined" + "github.com/linuxdeepin/dde-daemon/accounts1/logined" "github.com/linuxdeepin/dde-daemon/loader" "github.com/linuxdeepin/go-lib/log" ) diff --git a/accounts/accounts_dbusutil.go b/accounts1/accounts_dbusutil.go similarity index 97% rename from accounts/accounts_dbusutil.go rename to accounts1/accounts_dbusutil.go index 6735bf92a..c1b1301e8 100644 --- a/accounts/accounts_dbusutil.go +++ b/accounts1/accounts_dbusutil.go @@ -2,6 +2,58 @@ package accounts +func (v *Manager) setPropAllowGuest(value bool) (changed bool) { + if v.AllowGuest != value { + v.AllowGuest = value + v.emitPropChangedAllowGuest(value) + return true + } + return false +} + +func (v *Manager) emitPropChangedAllowGuest(value bool) error { + return v.service.EmitPropertyChanged(v, "AllowGuest", value) +} + +func (v *Manager) setPropGroupList(value []string) (changed bool) { + if !isStrvEqual(v.GroupList, value) { + v.GroupList = value + v.emitPropChangedGroupList(value) + return true + } + return false +} + +func (v *Manager) emitPropChangedGroupList(value []string) error { + return v.service.EmitPropertyChanged(v, "GroupList", value) +} + +func (v *Manager) setPropIsTerminalLocked(value bool) (changed bool) { + if v.IsTerminalLocked != value { + v.IsTerminalLocked = value + v.emitPropChangedIsTerminalLocked(value) + return true + } + return false +} + +func (v *Manager) emitPropChangedIsTerminalLocked(value bool) error { + return v.service.EmitPropertyChanged(v, "IsTerminalLocked", value) +} + +func (v *Manager) setPropQuickLoginEnabled(value bool) (changed bool) { + if v.QuickLoginEnabled != value { + v.QuickLoginEnabled = value + v.emitPropChangedQuickLoginEnabled(value) + return true + } + return false +} + +func (v *Manager) emitPropChangedQuickLoginEnabled(value bool) error { + return v.service.EmitPropertyChanged(v, "QuickLoginEnabled", value) +} + func (v *User) setPropUserName(value string) (changed bool) { if v.UserName != value { v.UserName = value @@ -458,54 +510,15 @@ func (v *User) emitPropChangedHistoryLayout(value []string) error { return v.service.EmitPropertyChanged(v, "HistoryLayout", value) } -func (v *Manager) setPropAllowGuest(value bool) (changed bool) { - if v.AllowGuest != value { - v.AllowGuest = value - v.emitPropChangedAllowGuest(value) - return true - } - return false -} - -func (v *Manager) emitPropChangedAllowGuest(value bool) error { - return v.service.EmitPropertyChanged(v, "AllowGuest", value) -} - -func (v *Manager) setPropGroupList(value []string) (changed bool) { - if !isStrvEqual(v.GroupList, value) { - v.GroupList = value - v.emitPropChangedGroupList(value) - return true - } - return false -} - -func (v *Manager) emitPropChangedGroupList(value []string) error { - return v.service.EmitPropertyChanged(v, "GroupList", value) -} - -func (v *Manager) setPropIsTerminalLocked(value bool) (changed bool) { - if v.IsTerminalLocked != value { - v.IsTerminalLocked = value - v.emitPropChangedIsTerminalLocked(value) - return true - } - return false -} - -func (v *Manager) emitPropChangedIsTerminalLocked(value bool) error { - return v.service.EmitPropertyChanged(v, "IsTerminalLocked", value) -} - -func (v *Manager) setPropQuickLoginEnabled(value bool) (changed bool) { - if v.QuickLoginEnabled != value { - v.QuickLoginEnabled = value - v.emitPropChangedQuickLoginEnabled(value) +func (v *User) setPropWechatAuthEnabled(value bool) (changed bool) { + if v.WechatAuthEnabled != value { + v.WechatAuthEnabled = value + v.emitPropChangedWechatAuthEnabled(value) return true } return false } -func (v *Manager) emitPropChangedQuickLoginEnabled(value bool) error { - return v.service.EmitPropertyChanged(v, "QuickLoginEnabled", value) +func (v *User) emitPropChangedWechatAuthEnabled(value bool) error { + return v.service.EmitPropertyChanged(v, "WechatAuthEnabled", value) } diff --git a/accounts/checkers/checkers_test.go b/accounts1/checkers/checkers_test.go similarity index 100% rename from accounts/checkers/checkers_test.go rename to accounts1/checkers/checkers_test.go diff --git a/accounts/checkers/common.go b/accounts1/checkers/common.go similarity index 100% rename from accounts/checkers/common.go rename to accounts1/checkers/common.go diff --git a/accounts/checkers/common_test.go b/accounts1/checkers/common_test.go similarity index 100% rename from accounts/checkers/common_test.go rename to accounts1/checkers/common_test.go diff --git a/accounts/checkers/password.go b/accounts1/checkers/password.go similarity index 100% rename from accounts/checkers/password.go rename to accounts1/checkers/password.go diff --git a/accounts/checkers/testdata/passwd b/accounts1/checkers/testdata/passwd similarity index 100% rename from accounts/checkers/testdata/passwd rename to accounts1/checkers/testdata/passwd diff --git a/accounts/checkers/username.go b/accounts1/checkers/username.go similarity index 100% rename from accounts/checkers/username.go rename to accounts1/checkers/username.go diff --git a/accounts/deepinversion.go b/accounts1/deepinversion.go similarity index 100% rename from accounts/deepinversion.go rename to accounts1/deepinversion.go diff --git a/accounts/deepinversion_test.go b/accounts1/deepinversion_test.go similarity index 100% rename from accounts/deepinversion_test.go rename to accounts1/deepinversion_test.go diff --git a/accounts/exported_methods_auto.go b/accounts1/exported_methods_auto.go similarity index 97% rename from accounts/exported_methods_auto.go rename to accounts1/exported_methods_auto.go index cf9dc8369..75eecf5fb 100644 --- a/accounts/exported_methods_auto.go +++ b/accounts1/exported_methods_auto.go @@ -143,6 +143,11 @@ func (v *User) GetExportedMethods() dbusutil.ExportedMethods { Fn: v.EnableNoPasswdLogin, InArgs: []string{"enabled"}, }, + { + Name: "EnableWechatAuth", + Fn: v.EnableWechatAuth, + InArgs: []string{"value"}, + }, { Name: "GetReminderInfo", Fn: v.GetReminderInfo, @@ -299,6 +304,10 @@ func (v *User) GetExportedMethods() dbusutil.ExportedMethods { Fn: v.SetWeekdayFormat, InArgs: []string{"value"}, }, + { + Name: "UpdateWechatAuthState", + Fn: v.UpdateWechatAuthState, + }, { Name: "VerifySecretQuestions", Fn: v.VerifySecretQuestions, diff --git a/accounts/handle_event.go b/accounts1/handle_event.go similarity index 99% rename from accounts/handle_event.go rename to accounts1/handle_event.go index 331539d8f..a47949797 100644 --- a/accounts/handle_event.go +++ b/accounts1/handle_event.go @@ -11,7 +11,7 @@ import ( "time" "github.com/fsnotify/fsnotify" - "github.com/linuxdeepin/dde-daemon/accounts/users" + "github.com/linuxdeepin/dde-daemon/accounts1/users" "github.com/linuxdeepin/go-lib/strv" ) diff --git a/accounts/image_blur.go b/accounts1/image_blur.go similarity index 96% rename from accounts/image_blur.go rename to accounts1/image_blur.go index b45030139..30d1bb3f2 100644 --- a/accounts/image_blur.go +++ b/accounts1/image_blur.go @@ -11,14 +11,14 @@ import ( "path/filepath" "sync" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" dutils "github.com/linuxdeepin/go-lib/utils" ) const ( - imageBlurDBusPath = "/com/deepin/daemon/ImageBlur" - imageBlurDBusInterface = "com.deepin.daemon.ImageBlur" + imageBlurDBusPath = "/org/deepin/dde/ImageBlur1" + imageBlurDBusInterface = "org.deepin.dde.ImageBlur1" ) type ImageBlur struct { diff --git a/accounts/left_space.go b/accounts1/left_space.go similarity index 100% rename from accounts/left_space.go rename to accounts1/left_space.go diff --git a/accounts/logined/exported_methods_auto.go b/accounts1/logined/exported_methods_auto.go similarity index 100% rename from accounts/logined/exported_methods_auto.go rename to accounts1/logined/exported_methods_auto.go diff --git a/accounts/logined/login.go b/accounts1/logined/login.go similarity index 96% rename from accounts/logined/login.go rename to accounts1/logined/login.go index 3196ffec9..11a62d5dd 100644 --- a/accounts/logined/login.go +++ b/accounts1/logined/login.go @@ -9,8 +9,8 @@ import ( "fmt" "sync" - "github.com/godbus/dbus" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + "github.com/godbus/dbus/v5" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/proxy" "github.com/linuxdeepin/go-lib/log" @@ -33,7 +33,7 @@ type Manager struct { } const ( - DBusPath = "/com/deepin/daemon/Logined" + DBusPath = "/org/deepin/dde/Logined" ) // Register register and install loginedManager on dbus @@ -201,5 +201,5 @@ func (m *Manager) marshalUserSessions() string { } func (*Manager) GetInterfaceName() string { - return "com.deepin.daemon.Logined" + return "org.deepin.dde.Logined" } diff --git a/accounts/logined/user_info.go b/accounts1/logined/user_info.go similarity index 95% rename from accounts/logined/user_info.go rename to accounts1/logined/user_info.go index 68e91c434..286d337cb 100644 --- a/accounts/logined/user_info.go +++ b/accounts1/logined/user_info.go @@ -5,8 +5,8 @@ package logined import ( - "github.com/godbus/dbus" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + "github.com/godbus/dbus/v5" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" ) // SessionInfo Show logined session info, if type is tty or ssh, no desktop and display diff --git a/accounts/logined/user_info_test.go b/accounts1/logined/user_info_test.go similarity index 100% rename from accounts/logined/user_info_test.go rename to accounts1/logined/user_info_test.go diff --git a/accounts/manager.go b/accounts1/manager.go similarity index 98% rename from accounts/manager.go rename to accounts1/manager.go index 474962fbd..9a1e0e9a7 100644 --- a/accounts/manager.go +++ b/accounts1/manager.go @@ -18,16 +18,16 @@ import ( "syscall" "time" - dbus "github.com/godbus/dbus" - udcp "github.com/linuxdeepin/go-dbus-factory/com.deepin.udcp.iam" + dbus "github.com/godbus/dbus/v5" configManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + udcp "github.com/linuxdeepin/go-dbus-factory/system/com.deepin.udcp.iam" + ofdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.dbus" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/tasker" dutils "github.com/linuxdeepin/go-lib/utils" - "github.com/linuxdeepin/dde-daemon/accounts/users" + "github.com/linuxdeepin/dde-daemon/accounts1/users" "github.com/linuxdeepin/dde-daemon/common/sessionmsg" ) diff --git a/accounts/manager_ifc.go b/accounts1/manager_ifc.go similarity index 90% rename from accounts/manager_ifc.go rename to accounts1/manager_ifc.go index 95a585792..bcd0f3829 100644 --- a/accounts/manager_ifc.go +++ b/accounts1/manager_ifc.go @@ -12,12 +12,13 @@ import ( "os" "os/exec" "strconv" + "strings" "time" - "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/accounts/checkers" - "github.com/linuxdeepin/dde-daemon/accounts/users" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/accounts1/checkers" + "github.com/linuxdeepin/dde-daemon/accounts1/users" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/gettext" "github.com/linuxdeepin/go-lib/procfs" @@ -27,9 +28,9 @@ import ( const ( nilObjPath = dbus.ObjectPath("/") - dbusServiceName = "com.deepin.daemon.Accounts" - dbusPath = "/com/deepin/daemon/Accounts" - dbusInterface = "com.deepin.daemon.Accounts" + dbusServiceName = "org.deepin.dde.Accounts1" + dbusPath = "/org/deepin/dde/Accounts1" + dbusInterface = "org.deepin.dde.Accounts1" ) func (*Manager) GetInterfaceName() string { @@ -51,6 +52,24 @@ func (m *Manager) CreateUser(sender dbus.Sender, logger.Debug("[CreateUser] new user:", name, fullName, accountType) + // 判断用户名字符串长度,大于2小于32 + if len(name) < 3 || len(name) > 32 { + return nilObjPath, dbusutil.ToError(errors.New("Username must be between 3 and 32 characters")) + } + + // 用户名必需以数字或字母开始 + compStr := "1234567890" + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + if !strings.Contains(compStr, string(name[0])) { + return nilObjPath, dbusutil.ToError(errors.New("The first character must be a letter or number")) + } + + // 用户名必需是数字、字母和_-@字符组成 + compStr = compStr + "-_@" + for _, ch := range name { + if !strings.Contains(compStr, string(ch)) { + return nilObjPath, dbusutil.ToError(errors.New("Invalid user name")) + } + } err := checkAccountType(int(accountType)) if err != nil { return nilObjPath, dbusutil.ToError(err) @@ -188,6 +207,11 @@ func (m *Manager) DeleteUser(sender dbus.Sender, logger.Warningf("disable quick login for user %q failed: %v", name, err) } + // 删除用户前,清空用户的安全密钥 + err = user.deleteSecretKey() + if err != nil { + logger.Warning("Delete secret key failed") + } // 删除账户前先删除生物特征,避免删除账户后,用户数据找不到 if rmFiles { user.clearBiometricChara() @@ -526,6 +550,12 @@ func (m *Manager) SetTerminalLocked(sender dbus.Sender, locked bool) *dbus.Error return dbusutil.ToError(fmt.Errorf("current terminal lock is equal set locked: %t", locked)) } + err := m.checkAuth(sender) + if err != nil { + logger.Warning("[SetTerminalLocked] access denied:", err) + return dbusutil.ToError(err) + } + if locked { sessions, err := m.login1Manager.ListSessions(0) if err != nil { @@ -547,7 +577,7 @@ func (m *Manager) SetTerminalLocked(sender dbus.Sender, locked bool) *dbus.Error } } - err := m.dsAccount.SetValue(0, dsettingsIsTerminalLocked, dbus.MakeVariant(locked)) + err = m.dsAccount.SetValue(0, dsettingsIsTerminalLocked, dbus.MakeVariant(locked)) if err != nil { logger.Warningf("setDsgData key : %s ,value : %t err : %s", dsettingsIsTerminalLocked, locked, err) return dbusutil.ToError(err) diff --git a/accounts/reminder_info.c b/accounts1/reminder_info.c similarity index 100% rename from accounts/reminder_info.c rename to accounts1/reminder_info.c diff --git a/accounts/reminder_info.go b/accounts1/reminder_info.go similarity index 100% rename from accounts/reminder_info.go rename to accounts1/reminder_info.go diff --git a/accounts/reminder_info.h b/accounts1/reminder_info.h similarity index 100% rename from accounts/reminder_info.h rename to accounts1/reminder_info.h diff --git a/accounts/testdata/keyboard_us b/accounts1/testdata/keyboard_us similarity index 100% rename from accounts/testdata/keyboard_us rename to accounts1/testdata/keyboard_us diff --git a/accounts/testdata/keyboard_us_chr b/accounts1/testdata/keyboard_us_chr similarity index 100% rename from accounts/testdata/keyboard_us_chr rename to accounts1/testdata/keyboard_us_chr diff --git a/accounts/testdata/locale b/accounts1/testdata/locale similarity index 100% rename from accounts/testdata/locale rename to accounts1/testdata/locale diff --git a/accounts/testdata/shells b/accounts1/testdata/shells similarity index 100% rename from accounts/testdata/shells rename to accounts1/testdata/shells diff --git a/accounts/user.go b/accounts1/user.go similarity index 96% rename from accounts/user.go rename to accounts1/user.go index 67539d5eb..46d33899e 100644 --- a/accounts/user.go +++ b/accounts1/user.go @@ -16,10 +16,10 @@ import ( "strings" "sync" - dbus "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/accounts/users" - authenticate "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.authenticate" - uadp "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.uadp" + dbus "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/accounts1/users" + authenticate "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.authenticate1" + uadp "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.uadp1" glib "github.com/linuxdeepin/go-gir/glib-2.0" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/gdkpixbuf" @@ -51,6 +51,7 @@ const ( confKeyGreeterBackground = "GreeterBackground" confKeyHistoryLayout = "HistoryLayout" confKeyUse24HourFormat = "Use24HourFormat" + confKeyWechatAuthEnabled = "WechatAuthEnabled" confKeyUUID = "UUID" confKeyWorkspace = "Workspace" confKeyWeekdayFormat = "WeekdayFormat" @@ -61,14 +62,15 @@ const ( confKeyWeekBegins = "WeekBegins" confKeyPasswordHint = "PasswordHint" - defaultUse24HourFormat = true - defaultWeekdayFormat = 0 - defaultShortDateFormat = 3 - defaultLongDateFormat = 1 - defaultShortTimeFormat = 0 - defaultLongTimeFormat = 0 - defaultWeekBegins = 0 - defaultWorkspace = 1 + defaultWechatAuthEnabled = false + defaultUse24HourFormat = true + defaultWeekdayFormat = 0 + defaultShortDateFormat = 3 + defaultLongDateFormat = 1 + defaultShortTimeFormat = 0 + defaultLongTimeFormat = 0 + defaultWeekBegins = 0 + defaultWorkspace = 1 ) func getDefaultUserBackground() string { @@ -140,7 +142,8 @@ type User struct { // dbusutil-gen: equal=nil HistoryLayout []string - configLocker sync.Mutex + WechatAuthEnabled bool + configLocker sync.Mutex } func NewUser(userPath string, service *dbusutil.Service, ignoreErr bool) (*User, error) { @@ -834,6 +837,12 @@ func loadUserConfigInfo(u *User) { isSave = true } + u.WechatAuthEnabled, err = kf.GetBoolean(confGroupUser, confKeyWechatAuthEnabled) + if err != nil { + u.WechatAuthEnabled = defaultWechatAuthEnabled + isSave = true + } + u.WeekdayFormat, err = kf.GetInteger(confGroupUser, confKeyWeekdayFormat) if err != nil { u.WeekdayFormat = defaultWeekdayFormat diff --git a/accounts/user_chpwd_union_id.go b/accounts1/user_chpwd_union_id.go similarity index 98% rename from accounts/user_chpwd_union_id.go rename to accounts1/user_chpwd_union_id.go index 44da6e397..3eab230a3 100644 --- a/accounts/user_chpwd_union_id.go +++ b/accounts1/user_chpwd_union_id.go @@ -22,10 +22,10 @@ import ( "syscall" "time" - "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/accounts/users" - authenticate "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.authenticate" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/accounts1/users" + authenticate "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.authenticate1" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/procfs" dutils "github.com/linuxdeepin/go-lib/utils" diff --git a/accounts/user_created_time.go b/accounts1/user_created_time.go similarity index 100% rename from accounts/user_created_time.go rename to accounts1/user_created_time.go diff --git a/accounts/user_ifc.go b/accounts1/user_ifc.go similarity index 93% rename from accounts/user_ifc.go rename to accounts1/user_ifc.go index 3bea4e95a..9af6ead57 100644 --- a/accounts/user_ifc.go +++ b/accounts1/user_ifc.go @@ -31,9 +31,9 @@ import ( "time" "unsafe" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-api/lang_info" - "github.com/linuxdeepin/dde-daemon/accounts/users" + "github.com/linuxdeepin/dde-daemon/accounts1/users" "github.com/linuxdeepin/dde-daemon/common/sessionmsg" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/gdkpixbuf" @@ -44,8 +44,8 @@ import ( ) const ( - userDBusPathPrefix = "/com/deepin/daemon/Accounts/User" - userDBusInterface = "com.deepin.daemon.Accounts.User" + userDBusPathPrefix = "/org/deepin/dde/Accounts1/User" + userDBusInterface = "org.deepin.dde.Accounts1.User" controlCenter = "dde-control-center" resetPasswordDia = "reset-password-dialog" ) @@ -581,6 +581,62 @@ func (u *User) DeleteIconFile(sender dbus.Sender, icon string) *dbus.Error { return nil } +func (u *User) EnableWechatAuth(sender dbus.Sender, value bool) *dbus.Error { + logger.Infof("DBus call EnableWechatAuth sender %v, enabled %t", sender, value) + // 验证调用者权限 + if !u.checkIsControlCenter(sender) { + return dbusutil.ToError(fmt.Errorf("not allow %v call this method", sender)) + } + return u.enableWechatAuth(value) +} +func (u *User) UpdateWechatAuthState() *dbus.Error { + logger.Infof("DBus call UpdateWechatAuthState") + // 通过synchelper检查本地账户是否有绑定的UOS ID + syncObj := u.service.Conn().Object("com.deepin.sync.Helper", "/com/deepin/sync/Helper") + var uosid string + err := syncObj.Call("com.deepin.sync.Helper.UOSID", 0).Store(&uosid) + if err != nil { + logger.Warning(err) + return dbusutil.ToError(err) + } + var ubid string + err = syncObj.Call("com.deepin.sync.Helper.LocalBindCheck", 0, uosid, u.UUID).Store(&ubid) + if err != nil { + logger.Warning(err) + return dbusutil.ToError(err) + } + var isBindWechat bool + var wechatNickName string + err = syncObj.Call("com.deepin.sync.Helper.LocalBindCheckWechat", 0, uosid, u.UUID).Store(&isBindWechat, &wechatNickName) + if err != nil { + logger.Warning(err) + return dbusutil.ToError(err) + } + logger.Infof("DBus call UpdateWechatAuthState ubid %v, wechatNickName %v", ubid, wechatNickName) + if (ubid == "" || !isBindWechat) && u.WechatAuthEnabled { + return u.enableWechatAuth(false) + } + + return nil +} + +func (u *User) enableWechatAuth(value bool) *dbus.Error { + u.PropsMu.Lock() + defer u.PropsMu.Unlock() + + if value == u.WechatAuthEnabled { + return nil + } + + err := u.writeUserConfigWithChange(confKeyWechatAuthEnabled, value) + if err != nil { + return dbusutil.ToError(err) + } + + u.setPropWechatAuthEnabled(value) + return nil +} + func (u *User) SetDesktopBackgrounds(sender dbus.Sender, val []string) *dbus.Error { logger.Debugf("[SetDesktopBackgrounds] val: %#v", val) @@ -1226,3 +1282,12 @@ func (u *User) DeleteSecretKey(sender dbus.Sender) *dbus.Error { } return nil } + +func (u *User) deleteSecretKey() error { + if u.uadpInterface == nil { + logger.Warning("uadpInterface is nil") + return nil + } + + return u.uadpInterface.Delete(0, u.UserName) +} diff --git a/accounts/user_test.go b/accounts1/user_test.go similarity index 91% rename from accounts/user_test.go rename to accounts1/user_test.go index 369dbc83f..9c62fa68d 100644 --- a/accounts/user_test.go +++ b/accounts1/user_test.go @@ -17,7 +17,7 @@ func Test_getUidFromUserPath(t *testing.T) { }{ { name: "getUidFromUserPath", - userPath: "/com/deepin/daemon/Accounts/User1000", + userPath: "/org/deepin/dde/Accounts1/User1000", want: "1000", }, } diff --git a/accounts/users/common.go b/accounts1/users/common.go similarity index 100% rename from accounts/users/common.go rename to accounts1/users/common.go diff --git a/accounts/users/common_test.go b/accounts1/users/common_test.go similarity index 100% rename from accounts/users/common_test.go rename to accounts1/users/common_test.go diff --git a/accounts/users/display_manager.go b/accounts1/users/display_manager.go similarity index 99% rename from accounts/users/display_manager.go rename to accounts1/users/display_manager.go index ded2ecff5..fd3d5015b 100644 --- a/accounts/users/display_manager.go +++ b/accounts1/users/display_manager.go @@ -432,7 +432,7 @@ func setIniKeys(filename, group string, keys, values []string) error { return err } -//Default config: /etc/X11/default-display-manager +// Default config: /etc/X11/default-display-manager func getDefaultDM(file string) (string, error) { if !dutils.IsFileExist(file) { return "", fmt.Errorf("Not found this file: %s", file) diff --git a/accounts/users/display_manager.org b/accounts1/users/display_manager.org similarity index 100% rename from accounts/users/display_manager.org rename to accounts1/users/display_manager.org diff --git a/accounts/users/guest.go b/accounts1/users/guest.go similarity index 100% rename from accounts/users/guest.go rename to accounts1/users/guest.go diff --git a/accounts/users/list.go b/accounts1/users/list.go similarity index 100% rename from accounts/users/list.go rename to accounts1/users/list.go diff --git a/accounts/users/manager.go b/accounts1/users/manager.go similarity index 100% rename from accounts/users/manager.go rename to accounts1/users/manager.go diff --git a/accounts/users/passwd.c b/accounts1/users/passwd.c similarity index 100% rename from accounts/users/passwd.c rename to accounts1/users/passwd.c diff --git a/accounts/users/passwd.go b/accounts1/users/passwd.go similarity index 100% rename from accounts/users/passwd.go rename to accounts1/users/passwd.go diff --git a/accounts/users/passwd.h b/accounts1/users/passwd.h similarity index 100% rename from accounts/users/passwd.h rename to accounts1/users/passwd.h diff --git a/accounts/users/prop.go b/accounts1/users/prop.go similarity index 100% rename from accounts/users/prop.go rename to accounts1/users/prop.go diff --git a/accounts/users/testdata/adduser.conf b/accounts1/users/testdata/adduser.conf similarity index 100% rename from accounts/users/testdata/adduser.conf rename to accounts1/users/testdata/adduser.conf diff --git a/accounts/users/testdata/adduser1.conf b/accounts1/users/testdata/adduser1.conf similarity index 100% rename from accounts/users/testdata/adduser1.conf rename to accounts1/users/testdata/adduser1.conf diff --git a/accounts/users/testdata/autologin/custom.conf b/accounts1/users/testdata/autologin/custom.conf similarity index 100% rename from accounts/users/testdata/autologin/custom.conf rename to accounts1/users/testdata/autologin/custom.conf diff --git a/accounts/users/testdata/autologin/custom_autologin.conf b/accounts1/users/testdata/autologin/custom_autologin.conf similarity index 100% rename from accounts/users/testdata/autologin/custom_autologin.conf rename to accounts1/users/testdata/autologin/custom_autologin.conf diff --git a/accounts/users/testdata/autologin/default-display-manager b/accounts1/users/testdata/autologin/default-display-manager similarity index 100% rename from accounts/users/testdata/autologin/default-display-manager rename to accounts1/users/testdata/autologin/default-display-manager diff --git a/accounts/users/testdata/autologin/display-manager.service b/accounts1/users/testdata/autologin/display-manager.service similarity index 100% rename from accounts/users/testdata/autologin/display-manager.service rename to accounts1/users/testdata/autologin/display-manager.service diff --git a/accounts/users/testdata/autologin/kdmrc b/accounts1/users/testdata/autologin/kdmrc similarity index 100% rename from accounts/users/testdata/autologin/kdmrc rename to accounts1/users/testdata/autologin/kdmrc diff --git a/accounts/users/testdata/autologin/kdmrc_autologin b/accounts1/users/testdata/autologin/kdmrc_autologin similarity index 100% rename from accounts/users/testdata/autologin/kdmrc_autologin rename to accounts1/users/testdata/autologin/kdmrc_autologin diff --git a/accounts/users/testdata/autologin/lightdm.conf b/accounts1/users/testdata/autologin/lightdm.conf similarity index 100% rename from accounts/users/testdata/autologin/lightdm.conf rename to accounts1/users/testdata/autologin/lightdm.conf diff --git a/accounts/users/testdata/autologin/lightdm.service b/accounts1/users/testdata/autologin/lightdm.service similarity index 100% rename from accounts/users/testdata/autologin/lightdm.service rename to accounts1/users/testdata/autologin/lightdm.service diff --git a/accounts/users/testdata/autologin/lightdm_autologin.conf b/accounts1/users/testdata/autologin/lightdm_autologin.conf similarity index 100% rename from accounts/users/testdata/autologin/lightdm_autologin.conf rename to accounts1/users/testdata/autologin/lightdm_autologin.conf diff --git a/accounts/users/testdata/autologin/lxdm.conf b/accounts1/users/testdata/autologin/lxdm.conf similarity index 100% rename from accounts/users/testdata/autologin/lxdm.conf rename to accounts1/users/testdata/autologin/lxdm.conf diff --git a/accounts/users/testdata/autologin/lxdm_autologin.conf b/accounts1/users/testdata/autologin/lxdm_autologin.conf similarity index 100% rename from accounts/users/testdata/autologin/lxdm_autologin.conf rename to accounts1/users/testdata/autologin/lxdm_autologin.conf diff --git a/accounts/users/testdata/autologin/sddm.conf b/accounts1/users/testdata/autologin/sddm.conf similarity index 100% rename from accounts/users/testdata/autologin/sddm.conf rename to accounts1/users/testdata/autologin/sddm.conf diff --git a/accounts/users/testdata/autologin/sddm_autologin.conf b/accounts1/users/testdata/autologin/sddm_autologin.conf similarity index 100% rename from accounts/users/testdata/autologin/sddm_autologin.conf rename to accounts1/users/testdata/autologin/sddm_autologin.conf diff --git a/accounts/users/testdata/autologin/slim.conf b/accounts1/users/testdata/autologin/slim.conf similarity index 100% rename from accounts/users/testdata/autologin/slim.conf rename to accounts1/users/testdata/autologin/slim.conf diff --git a/accounts/users/testdata/autologin/slim_autologin.conf b/accounts1/users/testdata/autologin/slim_autologin.conf similarity index 100% rename from accounts/users/testdata/autologin/slim_autologin.conf rename to accounts1/users/testdata/autologin/slim_autologin.conf diff --git a/accounts/users/testdata/group b/accounts1/users/testdata/group similarity index 100% rename from accounts/users/testdata/group rename to accounts1/users/testdata/group diff --git a/accounts/users/testdata/login.defs b/accounts1/users/testdata/login.defs similarity index 100% rename from accounts/users/testdata/login.defs rename to accounts1/users/testdata/login.defs diff --git a/accounts/users/testdata/passwd b/accounts1/users/testdata/passwd similarity index 100% rename from accounts/users/testdata/passwd rename to accounts1/users/testdata/passwd diff --git a/accounts/users/testdata/shadow b/accounts1/users/testdata/shadow similarity index 100% rename from accounts/users/testdata/shadow rename to accounts1/users/testdata/shadow diff --git a/accounts/users/testdata/sudoers_arch b/accounts1/users/testdata/sudoers_arch similarity index 100% rename from accounts/users/testdata/sudoers_arch rename to accounts1/users/testdata/sudoers_arch diff --git a/accounts/users/testdata/sudoers_deepin b/accounts1/users/testdata/sudoers_deepin similarity index 100% rename from accounts/users/testdata/sudoers_deepin rename to accounts1/users/testdata/sudoers_deepin diff --git a/accounts/users/users_test.go b/accounts1/users/users_test.go similarity index 100% rename from accounts/users/users_test.go rename to accounts1/users/users_test.go diff --git a/accounts/utils.go b/accounts1/utils.go similarity index 85% rename from accounts/utils.go rename to accounts1/utils.go index 5347a4b65..e31582bf6 100644 --- a/accounts/utils.go +++ b/accounts1/utils.go @@ -18,9 +18,9 @@ import ( "strings" "time" - "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/accounts/users" - polkit "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.policykit1" + "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/accounts1/users" + polkit "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.policykit1" "github.com/linuxdeepin/go-lib/encoding/kv" "github.com/linuxdeepin/go-lib/graphic" "github.com/linuxdeepin/go-lib/utils" @@ -28,15 +28,17 @@ import ( // #nosec G101 const ( - polkitActionUserAdministration = "com.deepin.daemon.accounts.user-administration" - polkitActionChangeOwnData = "com.deepin.daemon.accounts.change-own-user-data" - polkitActionEnableAutoLogin = "com.deepin.daemon.accounts.enable-auto-login" - polkitActionDisableAutoLogin = "com.deepin.daemon.accounts.disable-auto-login" - polkitActionEnableQuickLogin = "com.deepin.daemon.accounts.enable-quick-login" - polkitActionDisableQuickLogin = "com.deepin.daemon.accounts.disable-quick-login" - polkitActionEnableNoPasswordLogin = "com.deepin.daemon.accounts.enable-nopass-login" - polkitActionDisableNoPasswordLogin = "com.deepin.daemon.accounts.disable-nopass-login" - polkitActionSetKeyboardLayout = "com.deepin.daemon.accounts.set-keyboard-layout" + polkitActionUserAdministration = "org.deepin.dde.accounts.user-administration" + polkitActionChangeOwnData = "org.deepin.dde.accounts.change-own-user-data" + polkitActionEnableAutoLogin = "org.deepin.dde.accounts.enable-auto-login" + polkitActionDisableAutoLogin = "org.deepin.dde.accounts.disable-auto-login" + polkitActionEnableNoPasswordLogin = "org.deepin.dde.accounts.enable-nopass-login" + polkitActionDisableNoPasswordLogin = "org.deepin.dde.accounts.disable-nopass-login" + polkitActionEnableWechatAuth = "org.deepin.dde.accounts.enable-wechat-auth" + polkitActionDisableWechatAuth = "org.deepin.dde.accounts.disable-wechat-auth" + polkitActionSetKeyboardLayout = "org.deepin.dde.accounts.set-keyboard-layout" + polkitActionEnableQuickLogin = "org.deepin.dde.accounts.enable-quick-login" + polkitActionDisableQuickLogin = "org.deepin.dde.accounts.disable-quick-login" systemLocaleFile = "/etc/default/locale" systemdLocaleFile = "/etc/locale.conf" diff --git a/accounts/utils_test.go b/accounts1/utils_test.go similarity index 98% rename from accounts/utils_test.go rename to accounts1/utils_test.go index 344ffda51..419b24901 100644 --- a/accounts/utils_test.go +++ b/accounts1/utils_test.go @@ -7,7 +7,7 @@ package accounts import ( "testing" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/stretchr/testify/assert" ) diff --git a/appearance/README.md b/appearance/README.md deleted file mode 100644 index 3ca210193..000000000 --- a/appearance/README.md +++ /dev/null @@ -1,88 +0,0 @@ -## 描述 - -deepin 个性化后端, 提供了GTK主题,Icon 主题,Cursor 主题, 背景和字体的管理功能。 - - -## 功能实现简介 - -首先Gtk, Icon, Cursor和字体都需要先设置对应的 xsettings 属性(xsettings 的实现见 startdde),部分还需要设置 xresources , 使用的接口见 dde-api - -Cursor 还需要单独监听 `gtk-cursor-theme-name` 的改变,来让 Gtk 程序实时生效,对于 Qt 程序则需要在设置时更改下一些光标的映射关系,具体见 dde-api - -背景的绘制和设置接口都是由 deepin-wm 提供的,只需要调用接口就可以了。 - -字体使用了 fontconfig 来获取字体列表,并更改了它的配置问题来实现实时生效的。 - -而主题列表的获取都是遍历相关的安装目录而的到的(字体除外),然后会监听这些目录的变化来刷新列表。 - - -## 目录结构 - -+ *subthemes, fsnotify.go*: 管理 GTK, Icon, Cursor 主题, 并监听列表的改变,发出 `Refreshed` 信号 -+ *background, bg_wrapper.go*: 管理桌面背景 -+ *fonts, default_font_config.go*: 管理字体,包括标准字体,等款字体及字体大小 -+ *listener.go, cursor.c, cursor.h*: 处理 `gtk cursor` 的改变事件,让改变实时生效 -+ *handle_gsetting.go*: 监听 `gsettings` 的改变,并应用 -+ *manager.go, stup.go, ifc.go*: 个性化后端的接口 -+ *appearance.go*: 个性化模块的入口 - - -## DBus 接口简介 - -*Dest*: com.deepin.daemon.Appearance -*Path*: /com/deepin/daemon/Appearance -*Interface*: com.deepin.daemon.Appearance - - -### 支持的主题类型 - -+ TypeGtkTheme ("gtk") -+ TypeIconTheme ("icon") -+ TypeCursorTheme ("cursor") -+ TypeBackground ("background") -+ TypeGreeterBackground ("greeterbackground") -+ TypeStandardFont ("standardfont") -+ TypeMonospaceFont ("monospacefont") -+ TypeFontSize ("fontsize") - - -### Methods - -+ List(type string) (string, error) - 获取指定类型的主题列表,返回的是json格式的字符串。如果类型错误将返回错误。 -+ Show(type, name string) (string, error) - 获取指定类型主题的详细信息,包含主题名称,路径,是否可删除。如果类型错误或者主题不存在将返回错误。 -+ Set(type, name string) error - 这是指定类型的主题,如果类型错误或者主题不存在将返回错误。 -+ Delete(type, name string) error - 删除指定类型主题,注意只可删除用户目录下的。如果类型错误或者主题不存在将返回错误。 -+ Thumbnail(type, name string) (string, error) - 获取指定类型主题的缩略图,返回的是缩略图的路径。如果类型错误或者主题不存在将返回错误。 -+ Reset() - 重置所有的设置为默认值 - - -### Properties - -+ GtkTheme - 显示当前窗口主题 -+ IconTheme - 显示当前图标主题 -+ CursorTheme - 显示当前光标主题 -+ Background - 显示当前桌面背景 -+ StandardFont - 显示当前标准字体 -+ MonospaceFont - 显示当前等宽字体 -+ FontSize - 显示当前字体大小 - - -### Signals - -+ Changed(type, name string) - 当上面的属性改变时,会发送此信号,包含改变的属性类型及改变后的值 -+ Refreshed(type string) - 当 gtk, icon, cursor, background 的安装目录改变后,有主题或壁纸被添加或删除后,就会发出此信号 diff --git a/appearance/appearance.go b/appearance/appearance.go deleted file mode 100644 index e21277ac4..000000000 --- a/appearance/appearance.go +++ /dev/null @@ -1,142 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -// Manage desktop appearance -package appearance - -import ( - "errors" - "time" - - "github.com/godbus/dbus" - "github.com/linuxdeepin/go-lib/dbusutil" - "github.com/linuxdeepin/go-lib/log" - - "github.com/linuxdeepin/dde-daemon/appearance/background" - "github.com/linuxdeepin/dde-daemon/loader" -) - -var ( - _m *Manager - logger = log.NewLogger("daemon/appearance") -) - -type Module struct { - *loader.ModuleBase -} - -func init() { - background.SetLogger(logger) - loader.Register(NewModule(logger)) -} - -func NewModule(logger *log.Logger) *Module { - var d = new(Module) - d.ModuleBase = loader.NewModuleBase("appearance", d, logger) - return d -} - -func HandlePrepareForSleep(sleep bool) { - if _m == nil { - return - } - if sleep { - return - } - cfg, err := doUnmarshalWallpaperSlideshow(_m.WallpaperSlideShow.Get()) - if err == nil { - for monitorSpace := range cfg { - if cfg[monitorSpace] == wsPolicyWakeup { - _m.autoChangeBg(monitorSpace, time.Now()) - } - } - } -} - -func (*Module) GetDependencies() []string { - return []string{} -} - -func (*Module) start() error { - service := loader.GetService() - - _m = newManager(service) - err := _m.init() - if err != nil { - logger.Warning(err) - return err - } - - err = service.Export(dbusPath, _m, _m.syncConfig) - if err != nil { - _m.destroy() - return err - } - - err = service.Export(backgroundDBusPath, _m.bgSyncConfig) - if err != nil { - return err - } - - so := service.GetServerObject(_m) - err = so.SetWriteCallback(_m, propQtActiveColor, func(write *dbusutil.PropertyWrite) *dbus.Error { - value, ok := write.Value.(string) - if !ok { - return dbusutil.ToError(errors.New("type is not string")) - } - err = _m.setQtActiveColor(value) - return dbusutil.ToError(err) - }) - if err != nil { - return err - } - - err = service.RequestName(dbusServiceName) - if err != nil { - _m.destroy() - err = service.StopExport(_m) - if err != nil { - return err - } - return err - } - - err = _m.syncConfig.Register() - if err != nil { - logger.Warning("failed to register for deepin sync", err) - } - - err = _m.bgSyncConfig.Register() - if err != nil { - logger.Warning("failed to register for deepin sync", err) - } - - go _m.listenCursorChanged() - go _m.handleThemeChanged() - _m.listenGSettingChanged() - _m.initFont() - return nil -} - -func (m *Module) Start() error { - if _m != nil { - return nil - } - return m.start() -} - -func (*Module) Stop() error { - if _m == nil { - return nil - } - - _m.destroy() - service := loader.GetService() - err := service.StopExport(_m) - if err != nil { - return err - } - _m = nil - return nil -} diff --git a/appearance/appearance_test.go b/appearance/appearance_test.go deleted file mode 100644 index 1b0e50597..000000000 --- a/appearance/appearance_test.go +++ /dev/null @@ -1,90 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package appearance - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_hexColorToXsColor(t *testing.T) { - var tests = []struct { - hex string - xs string - err bool - }{ - {"#ffffff", "65535,65535,65535,65535", false}, - {"#ffffffff", "65535,65535,65535,65535", false}, - {"#ff69b4", "65535,26985,46260,65535", false}, - {"#00000000", "0,0,0,0", false}, - {"abc", "", true}, - {"#FfFff", "", true}, - {"", "", true}, - } - - for _, test := range tests { - xsColor, err := hexColorToXsColor(test.hex) - assert.Equal(t, err != nil, test.err) - assert.Equal(t, xsColor, test.xs) - } -} - -func Test_xsColorToHexColor(t *testing.T) { - var tests = []struct { - hex string - xs string - err bool - }{ - {"#FFFFFF", "65535,65535,65535,65535", false}, - {"#FF69B4", "65535,26985,46260,65535", false}, - {"", "", true}, - {"", "123,456,678", true}, - {"", "-1,-2,03,45", true}, - {"", "65535,26985,46260,65535,", true}, - {"", "65535,26985,46260,165535", true}, - } - - for _, test := range tests { - hexColor, err := xsColorToHexColor(test.xs) - assert.Equal(t, err != nil, test.err) - assert.Equal(t, hexColor, test.hex) - } -} - -func Test_byteArrayToHexColor(t *testing.T) { - var tests = []struct { - byteArray [4]byte - hex string - }{ - {[4]byte{0xff, 0xff, 0xff}, "#FFFFFF00"}, - {[4]byte{0xff, 0xff, 0xff, 0xff}, "#FFFFFF"}, - {[4]byte{0xff, 0x69, 0xb4}, "#FF69B400"}, - {[4]byte{0xff, 0x69, 0xb4, 0xff}, "#FF69B4"}, - } - - for _, test := range tests { - hexColor := byteArrayToHexColor(test.byteArray) - assert.Equal(t, hexColor, test.hex) - } -} - -func Test_parseHexColor(t *testing.T) { - var tests = []struct { - byteArray [4]byte - hex string - }{ - {[4]byte{0xff, 0xff, 0xff}, "#FFFFFF00"}, - {[4]byte{0xff, 0xff, 0xff, 0xff}, "#FFFFFF"}, - {[4]byte{0xff, 0x69, 0xb4}, "#FF69B400"}, - {[4]byte{0xff, 0x69, 0xb4, 0xff}, "#FF69B4"}, - } - - for _, test := range tests { - byteArray, err := parseHexColor(test.hex) - assert.NoError(t, err) - assert.Equal(t, byteArray, test.byteArray) - } -} diff --git a/appearance/background/background.go b/appearance/background/background.go deleted file mode 100644 index 6f2ac3712..000000000 --- a/appearance/background/background.go +++ /dev/null @@ -1,325 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package background - -import ( - "errors" - "fmt" - "os" - "os/user" - "path/filepath" - "strings" - "sync" - - "github.com/godbus/dbus" - daemon "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.daemon" - "github.com/linuxdeepin/go-lib/imgutil" - - "github.com/linuxdeepin/go-lib/log" - "github.com/linuxdeepin/go-lib/strv" - dutils "github.com/linuxdeepin/go-lib/utils" - "github.com/linuxdeepin/go-lib/xdg/basedir" -) - -var ( - backgroundsCache Backgrounds - backgroundsCacheMu sync.Mutex - - CustomWallpapersConfigDir string - customWallpaperDeleteCallback func(file string) - logger *log.Logger -) - -const customWallpapersLimit = 10 - -//0:专业版 1: 政务授权 2: 企业授权 -const ( - Professional uint32 = iota - Government - Enterprise - Count -) - -const ( - Unknown uint32 = iota - Normal - Solid -) - -const ( - solidPrefix = "solid::" - solidWallPaperPath = "/usr/share/wallpapers/custom-solidwallpapers" - sysSolidWallPaperPath = "/usr/share/wallpapers/deepin-solidwallpapers" -) - -var NotifyFunc func(string, string) - -var _licenseAuthorizationProperty uint32 = 0 - -var _wallpapersPathMap = make(map[uint32]string) - -func SetLogger(value *log.Logger) { - logger = value -} - -func SetCustomWallpaperDeleteCallback(fn func(file string)) { - customWallpaperDeleteCallback = fn -} - -func LicenseAuthorizationProperty() uint32 { - return _licenseAuthorizationProperty -} - -func SetLicenseAuthorizationProperty(value uint32) { - if value != _licenseAuthorizationProperty { - _licenseAuthorizationProperty = value - } -} - -func UpdateLicenseAuthorizationProperty() { - refreshBackground(true) -} - -func init() { - logger = log.NewLogger("background") - SetLogger(logger) - CustomWallpapersConfigDir = filepath.Join(basedir.GetUserConfigDir(), - "deepin/dde-daemon/appearance/custom-wallpapers") - err := os.MkdirAll(CustomWallpapersConfigDir, 0755) - if err != nil { - _, _ = fmt.Fprintln(os.Stderr, err) - } - - _wallpapersPathMap[Professional] = "/usr/share/wallpapers/deepin" - _wallpapersPathMap[Government] = "/usr/share/wallpapers/deepin/deepin-government" - _wallpapersPathMap[Enterprise] = "/usr/share/wallpapers/deepin/deepin-enterprise" -} - -type Background struct { - Id string - Deletable bool -} - -type Backgrounds []*Background - -func refreshBackground(notify bool) { - if logger != nil { - logger.Debug("refresh background") - } - var bgs Backgrounds - // add custom - for _, file := range getCustomBgFiles() { - logger.Debugf("custom: %s", file) - bgs = append(bgs, &Background{ - Id: dutils.EncodeURI(file, dutils.SCHEME_FILE), - Deletable: true, - }) - } - - // add system, get default systemWallpapers - var systemWallpapersDir = []string{ - _wallpapersPathMap[Professional], - sysSolidWallPaperPath, - } - for _, file := range getSysBgFiles(systemWallpapersDir) { - logger.Debugf("system: %s", file) - bgs = append(bgs, &Background{ - Id: dutils.EncodeURI(file, dutils.SCHEME_FILE), - Deletable: false, - }) - } - - logger.Debug("[refreshBackground] _licenseAuthorizationProperty : ", _licenseAuthorizationProperty) - // add system, get enterprise or government systemWallpapers - if _licenseAuthorizationProperty > Professional && _licenseAuthorizationProperty < uint32(len(_wallpapersPathMap)) { - for _, file := range getSysBgFiles([]string{_wallpapersPathMap[_licenseAuthorizationProperty]}) { - logger.Debugf("system: %s", file) - bgs = append(bgs, &Background{ - Id: dutils.EncodeURI(file, dutils.SCHEME_FILE), - Deletable: false, - }) - } - } - // 对比差异,发送壁纸新增和删除的信号 - if notify && NotifyFunc != nil { - diff := diffBackgroundCache(bgs, backgroundsCache) - // TODO: 不在此处理壁纸添加信号。用户添加壁纸时,只要路径不是/usr/share/wallpaper,即认为是新壁纸,不管底层是否已经存在 - // if diff["added"] != nil { - // logger.Debug("new wallpapper added!", diff["added"]) - // NotifyFunc("background-add", strings.Join(diff["added"], ";")) - // } - if diff["deleted"] != nil { - logger.Debug("new wallpapper deleted!", diff["deleted"]) - NotifyFunc("background-delete", strings.Join(diff["deleted"], ";")) - } - } - backgroundsCache = bgs -} - -func diffBackgroundCache(newCache Backgrounds, oldCache Backgrounds) map[string][]string { - tmp := make(map[string]string) - for _, newBg := range newCache { - tmp[newBg.Id] = "added" - for _, oldBg := range oldCache { - if tmp[oldBg.Id] == "existed" { - continue - } - if newBg.Id == oldBg.Id { - tmp[oldBg.Id] = "existed" - } - if tmp[oldBg.Id] == "" { - tmp[oldBg.Id] = "deleted" - } - } - } - diff := make(map[string][]string) - for file, stat := range tmp { - diff[stat] = append(diff[stat], file) - } - return diff -} - -func ListBackground() Backgrounds { - backgroundsCacheMu.Lock() - defer backgroundsCacheMu.Unlock() - - if len(backgroundsCache) == 0 { - refreshBackground(false) - } - return backgroundsCache -} - -func NotifyChanged() { - backgroundsCacheMu.Lock() - refreshBackground(true) - backgroundsCacheMu.Unlock() -} - -var uiSupportedFormats = strv.Strv([]string{"jpeg", "png", "bmp", "tiff", "gif"}) - -func IsBackgroundFile(file string) bool { - file = dutils.DecodeURI(file) - format, err := imgutil.SniffFormat(file) - if err != nil { - return false - } - - if uiSupportedFormats.Contains(format) { - return true - } - return false -} - -func (bgs Backgrounds) Get(uri string) *Background { - uri = dutils.EncodeURI(uri, dutils.SCHEME_FILE) - for _, info := range bgs { - if uri == info.Id { - return info - } - } - return nil -} - -func (bgs Backgrounds) ListGet(uris []string) Backgrounds { - var ret Backgrounds - for _, uri := range uris { - v := bgs.Get(uri) - if v == nil { - continue - } - ret = append(ret, v) - } - return ret -} - -func (bgs Backgrounds) Delete(uri string) error { - info := bgs.Get(uri) - if info == nil { - return fmt.Errorf("not found '%s'", uri) - } - - return info.Delete() -} - -func (bgs Backgrounds) Thumbnail(uri string) (string, error) { - return "", errors.New("not supported") -} - -func (info *Background) Delete() error { - if !info.Deletable { - return fmt.Errorf("not custom") - } - - bus, err := dbus.SystemBus() - if err != nil { - logger.Warning(err) - return err - } - - dm := daemon.NewDaemon(bus) - cur, err := user.Current() - if err != nil { - logger.Warning(err) - return err - } - - file := dutils.DecodeURI(info.Id) - err = dm.DeleteCustomWallPaper(0, cur.Username, file) - if err != nil { - logger.Warning(err) - return err - } - - if customWallpaperDeleteCallback != nil { - customWallpaperDeleteCallback(file) - } - - NotifyChanged() - return err -} - -func (info *Background) Thumbnail() (string, error) { - return "", errors.New("not supported") -} - -func Prepare(file string, t uint32) (string, error) { - var systemWallpapersDir = []string{ - _wallpapersPathMap[Professional], - sysSolidWallPaperPath, - } - if _licenseAuthorizationProperty > Professional && _licenseAuthorizationProperty < uint32(len(_wallpapersPathMap)) { - systemWallpapersDir = append(systemWallpapersDir, _wallpapersPathMap[_licenseAuthorizationProperty]) - } - - if isFileInDirs(file, systemWallpapersDir) { - logger.Debug("is system") - return file, nil - } - - logger.Debug("is custom") - return prepare(file, t) - -} - -func GetWallpaperType(file string) (string, uint32) { - t := Normal - - if strings.HasPrefix(file, solidPrefix) { - file = strings.TrimPrefix(file, solidPrefix) - t = Solid - } - if !IsBackgroundFile(file) { - t = Unknown - } - file = dutils.DecodeURI(file) - if file == "" { - t = Unknown - } - if strings.HasPrefix(file, sysSolidWallPaperPath) || - strings.HasPrefix(file, solidWallPaperPath) { - t = Solid - } - return file, t -} diff --git a/appearance/background/background_test.go b/appearance/background/background_test.go deleted file mode 100644 index 650c9d2f8..000000000 --- a/appearance/background/background_test.go +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package background - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_LicenseAuthorizationProperty(t *testing.T) { - t.Log(LicenseAuthorizationProperty()) -} - -func Test_SetLicenseAuthorizationProperty(t *testing.T) { - SetLicenseAuthorizationProperty(30) - t.Log(_licenseAuthorizationProperty) - assert.Equal(t, _licenseAuthorizationProperty, uint32(30)) -} - -func Test_Scanner(t *testing.T) { - assert.ElementsMatch(t, getBgFilesInDir("testdata/Theme1/wallpapers"), - []string{ - "testdata/Theme1/wallpapers/desktop.jpg", - }) - assert.Nil(t, getBgFilesInDir("testdata/Theme2/wallpapers")) -} - -func Test_FileInDirs(t *testing.T) { - var dirs = []string{ - "/tmp/backgrounds", - "/tmp/wallpapers", - } - - assert.Equal(t, isFileInDirs("/tmp/backgrounds/1.jpg", dirs), - true) - assert.Equal(t, isFileInDirs("/tmp/wallpapers/1.jpg", dirs), - true) - assert.Equal(t, isFileInDirs("/tmp/background/1.jpg", dirs), - false) -} - -func Test_GetBgFiles(t *testing.T) { - files := getSysBgFiles([]string{"/usr/share/wallpapers/deepin"}) - t.Log(files) -} diff --git a/appearance/background/custom_wallpapers.go b/appearance/background/custom_wallpapers.go deleted file mode 100644 index 234aead77..000000000 --- a/appearance/background/custom_wallpapers.go +++ /dev/null @@ -1,206 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package background - -import ( - "crypto/md5" - "fmt" - "io" - "io/ioutil" - "os" - "os/user" - "path/filepath" - "sort" - "strings" - "time" - - "github.com/godbus/dbus" - daemon "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.daemon" - "github.com/linuxdeepin/go-gir/gio-2.0" - "github.com/linuxdeepin/go-lib/graphic" - "github.com/linuxdeepin/go-lib/imgutil" - "github.com/linuxdeepin/go-lib/strv" - dutils "github.com/linuxdeepin/go-lib/utils" - "github.com/nfnt/resize" -) - -func sumFileMd5(filename string) (string, error) { - f, err := os.Open(filename) - if err != nil { - return "", err - } - defer f.Close() - h := md5.New() - _, err = io.Copy(h, f) - if err != nil { - return "", err - } - return fmt.Sprintf("%x", h.Sum(nil)), nil -} - -func updateModTime(file string) { - now := time.Now() - err := os.Chtimes(file, now, now) - if err != nil { - logger.Warning("failed to update cache file modify time:", err) - } -} - -func resizeImage(filename, cacheDir string) (outFilename, ext string, isResized bool) { - img, err := imgutil.Load(filename) - if err != nil { - _, _ = fmt.Fprintf(os.Stderr, "failed to load image file %q: %v\n", filename, err) - outFilename = filename - return - } - - const ( - stdWidth = 3840 - stdHeight = 2400 - ) - - imgWidth := img.Bounds().Dx() - imgHeight := img.Bounds().Dy() - - if imgWidth <= stdWidth && imgHeight <= stdHeight { - // no need to resize - outFilename = filename - return - } - - ext = "jpg" - format := graphic.FormatJpeg - _, err = os.Stat("/usr/share/wallpapers/deepin/desktop.bmp") - if err == nil { - ext = "bmp" - format = graphic.FormatBmp - } - - fh, err := ioutil.TempFile(cacheDir, "tmp-") - if err != nil { - _, _ = fmt.Fprintln(os.Stderr, "failed to create temp file:", err) - outFilename = filename - return - } - - // tmp-### - outFilename = fh.Name() + "." + ext - err = fh.Close() - if err != nil { - _, _ = fmt.Fprintln(os.Stderr, "failed to close temp file:", err) - } - // 删除临时文件 - err = os.Remove(fh.Name()) - if err != nil { - _, _ = fmt.Fprintln(os.Stderr, "failed to remove temp file:", err) - } - - if float64(imgWidth)/float64(imgHeight) > float64(stdWidth)/float64(stdHeight) { - // use std width - imgWidth = stdWidth - imgHeight = 0 - } else { - // use std height - imgWidth = 0 - imgHeight = stdHeight - } - - img = resize.Resize(uint(imgWidth), uint(imgHeight), img, resize.Lanczos3) - err = graphic.SaveImage(outFilename, img, format) - if err != nil { - _, _ = fmt.Fprintf(os.Stderr, "failed to save image file %q: %v\n", - outFilename, err) - outFilename = filename - return - } - - isResized = true - return -} - -func prepare(filename string, t uint32) (string, error) { - bus, err := dbus.SystemBus() - if err != nil { - return "", err - } - - file, _, _ := resizeImage(filename, CustomWallpapersConfigDir) - - dm := daemon.NewDaemon(bus) - cur, err := user.Current() - if err != nil { - return "", err - } - - if t == Solid { - file = solidPrefix + file - } - return dm.SaveCustomWallPaper(0, cur.Username, file) -} - -func shrinkCache(cacheFileBaseName string) { - gs := gio.NewSettings("com.deepin.dde.appearance") - defer gs.Unref() - - workspaceBackgrounds := gs.GetStrv("background-uris") - var notDeleteFiles strv.Strv - notDeleteFiles = append(notDeleteFiles, cacheFileBaseName) - for _, uri := range workspaceBackgrounds { - wbFile := dutils.DecodeURI(uri) - if strings.HasPrefix(wbFile, CustomWallpapersConfigDir) { - // is custom wallpaper - basename := filepath.Base(wbFile) - if basename != cacheFileBaseName { - notDeleteFiles = append(notDeleteFiles, basename) - } - } - } - deleteOld(notDeleteFiles) -} - -func deleteOld(notDeleteFiles strv.Strv) { - fileInfos, _ := ioutil.ReadDir(CustomWallpapersConfigDir) - count := len(fileInfos) - customWallpapersLimit - if count <= 0 { - return - } - logger.Debugf("need delete %d file(s)", count) - - sort.Sort(byModTime(fileInfos)) - for _, fileInfo := range fileInfos { - if count == 0 { - break - } - - // traverse from old to new - fileBaseName := fileInfo.Name() - if !notDeleteFiles.Contains(fileBaseName) { - logger.Debug("delete", fileBaseName) - fullPath := filepath.Join(CustomWallpapersConfigDir, fileBaseName) - err := os.Remove(fullPath) - if os.IsNotExist(err) { - err = nil - } - - if err == nil { - count-- - - if customWallpaperDeleteCallback != nil { - customWallpaperDeleteCallback(fullPath) - } - } else { - logger.Warning(err) - } - } - } -} - -type byModTime []os.FileInfo - -func (a byModTime) Len() int { return len(a) } -func (a byModTime) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byModTime) Less(i, j int) bool { - return a[i].ModTime().Unix() < a[j].ModTime().Unix() -} diff --git a/appearance/background/custom_wallpapers_test.go b/appearance/background/custom_wallpapers_test.go deleted file mode 100644 index 17a8c7f1c..000000000 --- a/appearance/background/custom_wallpapers_test.go +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package background - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_sumFileMd5(t *testing.T) { - type args struct { - filename string - } - tests := []struct { - name string - args args - want string - wantErr bool - }{ - { - name: "sumFileMd5", - args: args{ - filename: "./testdata/Theme1/wallpapers/desktop.jpg", - }, - want: "fafa2baf6dba60d3e47b8c7fe4eea9e9", - wantErr: false, - }, - { - name: "sumFileMd5 not found", - args: args{ - filename: "./testdata/Theme1/wallpapers/desktop.jpxg", - }, - want: "", - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := sumFileMd5(tt.args.filename) - if tt.wantErr { - assert.Error(t, err) - return - } - - assert.Equal(t, tt.want, got) - }) - } -} diff --git a/appearance/background/list.go b/appearance/background/list.go deleted file mode 100644 index 2ae1770bd..000000000 --- a/appearance/background/list.go +++ /dev/null @@ -1,136 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package background - -import ( - "io/ioutil" - "os" - "os/user" - "path/filepath" - "sort" - - "github.com/godbus/dbus" - daemon "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.daemon" - dutils "github.com/linuxdeepin/go-lib/utils" -) - -// ListDirs list all background dirs -func ListDirs() []string { - var result []string - result = append(result, _wallpapersPathMap[Professional]) - if _licenseAuthorizationProperty > Professional && _licenseAuthorizationProperty < uint32(len(_wallpapersPathMap)) { - result = append(result, _wallpapersPathMap[_licenseAuthorizationProperty]) - } - result = append(result, CustomWallpapersConfigDir) - return result -} - -// 根据时间排序文件 -func sortByTime(fileInfoList []os.FileInfo) []os.FileInfo { - sort.Slice(fileInfoList, func(i, j int) bool { - fileInfoI := fileInfoList[i] - fileInfoJ := fileInfoList[j] - if fileInfoI.ModTime().After(fileInfoJ.ModTime()) { - return true - } else if fileInfoI.ModTime().Equal(fileInfoJ.ModTime()) { - if fileInfoI.Name() < fileInfoJ.Name() { - return true - } - } - return false - }) - - return fileInfoList -} - -func getSysBgFiles(paths []string) []string { - var files []string - - for _, path := range paths { - if dutils.IsFileExist(path) { - files = append(files, getBgFilesInDir(path)...) - } - } - return files -} - -func getCustomBgFiles() []string { - bus, err := dbus.SystemBus() - if err != nil { - logger.Warning(err) - return []string{} - } - - dm := daemon.NewDaemon(bus) - cur, err := user.Current() - if err != nil { - logger.Warning(err) - return []string{} - } - - files, err := dm.GetCustomWallPapers(0, cur.Username) - if err != nil { - logger.Warning(err) - } - - return files -} - -func getCustomBgFilesInDir(dir string) []string { - fileInfoList, err := ioutil.ReadDir(dir) - if err != nil { - logger.Warning(err) - return nil - } - - sortByTime(fileInfoList) - - var wallpapers []string - for _, info := range fileInfoList { - // 只处理custom-wallpapers目录下的壁纸图片文件 - if info.IsDir() { - continue - } - path := filepath.Join(dir, info.Name()) - if !IsBackgroundFile(path) { - continue - } - wallpapers = append(wallpapers, path) - } - - return wallpapers -} - -func getBgFilesInDir(dir string) []string { - fr, err := os.Open(dir) - if err != nil { - return []string{} - } - defer fr.Close() - - names, err := fr.Readdirnames(0) - if err != nil { - return []string{} - } - - var walls []string - for _, name := range names { - path := filepath.Join(dir, name) - if !IsBackgroundFile(path) { - continue - } - walls = append(walls, path) - } - return walls -} - -func isFileInDirs(file string, dirs []string) bool { - for _, dir := range dirs { - if filepath.Dir(file) == dir { - return true - } - } - return false -} diff --git a/appearance/background/list_test.go b/appearance/background/list_test.go deleted file mode 100644 index de5cd92ee..000000000 --- a/appearance/background/list_test.go +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package background - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_getSysBgFiles(t *testing.T) { - type args struct { - dir []string - } - tests := []struct { - name string - args args - want []string - }{ - { - name: "getSysBgFiles", - args: args{ - dir: []string{"./testdata/fakeimages"}, - }, - want: []string{"testdata/fakeimages/fakeimage1.jpg", "testdata/fakeimages/fakeimage2.jpg"}, - }, - { - name: "getCustomBgFilesInDir empty", - args: args{ - dir: []string{"./testdata/fakeimages/empty"}, - }, - want: nil, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got := getSysBgFiles(tt.args.dir) - assert.ElementsMatch(t, tt.want, got) - }) - } -} - -func Test_getCustomBgFilesInDir(t *testing.T) { - type args struct { - dir string - } - tests := []struct { - name string - args args - want []string - }{ - { - name: "getCustomBgFilesInDir", - args: args{ - dir: "./testdata/fakeimages", - }, - want: []string{"testdata/fakeimages/fakeimage1.jpg", "testdata/fakeimages/fakeimage2.jpg"}, - }, - { - name: "getCustomBgFilesInDir empty", - args: args{ - dir: "./testdata/fakeimages/empty", - }, - want: nil, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got := getCustomBgFilesInDir(tt.args.dir) - assert.ElementsMatch(t, tt.want, got) - }) - } -} diff --git a/appearance/background/testdata/Theme1/wallpapers/desktop.jpg b/appearance/background/testdata/Theme1/wallpapers/desktop.jpg deleted file mode 100644 index 4b16c38058c8f96241de70ec5f1ba9cc77f9e3e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 682794 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 {n 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

AsV{+ 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

Posa@Xv?YNJXvY8YeIKpQn~Ta62}DR@nR_ zS!qgm+lD~pN_=_V4R4OP2EM#iaT4mY0MzLE3P?l(UM&@Vp(&!i_s^s)e8~Vg&eAu( zWIPlOIGCUX9N?&U38M7uNyLza5e^F*53N8V?;G9)e7_!#MQYjRR$lBmw&nzlu`mM1 zUF;DoY(ZsLi=i#_gJPG`lQh8#6zbeYLA~LkV)iMjEg?N)Pd0huB%Vki?*x`%4v9XE z!G9HtvKTIE_Sx1xu*++LC)T?miCXG|Zl7tO{;3?+*oLxZDDsj`U1t}b;2RrC_>?uky;OXl^M^ z`2dm+x@eDQQRw$Gn+K0ReKFYMw4)GLt@Eg6|Gx;uAdA^%#Y*C~Da10LTSGBb5pW5N_iMid1z+%WF6(q%YnH952-@cc^6$(a|j7Zxm&`+q0fV zBZi^oP*joDYDA=ewmMn}P*mii3JyPR@vE}_q1v5QzVQ#rclt!*IqiElqTurOg7L`w6bEQ?%w!#uV}(>V&DzSV#n zP+M-$-x=JpZMOT|e>Tp(n|ow@swt>1s)MBFszvA;QqbevH8c&atSO)lR?D9+P~Rar zs?$*vk#zB)^sWDvN=r);%Ds{;hX!l+m$bFp8C=+Yiek{2TT0D3i#xHFW1%yha@N*O z^Q67%4u8GWlO7s-H-Bq*5)#tSnfdzthBJ)nL(0mM?KYB8zd2cNaO6TS0)%vY1y>Hb z_tclopY^3oj0n#qM(q%534BecJ_d0SJ(jL{xSO1#f?A}cXSku#Y3tH%7m z;-m(%6=DEsGB}}GSjxw%adJpiiJS#7@&K|DFuE*@B+r2DYBrrMgWRT>!u1u*coQuc z$&`qVp0xpJkSJ$v9-Gu9h=c->ADgs3u?^-dJaLD?u35LZplu$fT#~B(9+c0+H{|sj zb89&B-c?M;L%aE>wN7Lk#hcOteb1bV+iiBe{N2FK2L(I51DzG#TkndDYdm{A)oNcS z-04_rluJ z$C=;4M$qV6Z{JJ+xIfA=1MFF(tC(eEt08ekz^4&bi8ijIA>}{dPbFE4wnz-v%o%z|%xmW%&iB%C08?Q|mXg zE5q-qKJNuD>X@RUj_73TX6OEHng@;Y%luc_Be8j@hz=<0bQob8W|M|~;E#A{3=si|uquacbXZT{4 zaIgimAE2o3z>!lzR-rHhE@m_9X&S_4l9~af;m%3~W4}4vP|3XFa=|ZBI4MDWgxwf? z<|8;mBqq`l(Q}+$+n!9#i8M|Nhs%W8W70V*3%LU0YPe$-L^hHyva19*#zR)Yx$x4d z*xN9sa#qazUqmlqW;|2PKm0Z6N)28ouXo=RO^xM%4$o;H=w95~NB&8j1aFF+7EBYL zzi=u!A)8^RaU=N0{o;|TW#Jnk+s$(qGgH+zmgto}9|E(hTxodoMN2-PZFON(-^1cO z;G|350JLyfB6{JT-)5h;S!uis+R`eF5O6~ebLzI5t>i_>t+h4_ivyxTtLNMAx7*fO zk)0C4MyMrn&lX`r)ymE~yPwx(9AV4nQ)x6eYa1I|`z?1B(09>ir4LkBS5Hcg+g{n6 zdGquRgc5!HhIIL(0kN}AV$2AJW5bijsr&3rCA9OW%{tFD?RRh9+bwQ+4QstsVDaVd zF4l-dgV^S9;L=!Y6QD5Vo(O1m#!Q{1Chf3gwi$Djft{E%`VKR4wS8uno3>rutiN~q z9IoSO6REZN2ATA%sN+m1)@-^r`&}OF|ID#AA6vO4TQMVcESY_|6z88@dNP^7>4hS; z7-va}dJV81sKkg&_E%3u&|QE=m)@}Dmi*F%plcg_y`zQe&`T3N>bIJGFDuM@S7K)_ z7j(&X9f{L_hz^Gc-sI02D~<)v)qK8JQ%|MRLm_1s!!s7#UCk?vPmERpr+fEuq5>75~W;t z$p)3hM3|L`xdzl#*6Ae|Ng1mP#gIS-=bk$rJM_rxN4cS7({v#K@N%MXqC~5gp?gRX z+QXded-ew@1Ik3DR+3=C@t{zx!EBQKEVH1rTX(3pU&XcEG}Sw}sbK$)mjxGE^`1@# zemzsRSdKNjl3nRCiRr26EW8^mHLUEroCLR{3-|=E!Dxg)+IV`DfuzAA5O})O$FYOb z?Sx(>)NvGi73vq>id$j<2h*UhjBh~(fO^_jz+I0nZ)X|;f=P&_j12? z19rJ*6KY=AaXA{?0H!P~y6n0JUgawv{%K64Wee5r$0wDh?5;9Vu0eXjAYOb>fmv#o|Ga_4ZE&Gj8P5x6ee?c--=3{d>Ymq?}X8k zXEQ09X$_V~R*hltAIKDGoI)0klQ3;-oDXk1c390MZ)$4 z6N$i92Rkip4PEbt$)D2gREzA6J0=C|7IU-E7H|3?>21l?24{u~tB38HN$WMa+qT)d z9z1$ip^2iBJxgFykWa*%Pd$$^o!+@{K0j^9#h0>E(IsD46F=(K$T2lh6!^&$G7$Ke zI^!M7gK+z@B=)1qB$1~$e*OuQU$fTXyVz*yf5phI&f#*>;jJOiy{=Oa(yAYF25umP z11fmJkiZje|N3FhL+wUhYUBs609q?~oia4e8u4P!h_~gOayBe!+qa^M8Eewat5ToRIP4J_}>p;t+hbRA+^?H$f>_B_nlBDwzpL>^>-yJhz$E$W<$4g zK>1LC7=5Yglso4rGnPZ9F@&w$x%lDKvOUx2F1oLBvLO`9QhE3)xHBjubkG@0Sf1PM z@dil>JerdbvN4i;jNxU-L}le9D48YlcYf@gTz~R?q;~iVCaE}3ixp9Tv$_%Ge>`!s_jKmd0$t3bYw`J(mJh?~>DMvok_r!}-uv*^s|)tV%AKoP zROsWkhh^P4iipqA>BV7#<#e+(;&Wvuvp{mhPiit{SUyeQr03dJ?Vrp|BugzvEcKH- z>#1$5GzsQl+OU2wVuNfYKYA>~18G@u+9hKDhJZ;K-`qsx_g~E%#f`-N9j|d0zMktPFxS-ZpK86Im+55e%YZ(k>CV6V1g@mB=OQUoY5< z_cT@8Bbfh|H<`3*{Z1hBT?r6h-Dt|%X%hk8q=o23c$CvdQdpa=5jxfKd2LfP`qJf9 zZbQQ!Qi$BH&SAq*WiNjsd#^2gS&&2$^2A7*8@(=T^9F6jqkqJS@nmA`;f+2G>6z7W zPX4ya5|Nq{R$D)^g*K$sSc`;4Ey7vqp9dy)MCm!Lj=xRfA}tH6!S7+Ct~*AqZ&jKm zV0vO{t&ccch6;;`?6xQbz*z*?IrijLbmmEWM4WWfWMS^aFbrVYukv2jY-=x2wM_{| z2vCG2DZa%j8j{>HvZ*%eegNvcedcv?EFPm%>!$F8b*m|7lOmaB*Ya}(;80XwQGDDYfo-Z#WdnwsTw;auE_9G^z0fHdCIUHS*Q8xnYS}S&ULz8{u>cz zNp`|%k}l;@U8J;z`jE$?gKgQ+#9=)>!e}~~4Y|(O$?DrS2|JQTY<;#!(}%s2_hgz` znSl4@lEwOup{yYbhw$l%(-^c|@R>DZwb{#qRUakIc}^o;Rf>RHuLMZ!*GsSc4YK(e zf6c2x+Aw(-;av}xci@;IyWEEq6yIDQ%|vwW8%Q$_enBoiO#Wj-+Mcx@wTzIG3~l|0z3ZTq;0^ z7|O>JrhPhv_M*u++;&+LtbSx_TGG3%4OaSVWYGKiejQ()hTpm5^zKOzessHqdEof$SW?5=AY~Jj zZ*G)Lk6_e|N(!Yx9IGiQ1O5hK3980K4wJL62i_hAD7Hat8&J(ECM>}{Ekv0oQ41`> zNpW6i@r`!}%dyYhdHqcLYJLRdX+X3`m}+Rz^Ho2@+wFA@ z*VWUtu~s@0=?BZuKEb4T7cy!g%&zRa1{nw7U%x2r0Sgv9CS*lhXb@$l^4 z!=d87VSh^$hZ5@-_NCcedo#v4FzjsqWh;=7q+)s^a@6C)o{vX*+>_n65E`u&I_AEi ze%pgxF51I2J*g_QC0jcm#ut1_%GE1tF5ulvjgoH^UqM3BHqPxD(%% zEb>jASjTXn{`|E z69gcmbJ^SlgJ#$R(}l?}e1u(e3ptTf1OB;5pNZlXR3H?N7GMF>n*R2s(m3W=)-cQ@85ylzv-;M{zX_e z!cjMh@A#S(`)e5F!d;sbbuGz(zzcxoM$`*=))xa5YA&IL4opkX>5Zc(>mTRv<(+CA zcs(5D!R|b?##+ zwdUG}eHw7R%0T9l2=lm+;^%w?&SmWFR2*{-0muV1w1~vBs za4`(ZUNFI~Q!M9{>UWrN>Q@z!E^AzpPCX7A60`|Gw?wdNkGrv+mI^XNszO>jAV;14 z|8M%OgF-5x9fnJO`AHx`^j%mwkGVUI^eHOgR{|V1$E}0| zhPVMyWB{jH0=IrEtv2VCM}g8I;3=n{zxBfL(<|-TCj-w$Ki|oF1Vd8!!WK00nn9-t+U%>u4U<)1-~G z5D`nEPozE+d6Nzk#U~cjv3ScBC1SV*dQ$1$I(V_M7|3LrklOld0d;9iBPx-3v0;EN=}v|{mK5Tp1r%;F~ow|43bUG7rH z9)h$DM^Y`(JN3?%_@)h2I;Z7&^-wSY12rfBK|jS&bxP^V$p3$H8x z_i}CpcTN;Dgv)(g@^jJR?lo*c!PKVkKULN|YLGg^qUbPf$)Knj0IVrX^r(AiC*E)Oo`*2sKT@P7O{S=>qD zW;3FiBFn)S5;r%MfEg1t%6cO0{MWr#>PN!FnpLfo^Vy1I^JNNodj!;1&k_{2hoj@( zdn>4@Zu}SVYuwbBFN-U8@&Ppr!No1mW#5GBT0|_c89OU5W42E631-YH-J09Gt{Ofy zx=>wT`lR4#_{}?%u5FgO6x*7-3weL#xgLC`ZoqT#PP;T)X@6{eQ^moDG4jh6rd4xB zDTEiBr?+_KIElIbwa6&{J}|F5y6f9@vAdlYw2f{q;%OTvhQ?NJ5-bb#|3ZJdwUaHu zz(qwyVShcSX7yxjYn3-I^dt21#<}3ctwNjKw5wu1ttv{*-@8Y^{|(ey~LX*c7B%wyP_+w`dBV;>ZJ7=p$!gM%y5{2~ITB&@8M^aNlXQj%`Nov;9WD z1<*0fZ*RXt#^kakJV(GtyK5HXR7G5CfA);_Dq~KV$P&ASq^QJP zf*};#E+Z$<-?zgp`cjl$Pr_Ti@}e=_@Q(T%9#p4E;-my}e?zd`$NrxyaJ&I{-PVVS zVU$SyhJwL&R<@nN3O;U%9<s~Sa0R6uY4{=lK>th8&xcwvE5*6##fY>!|7GELF|p(`wt!1oWNvEj2&6Z~d< zNoF<6DobU5G4b%Q&3>Tjg{(2lwf+~e9Xn8EQK?lA-jo!AJ%l!1?nlnyyT>WMTg<-G zCwEA<@pARVW}x6>+XggXR<8SITOol0SW_sAlc=GVW(4TAxI~Y{L`TWO*ujzu)~J1@ z4eS`ZrpfJiMaVfM(TKoQlqc1*Q2~dldH4qOo{`43?YCu%C`GGP&& zS@OCN1E9az@%fx1bwZ8Hy_T7n;dBvr&=1+U+c& zGg-tcZJcFBaUcIHqyJU9lpt`1r$!bUAFnFK7Rbr(4?=(9Mo z^@6*Wltsdk->j@ZUdT9UHw0hn9k8h%H!V85<)g~^yZ$z(o=O=j@nkWZ54!LE7h&QU zVZN#JU&JA=Ehnpo803BQMX6y>+Ey!ABsnj$2w6fkDTH_V2H`uM4 zJxxFBFx6&pQXQ*jw8N9d)_gM|D&zfP82@m3I>}ofR;dK32J?Z?`ua{v$!lXz!a)xAjz`S&7F=;yGO!a#f2fZ9%3)9v_Mf@7dkrlIeZJiLYdnSRZwW%hBe-UaV?UdkT*su(GC$Q&oJhd*BSWgX1v_$2<5 z%8!k%U)7f7ka(5EaHjSrNh`F8W_NKVM_mB=*?8@uCpT^4#P-ygO0ak-ZQz_snz-kf zkdFB$ceQW8Zo_SacqhJ^4C1O!Y-V{arF#3I-YxIUmdS}({Jx1LsqxyJs^1Fos`zVN8@*{MPK*7@*%Q)VgfEJqyit_v|CM?i$9*M#Z zEHOH50~VROVjjZ=-?q#9WhHToed{GLb3+9!k}m|dlc|TwlDJ#Y_1HKc&k(ej8(2YV zm!c__Pz9t=s$)M1?9_`ns1yn+5GUTocz)=f|BDUZyyVtQn%Ab+Intdh>t$MiL}znP zKXO2X z(0`A9`R0Gsddr==?4dz-&Gw8NMVm(a{NhY`Nl#C!)M(#GJ5*(a{K=#^cW=g$Opf{| zN(@J{k!k&}sHH?_PLAE%G~NMYjf7z-B{g;g?QT^BRVOpdWf$*qulAyzDL3$W?e&jN z0rEdTR4EvblxG<8m1S|2zK2faJgc*^7{2_$zm11?S$I=f<5607nQ4qVqXlIiKLh2#U_z_13z?F2`q2O+ zgySuVJ{BtL;Ql<|;TgS+yUP-9{#8GF>$*t&I|r>v$gevpwhj`lK_wxy3OZ6E)fN?4 zf}-QmS{4T&U0g0_;yX^yR!VfaR(eP^bX-F4Wdi6~fh>pztMw%QJ6MiF(()-NdOsb4 z;n}XXek^^OQMNedZgbrBv}oe0EM{mHLv3i6`&RfHS4@xQP{8nJ)4r5(x78eK54EA>Wuc)-k1DMBnU zY+js>`QhVs^X9t-F9~aZEr+Jsm|f)wd6crbTwQzZ;FI^Y8?y9pPV!HD?FtTQ)-ode z(ff_flM_~Er3l;dH&zk7{=pYTM_1Aa9|fZaL~SHxRYii+2B&Z~xqJK#8rrEKcD7ZP zKuUaum-a70p4<48l;lG6m*>g&F84#ER2lr41WM1mAhK(wkY`I8`T!%?H;PeurwT{o z?8rKKkoy46@E_k%DT3T6T&YN-41b~`y-oY}#1};qSR+_>LuiTLHNR2dnAb%+!hZ{5no<-HR}34Yu$=5}*d%YKoqELyB9hCu^tl4}r}j&Ey{F zzmBN(wjizWqs6#inj&3-mY*c#OAHi3G{arE)BcP3+3TK(R!<97W^P^RC#5*Pz|7xE zKF0qR4ym!CK*#eC!pijk+nel?_`isG!RR(p zcf&t6?z?K!u|D=2qy{eacnL1yUUI`RB1v3*j1;>~f{%L*56dsr7zu`u2hSFU1OJo) z{fo(xy}*F2RO8!-Py@N@&YR4kxlkfc%0NC7=OCzUI^W`fzF58>R0C`!wEW#rqa#<$ z13~XeU4m%>kP`%eL>@pxMD6L_V6<84hx|z^k$&Jfs(cMaScLQ^=C<0}2Fw`((pR=} z@EaH?0P?`0*bcFh0%$GkG;#>c*ZG$KI=-egd#DovQlXuQ-zng%aqG|^q(KhO@FAUH z1@Ld}gLozLJYgr~Wn6*5{)czgynGyvJcl>t&H?SY9PuW^H@v?Ui9VNq^a1ax`JYKAITm*-Ud;EQFuEt~I%h5E)Z0(hyfEwYRi)BK>B5xh9`Uil+;H(jd zZ4^QRMF8n3v}-V?n3-r2p<-k?P!@Oi7Os!O>SDnfwFL8iQV6_}^HM^S{{i-3Gpn*Lze}&)gq#!4U|U^lD1I4MDdHykNrr1 zOT$`_D4JPSsU~Iky$FQ%efhGG)KB)T@vPM8sR`ElpptXAgY(nTkP#LZk6nyLW zE6YTmWk}I&R1YlLN`PuHZDB;GekV=)6e+_*vH1oJ4G|WroQBo}(UKoTP*=f-yzr(I z-v~8NG`^b4EP^DT1(`q?M=gv{;9Go1#s@^?joM!)+TqDtGJ0J~SV6Lc7VBCtaT-?x zDHX7qDb#VMBL>dDUAZ;cQXUnO4feVT2qL6CMzi|q6Bz-+nD3J^Nr6ioB_zEU(&#z! zw!{P{HVp69X2xnrpgLPBl7y317FWYz(i-@G^FeSmB*=vLj20J|jvi^_3vn++GXlsm zahIrDDo-a2u8@Zcv4dpfT3eIDw9}fdOqDd+im~Q^i1F1$s}51S8D+ zxe%tmIuYqomEZFQp2mrZ8b|o>99uKrkEUy+1;QBk6;gx{i9PiWzqvlu59{}!y0+>^ z*?R+fttaJ_o-MWhwgx(#AN8Kw4YWIPb+zQ~F16*KeRfiK^jV`^vbFy){hO-po#Ia) zo{8|e>HJzd+4qj_U+F1ZYhUc&SnBxj_L*(<$CKqw_+0PWv=63@Cj5y-rMVBfH;c@F1ls=?D|<7)CQG3P#^1)+{{J8Ec_M;YxHlo- zG?fGt{&dxQ_B|P zjmuZw+a9sT*=TgrG+Zlm$Ep0D@6{LY*gMgK2Q%+_9iU2YXm765k0`z}7%^fL|NNWp z*Vtc?&!1mua0sPE&4oT=w1kE@@7dk5HKF&{=B9&V518R%c?I7UyW9}^^Loa{1AeE` zdj{=au%i7nvwp+0<6`;qD3kvv=8pa~a&y8vJM_=1$7L?wsFv73fB#sc?8a5Xl&9B? zkX^T(v}yv=|Ksj|Y9hB(aE`swP(;!)FmIm>My0Is3xRPhs!)3{i|ORb^^jGlw;Wrl z(1l%?|By3}zQ46QYpu-FSKeJMd%wqYp>m5-i^7wQcUYM8g8_hD*A1nXpMKig($a8D z{-`N(%Cbn{m?$M?d&Idr@8#`){HD$piTQ)!2TCrRXHMb0`6kj@HKPbQ_t@ z%}+nX=;Lt+G3pHtt6p6W>!Gx9!iA!uCcBPIq6A1;1b@05o3xBy6kWHRc_~IT=-!cV zabe@m#P&Wr8#0c_tpLOTV6)s1n0tnkL^8=DvQ`4bO28jB=0IXBlwl}ff!Qv z5QxoFs1oiJ2^JY8jfy5bBgz2QhSUPDgtqb46Ee!FJi}xC0`MfBea}m0p0p;Q@K3K*ewo0udXak~RI=^N*W`f4IfE8mG3DZ6Gld_HiA8yC8 zs71Kss_NBpHuUz5h){B7{b{=J*Mr}|=~E6XPnHkV`5XwB(EKZrt6n8TZ zch`ZAmlZiRHM_ohYdc$A^cwiX@0vu)^o~#$4aw@;l46$e8y?EuJ!63x>cI46ZZDgJ zsH*oB$;jhY3T)LA!NG@~IN!^D^6KfUeHB|1ep%>Q2~HIHfk0c66sdNXrM~Ric-#24 zrnS|{^7BV}+mXWs-%~U)rgw6%(Uq7heN8olr ze^=-N(Q3#Qus!Slsynd43Hr=Z)n~(3Av4F z^oEWrKl$6D5`NN}xbrZvW_`i6sC+H_%HXJrKItd4lgeU2@PrVd2nrxhe)7#oJcb(6%k?2!>@m#mP ziO1YOMH7`R1fY2Tu}fPb_|436Qg|b@-2$if!OD7O3F}5yp&I@jjqf#zOp>61peAm} zUd+AVfac%Xd)*%z-@1RnKh~~>y4TAqEdog)1vk68Q2+ZREseTU_1)d+?UqleO2P~% z0w*7FYStivK7DQY=i5cQM)DN=VwgZ*kZ2JEGKKz8B|`rzd9~turoZM`Y0jidtqQTT zH&sGvZb#(28j#}E2h;7rg+P@inV`>Y{_~rAM4rMia*s^e$YeTgM6Vabb z@0K3T41A-ae(zm;gqHK!?$pSSL^iiBC7^k#D$=OGve@MxTpp}n_R$N!bOP{vc&L_U z5h8~ioE)E7rl_O{SChElBi5G7>CieWxeyy0o3tIYtEGVkF92h7q=uK?Cq4<^Mph7w z;OB4UY*Q~lfI}ESt1l}^NqKDk#1fPdRu-)KVaTOdluYNmAb zSY08wePU?bu;m9#oCX(RXt|$-qj^dfbN`iVb=Bt+b~_ZSmB!#oe7@lc?T_e{$!w-p zL4obvhrj<+)N^9CO`8B(&a*)_*h%e3(B{WB>DjNz^FXWor5dcm>NM77@?`K`csfq- z!?B*Gp^ma%Lr91~ZLl4cx41YQ=w!Zk{v$~%KLV0Jx$PKE-L}e4gD)6=+}OE7*I&=c zijC!=?$xupYg;9LcHv1{BZ zGmdAq^ZQ=AP3)$FY_cfTdMHY)-yu`y#+w7}$rcW0lFeh}2{=_HyIY$q&OfNLEVUh^ z@sV(%BN+=5234sQudyc2PqnBZHs*coB`eXvIXK?#tc!Vje4Of`Bo36yUULHGBd}fi z_8>K+--Yf>T%xjb;bJ9cAeQy8=Ym*$ zgzOU~XlMxW77-q?RF|!7Vr?4&K{hwmUh$k7yYfa0-5A9JO_-a>@Sj;Xa1d+={C=-C2 zx%zdYMpms(MUJ}hTH#XvaA91>w;U`rjaDf!z%Kb*SkQ7l>X8AnB(ZSoRsv7i1j`1FChabB5tfbg{E zqng>h-3ogZpJh2Y^lQF&)@x+<&)|`^=JX8umov|!2@x-OUVZ1zhU4&)44a-$ZTW98 zF%@Q;e0Eq3CW=oC{uG@_Bcul&B*R^vbw@WztLJx}Tb-2alHwsTOuCa=ySuJb#do~3 ziV-r< zXD$CKi=U!ZoPFq(5+@U|GMR?2LWyCH3Q_~<4e#j&*jLEcX~`+zZkp_JTC6n5Y< zIBndsW-p)6ZXWg>{hBA-IN^k@^xf*Wjr{LWMNI0Ko5)_Uum}*)F;ZUN49W1DCOT}k zc>Jh$ey)O1T6X=a@t&HZ{JqC|Lo~q)T}~74xm9$b=0W`L{tX7zf@c=bXwDR~&bQZN zQ%?MKwX=lZOLVY&NM~#npzMrO!!0#+H$G&Rn=_nrX=TE6-$Du8Ay9D@v*s5*l#N)# zZo)-gj;>S$P&oEiT0M=Z_t#r5%T!{=;}YL#}+=56DB^RZr0&V)FH>};DIzbz4~a2^cje15V@2}dijchI1PeRX zvuk;A2~+R*cxTj<1yGXFP&$lmh+X9?i(5gK4&xSV2Ir+bIlMSiKpFS~<`>e-!62L$ zIE*+b5Hl+zu%PG(S(u0hty;Ps?jgYh5m?N+Ec`l=ZT6|$Y&tlwXSGp_k6o`}vi^^x zYmaAo|NnDKH>5=6GDS&JITht#R6@nv$z?>R3q>yLFl{4ACFasyZQbWKqmx{+MlRFs zON~vE+Z49swi&bS{9Zf1|7wp1wtYUI_xt^NUf=Gn(Phic7El5TL@3fnI8YummD4mP zN9KYVD5c2$3}hleqK?9}%>!G9{c`W&P@-xUMRb$I2ImSM+Gpwm0Be~=PB_Sd&H;Nc zVrX^N*pIQdt?Q{J`8j}(Jr++h)jZm|8fitmS^iX82UXK*WtpTZ(P4pKh|% z#Fh*KG9QoH$B!#cYd_dUIaHHPdYbXi>gd33GMJ;mN(ZQHqo;Pe0TIrhM)v$nnrK`R zWpRAMu%KnniC;huXPu%}dr%fbRENKE zm5Q0{8$hCm`u9)lHw*|E7tmMeE)pYCiSQ&1*?y1aM(jpH4?X;NeaiR6JjJ&jEo959 z!8IAKS>+Rg?Y^$*C}$QxN@o{3Bz0Y|poE8BNT~wuBuTUWb5C!2Lv+qr`M17Q*pvji zo5Uv~zm)sKN)SbQ+{E3$vy0km6Fut!G#hrbyN$byj zO5-zQBWd|o>+Nu^+K~~9Rp7la5@h%yHru3Jm=J+t$r6ZIW6>bjYF*OztR476+R7_U zm*da0pHs_}h@}v!w+O1eUn0kV5$5&3G^*mRUuJ}m$Wh%XU(pUP13}CLOIz5a1iM{poE$=f7|FSarTNYMla{Q`bVwY3SqWLoBEi+*WlHZxW)uPI6=X$GKpD{u$(Cg@ z*R&fkFtut`Ewy$;dQ5CPV-Byt0;*t^05!N|fqU7u3OD2#HWT}-ts0fbVw_T;sc>H= zL}wudico-Y2yYgB_WG0oCIIGXewTfM6+(Ue)sfHf>IN4zYQ?m*0!MPK^OAheyql^8 zC-XR)Thby+{EamoZaavdr<>3MxaAuh(0Y1|Prs6-kZ%Wf7AbU8qPa)X9hjCF(xt!q3x)`hpx zWpEtx3p+|B!NeUfB}pNHDESPwyA$ywlMzR z=;K?v?n>mlP4HMvO8fgVApv5uQn)icT8ZlShJvx5AYshb2=1$m{kVKwdsl8-&edIB zXpPSA7jh4+T|@K>cap5Yciq^r332vS{=mcTzcksclfu&W1~}-pPjt@r~9s(i(ZvHa^7gUAyRsnxK-q3*>LtA z_6{PIb>yDdmojLqVSN07-}F+nM^VO;jrT#*#CWO9Tw%&LL!74G4YxgfCnK9iaN%Z! z$wabxixIYMouEl>oOf<7^Jjk;f&PK6;=vfym0E3T)|%^A2xOa^HEN{V?I?`pIsC-9 zAgGvYwKBij)}O!3Xy3(sw~P}ShO<&QjshGBlf={Hm$k1T9zL!8Pm$fq+ty4W>~xV6 z`~9srqLbxgr_5-@*Yb1Lnvwt3Zdw}HHXiXyeIQWT%?`1|K^p8@%y05pw+$V5WMg3Z z(|-|ZTUrGzB%!#nD++g`((~F9f7g=2&0U^%{yI7ov}W|8%}rD4)Ju|uRp_>jetwJi z%@V9X_u?-041N3=YKw?*`1xJ>G*!av#9dm?RLMs}qx*a{Lqr3~^v1bLz2P2?3EvXp zlaC708(tYGyU#HI5&X6wQcK{blMNF))+>LAe5#BMB{ug<7C3nvkx>o4LPA!{&SpW$ z#R2nO0-R*%^shZq`I1FEL5dbUb+d0?>#zz_i5yhHL{D4}u-VO~+E`_27|cKTQ7Wd> zu5PsHgv_RTp-}=x?}NBk<*%n^E-^O%k$SLdsIqUl&qiRg;T*eiipbfG{ z+$tfHN zqBp{mG%M#f*5p9K3q**3m|N-m>OIp65RWW?aqttCNHj(XhD_=z*g(XRL^qr zb(Jqphng*rD0625=htWX`+ZgWll#H8W^&8gwawwLSClNh80eSodzxy%W&c1slw~B8 zQ`bD(GfxP$$qni$+czf3D%5mmEUcc#{#Gepw81U>(T&hFV;p*bG}q5KEgS^8q^VV( zuk;gEM7AuJU|`NoH>#bBaU6~sKnmuh3zbHZv}kI`h2sg0*465;dsc`&cY4rDY6N;2 zn6>wlXcSRR`dcl5TTMs2wYv=QAmiD!{q5Js(`l1MO@Pj85lNw_vUw#r-wLOQS`brZkkYV`Jxum zV{4KzoRFA(Ng(bI!hTk6VxJ#2a;Wcz+)$oJy@r+ncIavTVql-;6+egN_L3(w&V%>| zKW|E3yk{SZ%--GB>axrr!ZZ|3(024grfvn%(PN#Zn^_WO6X(ON4*{|e+w2oRhly7~ zhk&LviYr_&>g8`W@gN~Mg9giatj9~Yv6&dpL5mlQ3>yn6u|r?dH+n~pP5tq+(`Y~0|%zvwy@Sjno!)ceCpe7rtPkBe3p1^B~-69_2 zl-r*C(Wq0;$(PG-MFqXz`}29}#YgM*J}kcIqf_xoKfbJN=}nW1d&NJt@C{v!Cmo)A zD6L59ewtcp{z(0biPZ3b)lF--iYzwip|1EB4oia+de3cZ48uAJYHwaC@{u`kCiAHK zqTabm<^nfz*20t`OwM&Ba`a4+o-t{P$%IMhn&{sBr|~9jmk+=Yk2jTXkAt#8KCP%2 z(IHAJcU-!42_q|TvKPWZfU7On*h8-T!>V&hw0@;TMtrf@LFQ4mCQhLLbzknAQbZuZ zRsI=H@s(uzW1^MGp<%&6tuRD_oFgiy67OEfmcz`})K_0ug}41*$;0paZd$fvw84R% z1lUtuu~~ar#w}>zOeZyf0vw|5K$Vc^ir9`itSi4LhOn1u!BHA+N|@`?^(hUexltxh zG`zsYfUkSVO|56RTDe*OC?ORZ0<|Z4ZL5+0l*b|cIv?!s5}CQz+BnF%ke6|{3fi{w zHHyGq-I?zq_35vdoO)>Qx~eu}jV$qjL3eMkU{3tI(5k~1`>p!fu4;?<=%8jfcxy!5 zRMUH+_q$JrC`A{350E;f60eGXzht?#dyFZkJ|CJD1r|b$4;=g#x^V7ABC8dlPCo@Q zwKQp=9M27Kw<^c|^h|ZDWGeUe&wLu6z^X&@=cYfGokl>Q98j))_PAQUbr$0dlQYEC zgH0LYv{)W0IrR+}oqUc#2r1zVwAyIaZ%#6*EU850TN0-rHOpk`HyGVcq?Ze=FlRh_ zxN>S?$`m3TJML%@CwTwNdCo>1Ev$yNT*EUR_pl#Y^+h}E@E}!?LU5G*+z4&md}9CZ z9h=$`LmH5NCru+FxQzL?>Gz{EhMN& z?%KU7o#UJHYq!?aQk|ojT$1?p!sj(CUrUb{Ny2=MRMgW1+1@HO2S1Y>~gKODgsf>&wfD|u*~%fvvzgeQ6htuPwyeqqM?#Uf@C!QHRxJl zm$|Q%Oalc2m#1Dkr(DacUXRh>71=H{4bEDab!`ve;4Xi@5uvr9tb=1xP5N@k4>Y`T zp6oE0ih-qd;=ocY?ix0Yw=sihqfT+B$sy}ehQ>V5aN_K~dgB&TwGa`rSeY}@mu>s1 z0ypecYbG%V>X3GFW}V;U}-ECzp!F|xQA8td_+H1-rEfvzUBBoUoLIBF+EluhdYT}Q zL%Q!Dn_#It+l;r3xSMRkcTTGkt<>Uxv=ZMLe)5?`r~m$NVlkAXvP}9)ojmS?C2(Zy z*!+g!JV;hNunzm?MUdNy4HqLW|8i0C@q*#Ey$<`E`EMt6`?|c8X_P^?7Onlwbx+a% zwg?|K#$&{IX6@kmv6F3Xv2|tWnsdGj z5z)cXxlFHh?;c(bJ*0nFbGb#3_V7U*LH~7W((vUahAX|Ey{%N@=G<0UZZ{fb>v5;% z#dMOvG9qbgpB60|<}=v<7iNMg@#;0H z8bX!`$$?C1Y=0`mt&MOm9nrX=0>O6B8$)q;sYMN`Kgi=Jjig5t_WtKFy|sCrzjjs# zp}=A>tZhfLGbO_d-x2M>LvbAItG5P%xCWSk!f#&)nf;Z372$q0KNd@~ricxanRAM& zA*>+tdO=Fu{7^5ck*Ozs1Eb*;=0laSIY{y529@K)S1_}3fd8P$N`#w)6rIXyJLDte zVPI_yW2ywCOH;xDh*D)@@V`rTa;r3J7nc#LC21mF4tPSN45O+9J(dx0Ezx!|Ev7EN zN>D`_lO!8xO-Z4gxt;`8^eqP;N|>&Ux817}+G?4Mb)u3H`$MG*CSH46_xq?BJ=?(w z_0sV3E;5)ud3m!}_HXCM!CJGXW4p&>hgMDNAa6pToR)`cTgY5^#2a9M5oVn=KqyB#;gzp_riDS+ zP@=nDyLO;EPF}NV7OD@y%2FZ}-@L8lwP^j0nhQDBj|*3?c8HIXeoV%GIN^UXc{*`L zi<{f5=ZjsZUgofGZVCL@Q&!ew_x^y<0jsid`c)ji@@^P<;}#-bC!f;X!)H}jNc*G5{^ZOrH5}*H-fs#A)NSn4iQOu zWF$ol0@4$NYFMU^(2@px&oJkfb{6U0SW2?(Z2P&={K86?b=NL7xfQLn&^?S9bhW8= z;CHp&Ke<~tkNwO1f!{oyaqjkqoyn#fAJB?FF@gfz+vlbte-HC_+xtI^EVo#}$o>sn zBlM4ZszaakiQNolABex=AREq4@Xy+66TbQ!w6{V8B>j}GHH0v9$4zuWmkIE1XmJw= z^&v2>FRg`66ph1P8{A)|2@zY1QFaMXltYk}fGpzghx&zu{~}r(?k~)iE8Ni%*blto zT}B{A4?^QWDl$cyRgq{-%G3L=!t?XiN@$w1q*l)KgqXYqPnfIw9QHuywwwt9MpZ0x z+v~sykyPv1xKIk|beTZ{n#w3@lVX1vSm;uKkJrK|v#<{wI|dog0J43@@p!zkIjQD$ zSk-#!xS@c@^%KKzUC>|9c-QOj%B%53?r)=PqPGu?6ihUvde}~xWrm)r?!YUAW8eI7 z&?nuhB>|X%54zj)#e7wKaut(X&4>~T@X7f@Ka!Z@}yyQ{&*TZ2?rb8=rvkK3Y5)%4+0QC2f7e;4Q6 zo!hEZS3b>MtiIv#rGN}4I@LqJV7*ge@7nvVJ7XhW-TKokx0v?$+ZywK{MLl1?V8rh zTz$Q$*ALs(uDao!zQ4b_x$=ZbRr{;)C;7_~FT1Vt_f$H+bS-JhP|2VA*;mWameKrf z*Thz@vMtTI*8)pa8hu~y%-y4LgwB_?;n`=*ma}01!i4NPVPBV4jo!BJrV>NbNLoq9VfmlF`ME?ynhI=EP(!mb}FWLMnJt} zv16T4^TRx>YPh{E*K<*S-Z=<+?xtgQF9M)vb;HkLq?j@ai!dxJZ2B6KLBB-i&TLMZ zEdX@wVhC*K#CmWKF@3o7bL~f$N6N$^n1F*sgGl6lc@w;;Oh`4rG2(X=ej`muw1wbi zhli(xTHbs{qY;rsp|vkWPOyH#?f!N{(l8zkcPVM4zm%JWozP=Ti1le8yaWxr>Y42) zD&@d}R2jWQhj6sqa#MBwShTT4v;*ZlKzU~^9vaESl-rK4urT+eJ#X>L=#-T2S80S} zt57`D=R#Lb65aA!xi`1u;>VBgujD=J?!D>S;E8$+S1~Cs)2)U+7t3B8b-l zhxeGwzS~OqL3BW#AoEi2MR1D3m@W`W7G|HrvwA%HItVv(3naVT3O z%6=lu(!}ETh7-S02<5oRy#l(nJYA{=NV0>t2-uq+m!&1~YVS+~6Cx*C>O^Q|kY)8X z;N59)EldZICp>b$THTDZWU(?OBbnj{Ce}!hpT<+VXM_%-qUCTOaPpJ3XxSCWP{t{J zf z8P>w!KgonX^-Ffh2J31r&~A)*HmJs%kM~oawVPdZxNXuW5o0>eLU@c!9SPmX5M%xO z_0$T&BYI>*HHw}0pL?A(SD}*Qz!VgcJ^^tdRab=Ac57eEp&v?b5HAkYZ zSFSmFR8<*q-R!7NwsY1RVRtGb`l2iQvF1Y;Es+oHqB+_AZ;!WY*Y+%q+P&XvMb1Ol z&ri_WS3FAfx6`(l{}H2tI8>Ozwmhg|E-%49h^lQ5ydEARbC%!7BNX%BcRN^EXAU^O zxn*pmFKT;bb#4ddE%(r1T1e#h#Ia~(inIDx4{L} z>cQ!9ra=M`N3;Eon@w+&;**$?-UX2hY>c&wxq`M@9-qh^0j8`9%O}6MQmZ`Zgz^z0 zb3l<>%&9W0I?d21a-Zc#j47%{qcD*U^KwVAqW91|@s|Wc@l)L$BQK!s=S1 zNCFX)8708lCl@#B8kF>=CA89u5uiX9(*gy@NR&X1noR}M43foTCmKX&UCKZ0;fVkj zBXnUPpJAdJ8G6J4W?ew(e=~x^=m1hHAIb|yz3l}BZ`>|Hk7Ou3;v>2mbuuAfMcN z#nelSHntGw_|zhFFXCz&V0TRtN*=46edcTXwbaB{DLI?iLkIR z%6KMHZi56ft>Dl)BSr}$E>SY={>x=Re+Cq5UF!bo+~PI=Tql_w`dSiHR~Gc%9c!s} z#MiH2pKofe-zS5T%d;D=pFOu#-DdT9(|Z95-46)Z*GC{W^~GL)$e3fQjJ=cQ#h%Rt zA$UE1i2<(Maf7(J6WnO}P;OqTe41Rh1wGuyo7}3#+|UR8<)?hfR9qNFOts!zO$qLsJ6USJtKFz(O{1P7 zp`}_C^t_y^UG_L?`3Bt+U-oVqMm{uN)>|Ny5b(dBlm-}DSpSY8X`zD+o!8$TIk;rQ z7QI^C4*9-C;JXqA+v|oM{g62Nxk`DS*pf(oR!(DaSYcTuB`sXXkKmPEz0<3+;rR7d z`MN7>L*4xUvIbADIKcVlAy*~!D;u87CZ1kpci;~z)pI85^H{b2Jr1lqfA+|)W|>>< z2~?pB&D247V(apwaLvv#)4qOz98M^n;F)71@!}wUc{QP{G`%)k&=8QBsVk z(0Z+b%-QC~G{`a{koieI^hI=|dc>?6X&IrSNqmHyAjs}T z(tPu{?vi)Nv?6>`wVsiPo2mJ<{NfT*o2S!fmKMgb6wSjSBEviquP|qE6&G54@e8Ht z9yOOmfuS@5?g2C3^+s@Wz(UYY#M@T zO2wv#-7Ac-9|L>wXAn$qk!TV4wQKo~HUAvc(%mqUmG%x0J7Z)PHE`q9vXw+cmhL)w z5mbP2wZEM3?zO#ZQ1ZVoD>=cd-scg)tHvmJjL#-1~sCMt6jhhFg;`xG}GN9Qlbr#E#j5;AbTCCF`MzVq0YIkPa-1LNE! z3Yn~jz2punSedC6;--W>_oOp8*S%dei=fWL)~#cgnR~6w@3Y#W^s7AB$)uy~>|7YA zT|?%D1N%cnYfJRUVp)1X@TSb(8!5fSx1wq1wQY1W4HL*<<77z4j6Ei1MSlzj_BDqD z7A^YdG7KxcV4Ci+)zI}C!{e5%lj=FH)Gz=wfal-0t1I2#jNL0x+n>6XieA>PG8Rq2 zJ)$1Da>2@{^WjkwZ`3oEs1|v6Vajl~V{n;;H;dh-l8-X3ltMrO0D9LW%Zk@qJYB)5 z*)$}b5khQJC&{6dYVQ^{S!-ID4$dc>MNXkf`7g9u%#+FFN+?u*X3HG`WpZsz9eFDR zB?KyRrp&wexQ5RwHQrp7YK;+Dj7ez2xjeawutZl%dRT3+Fty?3SVL3US&bIjoF1|R zN#HlmV4hU{k?JzkoO(8e(g5%V&N$~mfW1@FHL^3a9}fqoj(OqeZo^|(R0rwdK=)+K z9=nvT=%&(Q!+m*cUOhKecKx#0G;1n4rGI(ifJtWH#=!%}wx8e_adWfqOBjp=lhUG3 z0Grsjv!_zvw5Z5;U-&@1{evBRQ!3A0QdRCu>P&fLgx}(cJAH$1YBfS?&_l@Kz-e@Y z?zuL`O&66lC6s7S_|A+CIGb}!R7SUXf95X@S(beuiVcbbo+95NEQpgjQWlG(lE&gu zR7Ju|g}B7XtaQ=p_P_=UY;|WZ=@$^E4x;^CC0Zc#>ngHFANua{wD4PcWGrY%K0h$~ zP#zPlZkVVOzcl?AA&^XjEJJKvP96I^BE!aR@~qr~#q?%GJt^O|e_P6B^)oLmr z%!FGvROHTlsbr7^2y3Sd;3fJ{L zYAQax>$ID_g_n2zKW?jNXDIPe#b5s9U%PKws(YJBf49m;#SMd>TW@Op*!;&eB4u6_ z&T}^pBS*{E5w|_gun6CS(3d$}n#A{|b7=wX^wpb2+)OE622jT&1UD!(q$^NmY%oo) z2EK}5=)DHF*{Dkl;g$hD2{kCQ|D9gKH~bq81{pPQ$q9m<%%jJt`5PX)eqZ*uj_UYVFnk z-;tMro2N48HtANMJ3jn=Wb#h}nWE?DNIp>1?#niP5qi^m@!egR+ZvK8>QZtG=50>R_uG%~3k^fFl zSu6@n7Xo!Q2*$ z|1GQ9JMbDd{?x2X}GnO$!49Wm;-)s+Hw3 zPF3PO`5X3ithv{fckWkJX(PR^DV8j;mxc%&R+&chyqc{+X)&1H=DVcOp7sz4Kqk`CV%gV;YX;)a+ z!ypo0=L@wYN?>tNm!CKZ+8rw5Ti;tSa~4l~?YmPF1Y4F)zVD~7(8HTHFMV{>9eo(B zT5;Sog1ky+d{^E<-F<_P<_1sdbR3KBx?(2N<41$aaAoi-Kcwp$j5f zn`NpJV;ReW8ERP$)U|AB9nO%<%t}!hg|FWrNEl955&{zoij1g`r z=akp-D;rPi>L#wTJGC({lJVe4_O;95d%em+rixNNhk3lxI(qre7Vo5?Ls!;6IDTzi z&9$;g*0!pgk~M{+1B9W{KJGfEgZS~|n~zW*=+Ou+De(A}f7b4Ltam=5XlZLT>HxX{ znKser;%CX-XA!c@#@fajP)4ouY)+L?oo{fV5)}Ik!Yp=L;OBr(7*0L&%x_=zW>|kp z*3m?$i-b2KDx_LsBP0K+9_pzIrc8+$kQ949AVV$2b)dJ9!eX9c0fl;qylrn4jiB-7 z6)5E3l9a#vmL{yWlMy*)eK0Bol&?GcP8a1RuLQs!2X(uLri4TNWMcO+2xMf0h`tn? zWH3e5Y)S79h5Duk_tpM<+eiUy0Gq^sBBjjUA1UEa3vw^dsw%s`?9NM}jKNpRsq!h` zWVzMJdu#H@DB-Do+(eKCn8Rw-c%ww*IF0rCv`Go5GSJLZ7mZJL zYcE)2BIn_1r+l%katY~L6MFEW{$)g7T*}u}Ddg$y5se25ath)d?vn&UsHUytR7Eh3 zuP8{-?*V^!6`(M*XaRFIEhP>huM|njXNw;SUs{9>#QQ-_kK!EJ*Q5!v>euTt37^WB zFp-_aNbQ034CGk^EKr+?%x9@cJD#V

T6}&$(TCrO8H~Z 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 AhC>) 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 KLErG(?*9U2NC7th diff --git a/appearance/background/testdata/Theme2/wallpapers/README.md b/appearance/background/testdata/Theme2/wallpapers/README.md deleted file mode 100644 index 39528fb72..000000000 --- a/appearance/background/testdata/Theme2/wallpapers/README.md +++ /dev/null @@ -1 +0,0 @@ -#Test diff --git a/appearance/background/testdata/fakeimages/empty/notimage.jpg b/appearance/background/testdata/fakeimages/empty/notimage.jpg deleted file mode 100644 index e69de29bb..000000000 diff --git a/appearance/background/testdata/fakeimages/fakeimage1.jpg b/appearance/background/testdata/fakeimages/fakeimage1.jpg deleted file mode 100644 index 63666c252..000000000 --- a/appearance/background/testdata/fakeimages/fakeimage1.jpg +++ /dev/null @@ -1 +0,0 @@ -FAKE JPEG1 \ No newline at end of file diff --git a/appearance/background/testdata/fakeimages/fakeimage2.jpg b/appearance/background/testdata/fakeimages/fakeimage2.jpg deleted file mode 100644 index bff0f8747..000000000 --- a/appearance/background/testdata/fakeimages/fakeimage2.jpg +++ /dev/null @@ -1 +0,0 @@ -FAKE JPEG2 \ No newline at end of file diff --git a/appearance/cursor.c b/appearance/cursor.c deleted file mode 100644 index e7a0a3685..000000000 --- a/appearance/cursor.c +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include - -#include "cursor.h" - -static gboolean end_flag = FALSE; -static void update_gtk_cursor(); - -void -handle_gtk_cursor_changed() -{ - static int sig_id = 0; - if (sig_id > 0) { - end_flag = FALSE; - g_debug("Cursor changed handler has running\n"); - return; - } - - gtk_init(NULL, NULL); - GtkSettings* s = gtk_settings_get_default(); - sig_id = g_signal_connect(s, "notify::gtk-cursor-theme-name", - update_gtk_cursor, NULL); - if (sig_id <= 0) { - g_warning("Connect gtk cursor changed failed!"); - return; - } - - gtk_main(); -} - -void -end_cursor_changed_handler() -{ - end_flag = TRUE; -} - -static void -update_gtk_cursor() -{ - if (end_flag) { - return ; - } - - GdkCursor* cursor = gdk_cursor_new_for_display( - gdk_display_get_default(), - GDK_LEFT_PTR); - gdk_window_set_cursor(gdk_get_default_root_window(), cursor); - g_object_unref(G_OBJECT(cursor)); -} diff --git a/appearance/cursor.h b/appearance/cursor.h deleted file mode 100644 index 615cef4ab..000000000 --- a/appearance/cursor.h +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef __CURSOR_H__ -#define __CURSOR_H__ - -void handle_gtk_cursor_changed(); -void end_cursor_changed_handler(); - -#endif diff --git a/appearance/deepin_qt_theme.go b/appearance/deepin_qt_theme.go deleted file mode 100644 index 21e0c1474..000000000 --- a/appearance/deepin_qt_theme.go +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package appearance - -import ( - "fmt" - "path" - "sync" - - "github.com/linuxdeepin/go-lib/keyfile" - "github.com/linuxdeepin/go-lib/utils" - "github.com/linuxdeepin/go-lib/xdg/basedir" -) - -const ( - dQtSectionTheme = "Theme" - dQtKeyIcon = "IconThemeName" - dQtKeyFont = "Font" - dQtKeyMonoFont = "MonoFont" - dQtKeyFontSize = "FontSize" -) - -var dQtFile = path.Join(basedir.GetUserConfigDir(), "deepin", "qt-theme.ini") - -func setDQtTheme(file, section string, keys, values []string) error { - _dQtLocker.Lock() - defer _dQtLocker.Unlock() - - keyLen := len(keys) - if keyLen != len(values) { - return fmt.Errorf("keys - values not match: %d - %d", keyLen, len(values)) - } - - _, err := getDQtHandler(file) - if err != nil { - return err - } - - for i := 0; i < keyLen; i++ { - v, _ := _dQtHandler.GetString(section, keys[i]) - if v == values[i] { - continue - } - _dQtHandler.SetString(section, keys[i], values[i]) - _needSave = true - } - return nil -} - -func saveDQtTheme(file string) error { - _dQtLocker.Lock() - defer _dQtLocker.Unlock() - - if !_needSave { - _dQtHandler = nil - return nil - } - _needSave = false - - _, err := getDQtHandler(file) - if err != nil { - return err - } - - err = _dQtHandler.SaveToFile(file) - _dQtHandler = nil - return err -} - -var ( - _dQtHandler *keyfile.KeyFile - _dQtLocker sync.Mutex - _needSave bool = false -) - -func getDQtHandler(file string) (*keyfile.KeyFile, error) { - if _dQtHandler != nil { - return _dQtHandler, nil - } - - if !utils.IsFileExist(file) { - err := utils.CreateFile(file) - if err != nil { - logger.Debug("Failed to create qt theme file:", file, err) - return nil, err - } - } - - kf := keyfile.NewKeyFile() - err := kf.LoadFromFile(file) - if err != nil { - logger.Debug("Failed to load qt theme file:", file, err) - return nil, err - } - _dQtHandler = kf - return _dQtHandler, nil -} diff --git a/appearance/exported_methods_auto.go b/appearance/exported_methods_auto.go deleted file mode 100644 index 5850198c1..000000000 --- a/appearance/exported_methods_auto.go +++ /dev/null @@ -1,80 +0,0 @@ -// Code generated by "dbusutil-gen em -type Manager"; DO NOT EDIT. - -package appearance - -import ( - "github.com/linuxdeepin/go-lib/dbusutil" -) - -func (v *Manager) GetExportedMethods() dbusutil.ExportedMethods { - return dbusutil.ExportedMethods{ - { - Name: "Delete", - Fn: v.Delete, - InArgs: []string{"ty", "name"}, - }, - { - Name: "GetScaleFactor", - Fn: v.GetScaleFactor, - OutArgs: []string{"scaleFactor"}, - }, - { - Name: "GetScreenScaleFactors", - Fn: v.GetScreenScaleFactors, - OutArgs: []string{"scaleFactors"}, - }, - { - Name: "GetWallpaperSlideShow", - Fn: v.GetWallpaperSlideShow, - InArgs: []string{"monitorName"}, - OutArgs: []string{"slideShow"}, - }, - { - Name: "List", - Fn: v.List, - InArgs: []string{"ty"}, - OutArgs: []string{"list"}, - }, - { - Name: "Reset", - Fn: v.Reset, - }, - { - Name: "Set", - Fn: v.Set, - InArgs: []string{"ty", "value"}, - }, - { - Name: "SetMonitorBackground", - Fn: v.SetMonitorBackground, - InArgs: []string{"monitorName", "imageFile"}, - }, - { - Name: "SetScaleFactor", - Fn: v.SetScaleFactor, - InArgs: []string{"scale"}, - }, - { - Name: "SetScreenScaleFactors", - Fn: v.SetScreenScaleFactors, - InArgs: []string{"v"}, - }, - { - Name: "SetWallpaperSlideShow", - Fn: v.SetWallpaperSlideShow, - InArgs: []string{"monitorName", "wallpaperSlideShow"}, - }, - { - Name: "Show", - Fn: v.Show, - InArgs: []string{"ty", "names"}, - OutArgs: []string{"detail"}, - }, - { - Name: "Thumbnail", - Fn: v.Thumbnail, - InArgs: []string{"ty", "name"}, - OutArgs: []string{"file"}, - }, - } -} diff --git a/appearance/font_conf_version.go b/appearance/font_conf_version.go deleted file mode 100644 index de49df707..000000000 --- a/appearance/font_conf_version.go +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package appearance - -import ( - "io/ioutil" - "os" - "path" -) - -const _fontConfVersion = "1.4" - -var _fontVersionConf = os.Getenv("HOME") + "/.config/fontconfig/conf.d/deepin_conf.version" - -func (m *Manager) checkFontConfVersion() bool { - if isVersionRight(_fontConfVersion, _fontVersionConf) { - return true - } - - logger.Debug("Font config version not same, will delete config and create") - err := os.Remove(_fontVersionConf) - if err != nil { - logger.Warning("Failed to remove font version:", err) - } - - err = os.MkdirAll(path.Dir(_fontVersionConf), 0755) - if err != nil { - logger.Warning("Failed to create font version directory:", err) - return false - } - - err = ioutil.WriteFile(_fontVersionConf, - []byte(_fontConfVersion), 0644) - if err != nil { - logger.Warning("Failed to write font version:", err) - return false - } - return false -} - -func isVersionRight(version, file string) bool { - data, err := ioutil.ReadFile(file) - if err != nil { - return false - } - - return string(data) == version -} diff --git a/appearance/font_conf_version_test.go b/appearance/font_conf_version_test.go deleted file mode 100644 index 989352b33..000000000 --- a/appearance/font_conf_version_test.go +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package appearance - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_isVersionRight(t *testing.T) { - assert.True(t, isVersionRight("1.4", "testdata/fontVersionConf")) -} diff --git a/appearance/fonts/family.go b/appearance/fonts/family.go deleted file mode 100644 index 1658c3862..000000000 --- a/appearance/fonts/family.go +++ /dev/null @@ -1,199 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package fonts - -import ( - "crypto/md5" - "fmt" - "path" - "sort" - "strconv" - "strings" - "sync" - - "github.com/linuxdeepin/go-gir/gio-2.0" - "github.com/linuxdeepin/go-lib/xdg/basedir" -) - -type Family struct { - Id string - Name string - - Styles []string - - Monospace bool - Show bool -} - -type FamilyHashTable map[string]*Family - -const ( - fallbackStandard = "Noto Sans" - fallbackMonospace = "Noto Mono" - - xsettingsSchema = "com.deepin.xsettings" - gsKeyFontName = "gtk-font-name" -) - -var ( - locker sync.Mutex - xsSetting = gio.NewSettings(xsettingsSchema) - - DeepinFontConfig = path.Join(basedir.GetUserConfigDir(), "fontconfig", "conf.d", "99-deepin.conf") -) - -func Reset() error { - err := removeAll(DeepinFontConfig) - if err != nil { - return err - } - xsSetting.Reset(gsKeyFontName) - return nil -} - -func IsFontFamily(value string) bool { - if isVirtualFont(value) { - return true - } - - info := GetFamilyTable().GetFamily(value) - return info != nil -} - -func IsFontSizeValid(size float64) bool { - if size >= 7.0 && size <= 22.0 { - return true - } - return false -} - -func SetFamily(standard, monospace string, size float64) error { - locker.Lock() - defer locker.Unlock() - - if isVirtualFont(standard) { - standard = FcFont_Match(standard) - } - if isVirtualFont(monospace) { - monospace = FcFont_Match(monospace) - } - - table := GetFamilyTable() - standInfo := table.GetFamily(standard) - if standInfo == nil { - return fmt.Errorf("Invalid standard id '%s'", standard) - } - // standard += " " + standInfo.preferredStyle() - monoInfo := table.GetFamily(monospace) - if monoInfo == nil { - return fmt.Errorf("Invalid monospace id '%s'", monospace) - } - // monospace += " " + monoInfo.preferredStyle() - - // fc-match can not real time update - /* - curStand := FcFont_Match("sans-serif") - curMono := FcFont_Match("monospace") - if (standInfo.Id == curStand || standInfo.Name == curStand) && - (monoInfo.Id == curMono || monoInfo.Name == curMono) { - return nil - } - */ - - err := writeFontConfig(configContent(standInfo.Id, monoInfo.Id), DeepinFontConfig) - if err != nil { - return err - } - return setFontByXSettings(standard, size) -} - -func GetFontSize() float64 { - return getFontSize(xsSetting) -} - -func (table FamilyHashTable) ListMonospace() []string { - var ids []string - for _, info := range table { - if !info.Monospace { - continue - } - ids = append(ids, info.Id) - } - sort.Strings(ids) - return ids -} - -func (table FamilyHashTable) ListStandard() []string { - var ids []string - for _, info := range table { - if info.Monospace || !info.Show { - continue - } - ids = append(ids, info.Id) - } - sort.Strings(ids) - return ids -} - -func (table FamilyHashTable) Get(key string) *Family { - info := table[key] - return info -} - -func (table FamilyHashTable) GetFamily(id string) *Family { - info, ok := table[sumStrHash(id)] - if !ok { - return nil - } - return info -} - -func (table FamilyHashTable) GetFamilies(ids []string) []*Family { - var infos []*Family - for _, id := range ids { - info, ok := table[sumStrHash(id)] - if !ok { - continue - } - infos = append(infos, info) - } - return infos -} - -func setFontByXSettings(name string, size float64) error { - if size == -1 { - size = getFontSize(xsSetting) - } - v := fmt.Sprintf("%s %v", name, size) - if v == xsSetting.GetString(gsKeyFontName) { - return nil - } - - xsSetting.SetString(gsKeyFontName, v) - return nil -} - -func getFontSize(setting *gio.Settings) float64 { - value := setting.GetString(gsKeyFontName) - if len(value) == 0 { - return 0 - } - - array := strings.Split(value, " ") - size, _ := strconv.ParseFloat(array[len(array)-1], 64) - return size -} - -func isVirtualFont(name string) bool { - switch name { - case "monospace", "mono", "sans-serif", "sans", "serif": - return true - } - return false -} - -func sumStrHash(v string) string { - return fmt.Sprintf("%x", md5.Sum([]byte(v))) -} diff --git a/appearance/fonts/family_cache.go b/appearance/fonts/family_cache.go deleted file mode 100644 index 9222b041d..000000000 --- a/appearance/fonts/family_cache.go +++ /dev/null @@ -1,111 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package fonts - -import ( - "bytes" - "encoding/gob" - "fmt" - "io/ioutil" - "os" - "path" -) - -var ( - familyHashCacheFile = path.Join(home, ".cache", "deepin", "dde-daemon", "fonts", "family_hash") -) - -func (table FamilyHashTable) saveToFile() error { - return doSaveObject(familyHashCacheFile, &table) -} - -func loadCacheFromFile(file string, obj interface{}) error { - data, err := ioutil.ReadFile(file) - if err != nil { - return err - } - - var r = bytes.NewBuffer(data) - decoder := gob.NewDecoder(r) - err = decoder.Decode(obj) - if err != nil { - return err - } - return nil -} - -func doSaveObject(file string, obj interface{}) error { - var w bytes.Buffer - encoder := gob.NewEncoder(&w) - err := encoder.Encode(obj) - if err != nil { - return err - } - - err = os.MkdirAll(path.Dir(file), 0755) - if err != nil { - return err - } - return ioutil.WriteFile(file, w.Bytes(), 0644) -} - -func writeFontConfig(content, file string) error { - err := os.MkdirAll(path.Dir(file), 0755) - if err != nil { - return err - } - - return ioutil.WriteFile(file, []byte(content), 0644) -} - -func removeAll(path string) error { - return os.RemoveAll(path) -} - -// If set pixelsize, wps-office-wps will not show some text. -// -//func configContent(standard, mono string, pixel float64) string { -func configContent(standard, mono string) string { - return fmt.Sprintf(` - - - - - serif - - - %s - %s - - - - - - sans-serif - - - %s - %s - - - - - - monospace - - - %s - %s - %s - - - - - rgb - -`, standard, fallbackStandard, - standard, fallbackStandard, - mono, fallbackMonospace, standard) -} diff --git a/appearance/fonts/font_list.c b/appearance/fonts/font_list.c deleted file mode 100644 index db175b6bb..000000000 --- a/appearance/fonts/font_list.c +++ /dev/null @@ -1,184 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include -#include -#include -#include -#include - -#include "font_list.h" - -static int append_font_info(FcInfo** list, FcPattern* pat, int idx); -static void free_font_info(FcInfo *info); - -int -fc_cache_update () -{ - static int first = 0; - if (first == 0) { - FcInit(); - first = 1; - return 1; - } - - return !FcConfigUptoDate (NULL) && FcInitReinitialize (); -} - -FcInfo * -list_font_info (int *num) -{ - *num = -1; - FcPattern *pat = FcPatternCreate(); - if (!pat) { - fprintf(stderr, "Create FcPattern Failed\n"); - return NULL; - } - - FcObjectSet *os = FcObjectSetBuild( - FC_FAMILY, - FC_FAMILYLANG, - /* FC_FULLNAME, */ - /* FC_FULLNAMELANG, */ - FC_STYLE, - /* FC_FILE, */ - FC_LANG, - FC_SPACING, - FC_CHARSET, - NULL); - if (!os) { - fprintf(stderr, "Build FcObjectSet Failed\n"); - FcPatternDestroy(pat); - return NULL; - } - - FcFontSet *fs = FcFontList(0, pat, os); - FcObjectSetDestroy(os); - FcPatternDestroy(pat); - if (!fs) { - fprintf(stderr, "List Font Failed\n"); - return NULL; - } - - int i; - int cnt = 0; - FcInfo *list = NULL; - for (i = 0; i < fs->nfont; i++) { - char *charset = (char*)FcPatternFormat(fs->fonts[i], (FcChar8*)"%{charset}"); - if (charset == NULL || strlen(charset) == 0) { - free(charset); - continue; - } - free(charset); - - if (append_font_info(&list, fs->fonts[i], cnt) == -1) { - continue; - } - cnt++; - } - FcFontSetDestroy(fs); - //FcFini(); // SIGABRT: FcCacheFini 'assert fcCacheChains[i] == NULL failed' - - *num = cnt; - - return list; -} - -void -free_font_info_list(FcInfo *list, int num) -{ - if (!list) { - return; - } - - int i; - for (i = 0; i < num; i++) { - free_font_info(list+i); - } - - free(list); -} - -char* -font_match(char* family) -{ - // configure the search pattern - FcPattern* pat = FcNameParse((FcChar8*)family); - if (!pat) { - return NULL; - } - - FcConfigSubstitute(NULL, pat, FcMatchPattern); - FcDefaultSubstitute(pat); - - FcResult result; - FcPattern* match = FcFontMatch(NULL, pat, &result); - FcPatternDestroy(pat); - if (!match) { - return NULL; - } - - FcFontSet* fs = FcFontSetCreate(); - if (!fs) { - FcPatternDestroy(match); - return NULL; - } - - FcFontSetAdd(fs, match); - FcPattern* font = FcPatternFilter(fs->fonts[0], NULL); - FcChar8* ret = FcPatternFormat(font, (const FcChar8*)"%{=fcmatch}\n"); - - FcPatternDestroy(font); - FcFontSetDestroy(fs); - FcPatternDestroy(match); - //FcFini(); // SIGABRT: FcCacheFini 'assert fcCacheChains[i] == NULL failed' - - if (!ret) { - return NULL; - } - - return (char*)ret; -} - -static int -append_font_info(FcInfo** list, FcPattern* pat, int idx) -{ - // realloc equals to malloc if the first argument is NULL. - // realloc will auto free old memory chunk. - FcInfo* tmp = (FcInfo*)realloc(*list, (idx+1)*sizeof(FcInfo)); - if (!tmp) { - fprintf(stderr, "Alloc memory at append %d font info failed\n", idx+1); - return -1; - } - - *list = tmp; - - tmp[idx].family = (char*)FcPatternFormat(pat, (FcChar8*)"%{family}"); - tmp[idx].familylang = (char*)FcPatternFormat(pat, (FcChar8*)"%{familylang}"); - /* tmp[idx].fullname = (char*)FcPatternFormat(pat, (FcChar8*)"%{fullname}"); */ - /* tmp[idx].fullnamelang = (char*)FcPatternFormat(pat, (FcChar8*)"%{fullnamelang}"); */ - tmp[idx].style = (char*)FcPatternFormat(pat, (FcChar8*)"%{style}"); - /* tmp[idx].filename = (char*)FcPatternFormat(pat, (FcChar8*)"%{file}"); */ - tmp[idx].lang = (char*)FcPatternFormat(pat, (FcChar8*)"%{lang}"); - tmp[idx].spacing = (char*)FcPatternFormat(pat, (FcChar8*)"%{spacing}"); - - return 0; -} - -static void -free_font_info(FcInfo *info) -{ - if (info == NULL) { - return; - } - - free(info->family); - free(info->familylang); - /* free(info->fullname); */ - /* free(info->fullnamelang); */ - free(info->style); - free(info->lang); - free(info->spacing); - /* free(info->filename); */ -} diff --git a/appearance/fonts/font_list.h b/appearance/fonts/font_list.h deleted file mode 100644 index 2a6bb9b1f..000000000 --- a/appearance/fonts/font_list.h +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef __FONT_LIST_H__ -#define __FONT_LIST_H__ - -typedef struct _FcInfo { - char *family; - char *familylang; - /* char *fullname; */ - /* char *fullnamelang; */ - char *style; - char *lang; - char *spacing; - /* char *filename; */ -} FcInfo; - -int fc_cache_update (); -FcInfo *list_font_info (int *num); -void free_font_info_list(FcInfo *list, int num); - -char* font_match(char* family); - -#endif diff --git a/appearance/fonts/wrapper.go b/appearance/fonts/wrapper.go deleted file mode 100644 index d73dab23b..000000000 --- a/appearance/fonts/wrapper.go +++ /dev/null @@ -1,257 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package fonts - -// #cgo pkg-config: fontconfig -// #cgo CFLAGS: -W -Wall -fstack-protector-all -fPIC -// #include -// #include "font_list.h" -import "C" - -import ( - "fmt" - "os" - "regexp" - "strings" - "sync" - "unsafe" - - "github.com/linuxdeepin/go-lib/strv" -) - -const ( - defaultLang = "en" - defaultLangDelim = "|" - defaultNameDelim = "," - spaceTypeMono = "100" -) - -var ( - curLang string - home = os.Getenv("HOME") - langReg = regexp.MustCompile("_") -) - -type fontOverrideProp struct { - AppendLang []string -} -type IrregularFontOverrideMap map[string]*fontOverrideProp - -var ( - _irregularFontOverrideMap IrregularFontOverrideMap - _irregularFontOverrideMapMu sync.Mutex -) - -var familyBlacklist = strv.Strv([]string{ - // font family names of Deepin Open Symbol Fonts: - "Symbol", - "webdings", - "MT Extra", - "Wingdings", - "Wingdings 2", - "Wingdings 3", -}) - -// family ex: 'sans', 'serif', 'monospace' -// cRet: `SourceCodePro-Medium.otf: "Source Code Pro" "Medium"` -func FcFont_Match(family string) string { - cFamily := C.CString(family) - defer C.free(unsafe.Pointer(cFamily)) - cRet := C.font_match(cFamily) - defer C.free(unsafe.Pointer(cRet)) - - ret := C.GoString(cRet) - if len(ret) == 0 { - return "" - } - - tmp := strings.Split(ret, ":") - if len(tmp) != 2 { - return "" - } - - // return font family id - name := strings.Split(tmp[1], "\"")[1] - table := GetFamilyTable() - key := sumStrHash(name) - info, ok := table[key] - if ok { - return info.Id - } - - for _, info := range table { - if info.Name == name { - return info.Id - } - } - return name -} - -func isFcCacheUpdate() bool { - ret := C.fc_cache_update() - return (ret == 1) -} - -func GetFamilyTable() FamilyHashTable { - var ( - table FamilyHashTable - err error - ) - if !isFcCacheUpdate() { - table = make(FamilyHashTable) - err = loadCacheFromFile(familyHashCacheFile, &table) - if err == nil { - return table - } - fmt.Println("Failed to load families cache:", err) - } - - table = fcInfosToFamilyTable() - err = table.saveToFile() - if err != nil { - fmt.Println("Failed to save families cache:", err) - } - return table -} - -func fcInfosToFamilyTable() FamilyHashTable { - var table = make(FamilyHashTable) - var num = C.int(0) - list := C.list_font_info(&num) - if num < 1 { - return nil - } - defer C.free_font_info_list(list, num) - - itemSize := unsafe.Sizeof(*list) - - for i := C.int(0); i < num; i++ { - cItem := (*C.FcInfo)(unsafe.Pointer(uintptr(unsafe.Pointer(list)) + uintptr(i)*itemSize)) - - info := fcInfoToFamily(cItem) - if info == nil { - continue - } - - key := sumStrHash(info.Id) - _, ok := table[key] - if !ok { - table[key] = info - } - } - return table -} - -func fcInfoToFamily(cInfo *C.FcInfo) *Family { - // var fullname = C.GoString(cInfo.fullname) - var familyname = C.GoString(cInfo.family) - if len(familyname) == 0 { - return nil - } - // names := strings.Split(fullname, defaultNameDelim) - // nameLang := strings.Split(C.GoString(cInfo.fullnamelang), - // defaultNameDelim) - families := strings.Split(familyname, defaultNameDelim) - familyLang := strings.Split(C.GoString(cInfo.familylang), - defaultNameDelim) - family := getItemByIndex(indexOf(defaultLang, familyLang), families) - if familyBlacklist.Contains(family) { - return nil - } - // info.Deletable = isDeletable(info.File) - langs := strings.Split(C.GoString(cInfo.lang), defaultLangDelim) - _irregularFontOverrideMapMu.Lock() - overrideProp, ok := _irregularFontOverrideMap[family] - if ok { - langs = append(langs, overrideProp.AppendLang...) - } - _irregularFontOverrideMapMu.Unlock() - return &Family{ - Id: family, - Name: getItemByIndex(indexOf(getCurLang(), familyLang), families), - Styles: strings.Split(C.GoString(cInfo.style), defaultNameDelim), - Monospace: isMonospace(family, C.GoString(cInfo.spacing)), - Show: strv.Strv(langs).Contains(getCurLang()), - } -} - -func isMonospace(name, spacing string) bool { - if spacing == spaceTypeMono || - strings.Contains(strings.ToLower(name), "mono") { - return true - } - - return false -} - -func getItemByIndex(idx int, list []string) string { - if len(list) == 0 { - return "" - } - - if idx < 0 || len(list) <= idx { - return list[0] - } - - return list[idx] -} - -func indexOf(item string, list []string) int { - for i, v := range list { - if item == v { - return i - } - } - return -1 -} - -func getCurLang() string { - if len(curLang) != 0 { - return curLang - } - - locale := os.Getenv("LANGUAGE") - if len(locale) == 0 { - locale = os.Getenv("LANG") - } - - lang := getLangFromLocale(locale) - if len(lang) == 0 { - return defaultLang - } - - curLang = lang - return lang -} - -func getLangFromLocale(locale string) string { - if len(locale) == 0 { - return "" - } - - locale = strings.ToLower(locale) - if strings.Contains(locale, ".") { - locale = strings.Split(locale, ".")[0] - } - if strings.Contains(locale, ":") { - locale = strings.Split(locale, ":")[0] - } - var lang string - switch locale { - case "zh_hk": - lang = "zh-tw" - case "zh_cn", "zh_tw", "zh_sg", "ku_tr", "mn_mn", "pap_an", "pap_aw": - lang = langReg.ReplaceAllString(locale, "-") - default: - lang = strings.Split(locale, "_")[0] - } - return lang -} - -func SetIrregularFontWhiteList(overrideMap IrregularFontOverrideMap) { - _irregularFontOverrideMapMu.Lock() - _irregularFontOverrideMap = overrideMap - _irregularFontOverrideMapMu.Unlock() -} diff --git a/appearance/fsnotify.go b/appearance/fsnotify.go deleted file mode 100644 index f0cb48c1b..000000000 --- a/appearance/fsnotify.go +++ /dev/null @@ -1,169 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package appearance - -import ( - "os" - "path" - "path/filepath" - "strings" - "time" - - "github.com/fsnotify/fsnotify" - "github.com/linuxdeepin/dde-daemon/appearance/background" - "github.com/linuxdeepin/dde-daemon/appearance/subthemes" - dutils "github.com/linuxdeepin/go-lib/utils" -) - -var ( - gtkDirs []string - iconDirs []string - bgDirs []string -) - -var prevTimestamp int64 - -func (m *Manager) handleThemeChanged() { - if m.watcher == nil { - return - } - - m.watchGtkDirs() - m.watchIconDirs() - m.watchBgDirs() - - tmpFilePrefix := filepath.Join(background.CustomWallpapersConfigDir, "tmp-") - - for { - select { - case <-m.endWatcher: - logger.Debug("[Fsnotify] quit watch") - return - case err := <-m.watcher.Errors: - logger.Warning("Receive file watcher error:", err) - return - case ev, ok := <-m.watcher.Events: - if !ok { - logger.Error("Invalid event:", ev) - return - } - - if strings.HasPrefix(ev.Name, tmpFilePrefix) { - continue - } - if (ev.Op == fsnotify.Create || ev.Op == fsnotify.Remove) && hasEventOccurred(ev.Name, iconDirs) && dutils.IsDir(ev.Name) { - upDir := filepath.Join(ev.Name, "../") - for _, v := range iconDirs { - if upDir == v { - if ev.Op == fsnotify.Create { - m.watcher.Add(ev.Name) - } else { - m.watcher.Remove(ev.Name) - } - break - } - } - } - - timestamp := time.Now().UnixNano() - tmp := timestamp - prevTimestamp - logger.Debug("[Fsnotify] timestamp:", prevTimestamp, timestamp, tmp, ev) - prevTimestamp = timestamp - // Filter time duration < 100ms's event - if tmp > 100000000 { - <-time.After(time.Millisecond * 100) - file := ev.Name - logger.Debug("[Fsnotify] changed file:", file) - switch { - case hasEventOccurred(file, bgDirs): - logger.Debug("fs event in bgDirs") - - if ev.Op&fsnotify.Chmod != 0 { - continue - } - - background.NotifyChanged() - for iloop := range m.wsLoopMap { - m.wsLoopMap[iloop].NotifyFsChanged() - } - - case hasEventOccurred(file, gtkDirs): - logger.Debug("fs event in gtkDirs") - // Wait for theme copy finished - <-time.After(time.Millisecond * 700) - subthemes.RefreshGtkThemes() - m.emitSignalRefreshed(TypeGtkTheme) - case hasEventOccurred(file, iconDirs): - // Wait for theme copy finished - logger.Debug("fs event in iconDirs") - <-time.After(time.Millisecond * 700) - subthemes.RefreshIconThemes() - subthemes.RefreshCursorThemes() - m.emitSignalRefreshed(TypeIconTheme) - m.emitSignalRefreshed(TypeCursorTheme) - } - } - } - } -} - -func (m *Manager) watchGtkDirs() { - var home = os.Getenv("HOME") - gtkDirs = []string{ - path.Join(home, ".local/share/themes"), - path.Join(home, ".themes"), - "/usr/local/share/themes", - "/usr/share/themes", - } - - m.watchDirs(gtkDirs) -} - -func (m *Manager) watchIconDirs() { - var home = os.Getenv("HOME") - iconDirs = []string{ - path.Join(home, ".local/share/icons"), - path.Join(home, ".icons"), - "/usr/local/share/icons", - "/usr/share/icons", - } - - m.watchDirs(iconDirs) -} - -func (m *Manager) watchBgDirs() { - bgDirs = background.ListDirs() - m.watchDirs(bgDirs) -} - -func (m *Manager) watchDirs(dirs []string) { - for _, dir := range dirs { - err := os.MkdirAll(dir, 0755) - if err != nil { - logger.Debugf("Mkdir '%s' failed: %v", dir, err) - } - - err = m.watcher.Add(dir) - if err != nil { - logger.Debugf("Watch dir '%s' failed: %v", dir, err) - } - } -} - -func hasEventOccurred(ev string, list []string) bool { - for _, v := range list { - if strings.Contains(ev, v) { - return true - } - } - return false -} - -func (m *Manager) emitSignalRefreshed(type0 string) { - err := m.service.Emit(m, "Refreshed", type0) - if err != nil { - logger.Warning("emit signal Refreshed failed:", err) - } -} diff --git a/appearance/fsnotify_test.go b/appearance/fsnotify_test.go deleted file mode 100644 index 6512a66aa..000000000 --- a/appearance/fsnotify_test.go +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package appearance - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_hasEventOccurred(t *testing.T) { - var shellStr = []string{"/bin/sh", "/bin/bash", - "/bin/zsh", "/usr/bin/zsh", - "/usr/bin/fish", - } - - assert.Equal(t, hasEventOccurred("/usr/bin/sh", shellStr), true) - assert.Equal(t, hasEventOccurred("/usr/lib/deepin", shellStr), false) -} diff --git a/appearance/handle_gsetting.go b/appearance/handle_gsetting.go deleted file mode 100644 index c283e29e3..000000000 --- a/appearance/handle_gsetting.go +++ /dev/null @@ -1,166 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package appearance - -import ( - "fmt" - "strings" - - "github.com/linuxdeepin/go-lib/gsettings" -) - -func (m *Manager) listenGSettingChanged() { - gsettings.ConnectChanged(xSettingsSchema, gsKeyQtActiveColor, func(key string) { - value, err := m.getQtActiveColor() - if err != nil { - logger.Warning(err) - return - } - if m.QtActiveColor != value { - m.QtActiveColor = value - err = m.service.EmitPropertyChanged(m, propQtActiveColor, value) - if err != nil { - logger.Warning(err) - } - } - }) - - gsettings.ConnectChanged(appearanceSchema, "*", func(key string) { - if m.setting == nil { - return - } - - var ( - ty string - value string - err error - ) - switch key { - case gsKeyGtkTheme: - ty = TypeGtkTheme - value = m.setting.GetString(key) - err = m.doSetGtkTheme(value) - m.updateThemeAuto(value == autoGtkTheme) - case gsKeyIconTheme: - ty = TypeIconTheme - value = m.setting.GetString(key) - err = m.doSetIconTheme(value) - case gsKeyCursorTheme: - ty = TypeCursorTheme - value = m.setting.GetString(key) - err = m.doSetCursorTheme(value) - case gsKeyFontStandard: - ty = TypeStandardFont - value = m.setting.GetString(key) - // 如果值相同,可能是dde设置导致的gsetting变化,不做变更 - if m.StandardFont.Get() != value { - err = m.doSetStandardFont(value) - } - case gsKeyFontMonospace: - ty = TypeMonospaceFont - value = m.setting.GetString(key) - // 如果值相同,可能是dde设置导致的gsetting变化,不做变更 - if m.MonospaceFont.Get() != value { - err = m.doSetMonospaceFont(value) - } - case gsKeyDTKSizeMode: - ty = TypeDTKSizeMode - enabled := m.setting.GetInt(key) - value = fmt.Sprint(enabled) - err = m.doSetDTKSizeMode(enabled) - if err == nil { - fontSizeKey := gsKeyFontSize - if m.DTKSizeMode.Get() == 1 { - fontSizeKey = gsKeyCompactFontSize - } - m.FontSize.Bind(m.setting, fontSizeKey) - _ = m.service.EmitPropertyChanged(m, propFontSize, m.FontSize.Get()) - err = m.doSetFontSize(m.FontSize.Get()) - } - case gsKeyFontSize: - ty = TypeFontSize - size := m.setting.GetDouble(key) - value = fmt.Sprint(size) - if m.isHasDTKSizeModeKey() && (m.DTKSizeMode.Get() == 0) { - err = m.doSetFontSize(size) - } else { - err = m.doSetFontSize(size) - } - case gsKeyCompactFontSize: - ty = TypeCompactFontSize - size := m.setting.GetDouble(key) - value = fmt.Sprint(size) - if m.isHasDTKSizeModeKey() && (m.DTKSizeMode.Get() == 1) { - err = m.doSetFontSize(size) - } - case gsKeyBackgroundURIs: - ty = TypeBackground - bgs := m.setting.GetStrv(key) - m.desktopBgs = bgs - m.setDesktopBackgrounds(bgs) - value = strings.Join(bgs, ";") - case gsKeyWallpaperSlideshow: - policy := m.setting.GetString(key) - m.updateWSPolicy(policy) - default: - return - } - if err != nil { - logger.Warningf("Set %v failed: %v", key, err) - return - } - if ty != "" { - m.emitSignalChanged(ty, value) - } - }) - - m.listenBgGSettings() -} - -func (m *Manager) emitSignalChanged(type0, value string) { - err := m.service.Emit(m, "Changed", type0, value) - if err != nil { - logger.Warning("emit emitSignalChanged Failed:", err) - } -} - -func (m *Manager) listenBgGSettings() { - gsettings.ConnectChanged(wrapBgSchema, "picture-uri", func(key string) { - if m.wrapBgSetting == nil { - return - } - - logger.Debug(wrapBgSchema, "changed") - value := m.wrapBgSetting.GetString(key) - file, err := m.doSetBackground(value) - if err != nil { - logger.Warning(err) - return - } - if m.wsLoopMap[m.curMonitorSpace] != nil { - m.wsLoopMap[m.curMonitorSpace].AddToShowed(file) - } - }) - - if m.gnomeBgSetting == nil { - return - } - gsettings.ConnectChanged(gnomeBgSchema, "picture-uri", func(key string) { - if m.gnomeBgSetting == nil { - return - } - - logger.Debug(gnomeBgSchema, "changed") - value := m.gnomeBgSetting.GetString(gsKeyBackground) - file, err := m.doSetBackground(value) - if err != nil { - logger.Warning(err) - return - } - if m.wsLoopMap[m.curMonitorSpace] != nil { - m.wsLoopMap[m.curMonitorSpace].AddToShowed(file) - } - }) -} diff --git a/appearance/ifc.go b/appearance/ifc.go deleted file mode 100644 index 025e1dd56..000000000 --- a/appearance/ifc.go +++ /dev/null @@ -1,319 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package appearance - -import ( - "fmt" - "path/filepath" - "strconv" - "strings" - - "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/appearance/fonts" - "github.com/linuxdeepin/dde-daemon/appearance/subthemes" - "github.com/linuxdeepin/go-lib/dbusutil" - "github.com/linuxdeepin/go-lib/strv" -) - -// Reset reset all themes and fonts settings to default values -func (m *Manager) Reset() *dbus.Error { - logger.Debug("Reset settings") - - var settingKeys = []string{ - gsKeyGtkTheme, - gsKeyIconTheme, - gsKeyCursorTheme, - gsKeyFontSize, - gsKeyCompactFontSize, - } - for _, key := range settingKeys { - userVal := m.setting.GetUserValue(key) - if userVal != nil { - logger.Debug("reset setting", key) - m.setting.Reset(key) - } - } - - m.resetFonts() - return nil -} - -// List list all available for the special type, return a json format list -func (m *Manager) List(ty string) (list string, busErr *dbus.Error) { - logger.Debug("List for type:", ty) - jsonStr, err := m.list(ty) - if err != nil { - return "", dbusutil.ToError(err) - } - return jsonStr, nil -} - -func (m *Manager) list(ty string) (string, error) { - switch strings.ToLower(ty) { - case TypeGtkTheme: - themes := subthemes.ListGtkTheme() - var gtkThemes subthemes.Themes - for _, theme := range themes { - if !strings.HasPrefix(theme.Id, "deepin") { - continue - } - gtkThemes = append(gtkThemes, theme) - } - gtkThemes = append(gtkThemes, &subthemes.Theme{ - Id: autoGtkTheme, - Path: "", - Deletable: false, - }) - return m.doShow(gtkThemes) - case TypeIconTheme: - return m.doShow(subthemes.ListIconTheme()) - case TypeCursorTheme: - return m.doShow(subthemes.ListCursorTheme()) - case TypeBackground: - return m.doShow(m.listBackground()) - case TypeStandardFont: - return m.doShow(fonts.GetFamilyTable().ListStandard()) - case TypeMonospaceFont: - return m.doShow(fonts.GetFamilyTable().ListMonospace()) - } - return "", fmt.Errorf("invalid type: %v", ty) - -} - -// Show show detail infos for the special type -// ret0: detail info, json format -func (m *Manager) Show(ty string, names []string) (detail string, busErr *dbus.Error) { - logger.Debugf("Show '%s' type '%s'", names, ty) - jsonStr, err := m.show(ty, names) - if err != nil { - return "", dbusutil.ToError(err) - } - return jsonStr, nil -} - -func (m *Manager) show(ty string, names []string) (string, error) { - switch strings.ToLower(ty) { - case TypeGtkTheme: - gtkThemes := subthemes.ListGtkTheme().ListGet(names) - if strv.Strv(names).Contains(autoGtkTheme) { - gtkThemes = append(gtkThemes, &subthemes.Theme{ - Id: autoGtkTheme, - Path: "", - Deletable: false, - }) - } - return m.doShow(gtkThemes) - case TypeIconTheme: - return m.doShow(subthemes.ListIconTheme().ListGet(names)) - case TypeCursorTheme: - return m.doShow(subthemes.ListCursorTheme().ListGet(names)) - case TypeBackground: - return m.doShow(m.listBackground().ListGet(names)) - case TypeStandardFont, TypeMonospaceFont: - return m.doShow(fonts.GetFamilyTable().GetFamilies(names)) - } - return "", fmt.Errorf("invalid type: %v", ty) -} - -// Set set to the special 'value' -func (m *Manager) Set(ty, value string) *dbus.Error { - logger.Debugf("Set '%s' for type '%s'", value, ty) - err := m.set(ty, value) - return dbusutil.ToError(err) -} - -func (m *Manager) set(ty, value string) error { - var err error - switch strings.ToLower(ty) { - case TypeGtkTheme: - if m.GtkTheme.Get() == value { - return nil - } - - err = m.doSetGtkTheme(value) - if err == nil { - m.GtkTheme.Set(value) - } - case TypeIconTheme: - if m.IconTheme.Get() == value { - return nil - } - err = m.doSetIconTheme(value) - if err == nil { - m.IconTheme.Set(value) - } - case TypeCursorTheme: - if m.CursorTheme.Get() == value { - return nil - } - err = m.doSetCursorTheme(value) - if err == nil { - m.CursorTheme.Set(value) - } - case TypeBackground: //old change wallpaple interface (no used) - file, err := m.doSetBackground(value) - if err == nil && m.wsLoopMap[m.curMonitorSpace] != nil { - m.wsLoopMap[m.curMonitorSpace].AddToShowed(file) - } - case TypeGreeterBackground: - err = m.doSetGreeterBackground(value) - case TypeStandardFont: - if m.StandardFont.Get() == value { - return nil - } - err = m.doSetStandardFont(value) - if err == nil { - m.StandardFont.Set(value) - } - case TypeMonospaceFont: - if m.MonospaceFont.Get() == value { - return nil - } - err = m.doSetMonospaceFont(value) - if err == nil { - m.MonospaceFont.Set(value) - } - case TypeDTKSizeMode: - enabled, err := strconv.ParseInt(value, 10, 30) - if err != nil { - return err - } - if m.isHasDTKSizeModeKey() { - if m.DTKSizeMode.Get() == int32(enabled) { - return nil - } - - err = m.doSetDTKSizeMode(int32(enabled)) - if err == nil { - m.DTKSizeMode.Set(int32(enabled)) - } - } - case TypeFontSize: - size, e := strconv.ParseFloat(value, 64) - if e != nil { - return e - } - - cur := m.FontSize.Get() - if cur > size-0.01 && cur < size+0.01 { - return nil - } - err = m.doSetFontSize(size) - if err == nil { - m.FontSize.Set(size) - } - default: - return fmt.Errorf("invalid type: %v", ty) - } - return err -} - -func (m *Manager) SetMonitorBackground(monitorName string, imageFile string) *dbus.Error { - logger.Debugf("Set Background '%s' for Monitor '%s'", imageFile, monitorName) - file, err := m.doSetMonitorBackground(monitorName, imageFile) - if err == nil { - idx, err := m.wm.GetCurrentWorkspace(0) - if err == nil { - wsLoop := m.wsLoopMap[genMonitorKeyString(monitorName, int(idx))] - if wsLoop != nil { - wsLoop.AddToShowed(file) - } - } - } - return dbusutil.ToError(err) -} - -func (m *Manager) SetWallpaperSlideShow(monitorName string, wallpaperSlideShow string) *dbus.Error { - logger.Debugf("Set Current Workspace Wallpaper SlideShow '%s' For Monitor '%s'", wallpaperSlideShow, monitorName) - err := m.doSetWallpaperSlideShow(monitorName, wallpaperSlideShow) - return dbusutil.ToError(err) -} - -func (m *Manager) GetWallpaperSlideShow(monitorName string) (slideShow string, busErr *dbus.Error) { - logger.Debugf("Get Current Workspace Wallpaper SlideShow For Monitor '%s'", monitorName) - slideShow, err := m.doGetWallpaperSlideShow(monitorName) - return slideShow, dbusutil.ToError(err) -} - -// Delete delete the special 'name' -func (m *Manager) Delete(ty, name string) *dbus.Error { - logger.Debugf("Delete '%s' type '%s'", name, ty) - err := m.delete(ty, name) - return dbusutil.ToError(err) -} - -func (m *Manager) delete(ty, name string) error { - switch strings.ToLower(ty) { - case TypeGtkTheme: - return subthemes.ListGtkTheme().Delete(name) - case TypeIconTheme: - return subthemes.ListIconTheme().Delete(name) - case TypeCursorTheme: - return subthemes.ListCursorTheme().Delete(name) - case TypeBackground: - return m.listBackground().Delete(name) - //case TypeStandardFont: - //case TypeMonospaceFont: - } - return fmt.Errorf("invalid type: %v", ty) -} - -// Thumbnail get thumbnail for the special 'name' -func (m *Manager) Thumbnail(ty, name string) (file string, busErr *dbus.Error) { - file, err := m.thumbnail(ty, name) - if err != nil { - return "", dbusutil.ToError(err) - } - return file, nil -} - -var gtkThumbnailMap = map[string]string{ - "deepin": "light", - "deepin-dark": "dark", - "deepin-auto": "auto", -} - -func (m *Manager) thumbnail(ty, name string) (string, error) { - logger.Debugf("Get thumbnail for '%s' type '%s'", name, ty) - switch strings.ToLower(ty) { - case TypeGtkTheme: - fName, ok := gtkThumbnailMap[name] - if ok { - return filepath.Join("/usr/share/dde-daemon/appearance", fName+".svg"), nil - } - return subthemes.GetGtkThumbnail(name) - case TypeIconTheme: - return subthemes.GetIconThumbnail(name) - case TypeCursorTheme: - return subthemes.GetCursorThumbnail(name) - } - return "", fmt.Errorf("invalid type: %v", ty) -} - -func (m *Manager) GetScaleFactor() (scaleFactor float64, busErr *dbus.Error) { - return m.getScaleFactor(), nil -} - -func (m *Manager) SetScaleFactor(scale float64) *dbus.Error { - err := m.setScaleFactor(scale) - if err != nil { - logger.Warning(err) - return dbusutil.ToError(err) - } - return nil -} - -func (m *Manager) SetScreenScaleFactors(v map[string]float64) *dbus.Error { - err := m.setScreenScaleFactors(v) - if err != nil { - logger.Warning(err) - } - return dbusutil.ToError(err) -} - -func (m *Manager) GetScreenScaleFactors() (scaleFactors map[string]float64, busErr *dbus.Error) { - v, err := m.getScreenScaleFactors() - return v, dbusutil.ToError(err) -} diff --git a/appearance/listener.go b/appearance/listener.go deleted file mode 100644 index ffc3b228f..000000000 --- a/appearance/listener.go +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package appearance - -// #cgo pkg-config: gtk+-3.0 -// #cgo CFLAGS: -W -Wall -fstack-protector-all -fPIC -// #include -// #include "cursor.h" -import "C" - -func (*Manager) listenCursorChanged() { - C.handle_gtk_cursor_changed() -} - -func (*Manager) endCursorChangedHandler() { - C.end_cursor_changed_handler() -} diff --git a/appearance/manager.go b/appearance/manager.go deleted file mode 100644 index fd248b555..000000000 --- a/appearance/manager.go +++ /dev/null @@ -1,1714 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package appearance - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "io/ioutil" - "math" - "math/rand" - "os" - "os/user" - "path/filepath" - "regexp" - "strconv" - "strings" - "time" - - "github.com/fsnotify/fsnotify" - dbus "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-api/theme_thumb" - accounts "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.accounts" - display "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.display" - imageeffect "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.imageeffect" - sessiontimedate "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.timedate" - sessionmanager "github.com/linuxdeepin/go-dbus-factory/com.deepin.sessionmanager" - wm "github.com/linuxdeepin/go-dbus-factory/com.deepin.wm" - configManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" - timedate "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.timedate1" - gio "github.com/linuxdeepin/go-gir/gio-2.0" - "github.com/linuxdeepin/go-lib/dbusutil" - "github.com/linuxdeepin/go-lib/dbusutil/gsprop" - "github.com/linuxdeepin/go-lib/dbusutil/proxy" - "github.com/linuxdeepin/go-lib/log" - "github.com/linuxdeepin/go-lib/strv" - dutils "github.com/linuxdeepin/go-lib/utils" - "github.com/linuxdeepin/go-lib/xdg/basedir" - x "github.com/linuxdeepin/go-x11-client" - "github.com/linuxdeepin/go-x11-client/ext/randr" - - "github.com/linuxdeepin/dde-daemon/appearance/background" - "github.com/linuxdeepin/dde-daemon/appearance/fonts" - "github.com/linuxdeepin/dde-daemon/appearance/subthemes" - "github.com/linuxdeepin/dde-daemon/common/dsync" - ddbus "github.com/linuxdeepin/dde-daemon/dbus" - "github.com/linuxdeepin/dde-daemon/session/common" -) - -//go:generate dbusutil-gen em -type Manager - -// The supported types -const ( - TypeGtkTheme = "gtk" - TypeIconTheme = "icon" - TypeCursorTheme = "cursor" - TypeBackground = "background" - TypeGreeterBackground = "greeterbackground" - TypeStandardFont = "standardfont" - TypeMonospaceFont = "monospacefont" - TypeFontSize = "fontsize" - TypeCompactFontSize = "compactfontsize" - TypeDTKSizeMode = "dtksizemode" -) - -const ( - wrapBgSchema = "com.deepin.wrap.gnome.desktop.background" - gnomeBgSchema = "org.gnome.desktop.background" - gsKeyBackground = "picture-uri" - zonePath = "/usr/share/zoneinfo/zone1970.tab" - - appearanceSchema = "com.deepin.dde.appearance" - xSettingsSchema = "com.deepin.xsettings" - gsKeyGtkTheme = "gtk-theme" - gsKeyIconTheme = "icon-theme" - gsKeyCursorTheme = "cursor-theme" - gsKeyFontStandard = "font-standard" - gsKeyFontMonospace = "font-monospace" - gsKeyFontSize = "font-size" - gsKeyCompactFontSize = "compact-font-size" - gsKeyBackgroundURIs = "background-uris" - gsKeyOpacity = "opacity" - gsKeyWallpaperSlideshow = "wallpaper-slideshow" - gsKeyWallpaperURIs = "wallpaper-uris" - gsKeyQtActiveColor = "qt-active-color" - gsKeyDTKWindowRadius = "dtk-window-radius" - gsKeyQtScrollBarPolicy = "qt-scrollbar-policy" - gsKeyDTKSizeMode = "dtk-size-mode" - - propQtActiveColor = "QtActiveColor" - propFontSize = "FontSize" - propDTKSizeMode = "DTKSizeMode" - - wsPolicyLogin = "login" - wsPolicyWakeup = "wakeup" - - defaultIconTheme = "bloom" - defaultGtkTheme = "deepin" - autoGtkTheme = "deepin-auto" - defaultCursorTheme = "bloom" - defaultStandardFont = "Noto Sans" - defaultMonospaceFont = "Noto Mono" - - dbusServiceName = "com.deepin.daemon.Appearance" - dbusPath = "/com/deepin/daemon/Appearance" - dbusInterface = dbusServiceName -) - -// TODO 后续需要设计成用 subpath + 独立的 dconfig 配置来实现,增加可读性 -const ( - dsettingsAppID = "org.deepin.dde.daemon" - dsettingsAppearanceName = "org.deepin.dde.daemon.appearance" - dsettingsIrregularFontOverrideKey = "irregularFontOverride" -) - -var wsConfigFile = filepath.Join(basedir.GetUserConfigDir(), "deepin/dde-daemon/appearance/wallpaper-slideshow.json") - -// Manager shows current themes and fonts settings, emit 'Changed' signal if modified -// if themes list changed will emit 'Refreshed' signal -type Manager struct { - service *dbusutil.Service - sessionSigLoop *dbusutil.SignalLoop - sysSigLoop *dbusutil.SignalLoop - xConn *x.Conn - syncConfig *dsync.Config - bgSyncConfig *dsync.Config - - GtkTheme gsprop.String - IconTheme gsprop.String - CursorTheme gsprop.String - Background gsprop.String - StandardFont gsprop.String - MonospaceFont gsprop.String - Opacity gsprop.Double `prop:"access:rw"` - FontSize gsprop.Double `prop:"access:rw"` - WallpaperSlideShow gsprop.String `prop:"access:rw"` - WallpaperURIs gsprop.String - QtActiveColor string `prop:"access:rw"` - // 社区版定制需求,保存窗口圆角值,默认 18 - WindowRadius gsprop.Int `prop:"access:rw"` - QtScrollBarPolicy gsprop.Int `prop:"access:rw"` - DTKSizeMode gsprop.Int `prop:"access:rw"` - - wsLoopMap map[string]*WSLoop - wsSchedulerMap map[string]*WSScheduler - monitorMap map[string]string - coordinateMap map[string]*coordinate - - userObj accounts.User - imageBlur accounts.ImageBlur - timeDate timedate.Timedate - sessionTimeDate sessiontimedate.Timedate - imageEffect imageeffect.ImageEffect - xSettings sessionmanager.XSettings - login1Manager login1.Manager - themeAutoTimer *time.Timer - display display.Display - latitude float64 - longitude float64 - locationValid bool - detectSysClockTimer *time.Timer - ts int64 - loc *time.Location - - setting *gio.Settings - xSettingsGs *gio.Settings - wrapBgSetting *gio.Settings - gnomeBgSetting *gio.Settings - - watcher *fsnotify.Watcher - endWatcher chan struct{} - - desktopBgs []string - greeterBg string - curMonitorSpace string - wm wm.Wm - - //nolint - signals *struct { - // Theme setting changed - Changed struct { - type0 string - value string - } - - // Theme list refreshed - Refreshed struct { - type0 string - } - } -} - -type mapMonitorWorkspaceWSPolicy map[string]string -type mapMonitorWorkspaceWSConfig map[string]WSConfig -type mapMonitorWorkspaceWallpaperURIs map[string]string - -type coordinate struct { - latitude, longitude float64 -} - -// NewManager will create a 'Manager' object -func newManager(service *dbusutil.Service) *Manager { - var m = new(Manager) - m.service = service - m.setting = gio.NewSettings(appearanceSchema) - m.xSettingsGs = gio.NewSettings(xSettingsSchema) - m.wrapBgSetting = gio.NewSettings(wrapBgSchema) - - m.GtkTheme.Bind(m.setting, gsKeyGtkTheme) - m.IconTheme.Bind(m.setting, gsKeyIconTheme) - m.CursorTheme.Bind(m.setting, gsKeyCursorTheme) - m.StandardFont.Bind(m.setting, gsKeyFontStandard) - m.MonospaceFont.Bind(m.setting, gsKeyFontMonospace) - m.Background.Bind(m.wrapBgSetting, gsKeyBackground) - m.Opacity.Bind(m.setting, gsKeyOpacity) - m.WallpaperSlideShow.Bind(m.setting, gsKeyWallpaperSlideshow) - m.WallpaperURIs.Bind(m.setting, gsKeyWallpaperURIs) - // 社区版定制需求 保存窗口圆角值 - m.WindowRadius.Bind(m.xSettingsGs, gsKeyDTKWindowRadius) - m.QtScrollBarPolicy.Bind(m.xSettingsGs, gsKeyQtScrollBarPolicy) - m.DTKSizeMode.Bind(m.setting, gsKeyDTKSizeMode) - - var err error - m.QtActiveColor, err = m.getQtActiveColor() - if err != nil { - logger.Warning(err) - } - - if m.isHasDTKSizeModeKey() && (m.DTKSizeMode.Get() == 1) { - m.FontSize.Bind(m.setting, gsKeyCompactFontSize) - } else { - m.FontSize.Bind(m.setting, gsKeyFontSize) - } - - m.wsLoopMap = make(map[string]*WSLoop) - m.wsSchedulerMap = make(map[string]*WSScheduler) - m.coordinateMap = make(map[string]*coordinate) - - m.initCoordinate() - - m.gnomeBgSetting, _ = dutils.CheckAndNewGSettings(gnomeBgSchema) - - m.watcher, err = fsnotify.NewWatcher() - if err != nil { - logger.Warning("New file watcher failed:", err) - } else { - m.endWatcher = make(chan struct{}) - } - - return m -} - -func getLicenseAuthorizationProperty(conn *dbus.Conn) uint32 { - var variant dbus.Variant - err := conn.Object("com.deepin.license", "/com/deepin/license/Info").Call( - "org.freedesktop.DBus.Properties.Get", 0, "com.deepin.license.Info", "AuthorizationProperty").Store(&variant) - if err != nil { - logger.Warning(err) - return 0 - } - if variant.Signature().String() != "u" { - logger.Warning("not excepted value type") - return 0 - } - ret := variant.Value().(uint32) - logger.Debug(" [getLicenseAuthorizationProperty] com.deepin.license.Info.AuthorizationProperty : ", ret) - return ret -} - -func listenLicenseInfoDBusPropChanged(conn *dbus.Conn, sigLoop *dbusutil.SignalLoop) { - err := conn.Object("com.deepin.license.Info", - "/com/deepin/license/Info").AddMatchSignal("com.deepin.license.Info", "LicenseStateChange").Err - if err != nil { - logger.Warning(err) - return - } - - sigLoop.AddHandler(&dbusutil.SignalRule{ - Name: "com.deepin.license.Info.LicenseStateChange", - }, func(sig *dbus.Signal) { - if strings.Contains(string(sig.Name), "com.deepin.license.Info.LicenseStateChange") { - go func() { - licenseState := getLicenseAuthorizationProperty(conn) - background.SetLicenseAuthorizationProperty(licenseState) - background.UpdateLicenseAuthorizationProperty() - logger.Info("[listenLicenseInfoDBusPropChanged] com.deepin.license.Info.LicenseStateChange : ", licenseState) - }() - } - }) -} - -func (m *Manager) initCurrentBgs() { - m.desktopBgs = m.getBackgroundURIs() - - if m.userObj == nil { - return - } - greeterBg, err := m.userObj.GreeterBackground().Get(0) - if err == nil { - m.greeterBg = greeterBg - } else { - logger.Warning(err) - } -} - -func (m *Manager) getBackgroundURIs() []string { - return m.setting.GetStrv(gsKeyBackgroundURIs) -} - -func (m *Manager) isBgInUse(file string) bool { - if file == m.greeterBg { - return true - } - // 检查所有的工作区的屏幕壁纸是否占用 - mapWallpaperURIs, err := doUnmarshalMonitorWorkspaceWallpaperURIs(m.WallpaperURIs.Get()) - if err != nil { - logger.Error(err) - return false - } - for _, bg := range mapWallpaperURIs { - if file == bg { - return true - } - } - - return false -} - -func (m *Manager) listBackground() background.Backgrounds { - origin := background.ListBackground() - result := make(background.Backgrounds, len(origin)) - - for idx, bg := range origin { - var deletable bool - if bg.Deletable { - // custom - if !m.isBgInUse(bg.Id) { - deletable = true - } - } - result[idx] = &background.Background{ - Id: bg.Id, - Deletable: deletable, - } - } - return result -} - -func (m *Manager) destroy() { - m.sessionSigLoop.Stop() - m.xSettings.RemoveHandler(proxy.RemoveAllHandlers) - m.syncConfig.Destroy() - m.bgSyncConfig.Destroy() - - m.sysSigLoop.Stop() - m.login1Manager.RemoveHandler(proxy.RemoveAllHandlers) - for iSche := range m.wsSchedulerMap { - m.wsSchedulerMap[iSche].stop() - } - - if m.setting != nil { - m.setting.Unref() - m.setting = nil - } - - if m.wrapBgSetting != nil { - m.wrapBgSetting.Unref() - m.wrapBgSetting = nil - } - - if m.gnomeBgSetting != nil { - m.gnomeBgSetting.Unref() - m.gnomeBgSetting = nil - } - - if m.watcher != nil { - close(m.endWatcher) - err := m.watcher.Close() - if err != nil { - logger.Warning(err) - } - m.watcher = nil - } - - if m.xConn != nil { - m.xConn.Close() - m.xConn = nil - } - - m.endCursorChangedHandler() -} - -// resetFonts reset StandardFont and MonospaceFont -func (m *Manager) resetFonts() { - err := fonts.Reset() - if err != nil { - logger.Debug("ResetFonts failed", err) - return - } - m.checkFontConfVersion() -} - -func (m *Manager) initUserObj(systemConn *dbus.Conn) { - cur, err := user.Current() - if err != nil { - logger.Warning("failed to get current user:", err) - return - } - - err = common.ActivateSysDaemonService("com.deepin.daemon.Accounts") - if err != nil { - logger.Warning(err) - } - - m.userObj, err = ddbus.NewUserByUid(systemConn, cur.Uid) - if err != nil { - logger.Warning("failed to new user object:", err) - return - } - - // sync desktop backgrounds - userBackgrounds, err := m.userObj.DesktopBackgrounds().Get(0) - if err != nil { - logger.Warning(err) - return - } - - gsBackgrounds := m.setting.GetStrv(gsKeyBackgroundURIs) - if !strv.Strv(userBackgrounds).Equal(gsBackgrounds) { - m.setDesktopBackgrounds(gsBackgrounds) - } -} - -func (m *Manager) init() error { - background.SetCustomWallpaperDeleteCallback(func(file string) { - logger.Debug("imageBlur delete", file) - err := m.imageBlur.Delete(0, file) - if err != nil { - logger.Warning("imageBlur delete err:", err) - } - - logger.Debug("imageEffect delete", file) - err = m.imageEffect.Delete(0, "all", file) - if err != nil { - logger.Warning("imageEffect delete err:", err) - } - }) - - sessionBus := m.service.Conn() - systemBus, err := dbus.SystemBus() - if err != nil { - return err - } - go background.SetLicenseAuthorizationProperty(getLicenseAuthorizationProperty(systemBus)) - m.xConn, err = x.NewConn() - if err != nil { - return err - } - - _, err = randr.QueryVersion(m.xConn, randr.MajorVersion, - randr.MinorVersion).Reply(m.xConn) - if err != nil { - logger.Warning(err) - } - - m.sessionSigLoop = dbusutil.NewSignalLoop(sessionBus, 10) - m.sessionSigLoop.Start() - - m.wm = wm.NewWm(sessionBus) - m.wm.InitSignalExt(m.sessionSigLoop, true) - _, err = m.wm.ConnectWorkspaceCountChanged(m.handleWmWorkspaceCountChanged) - if err != nil { - logger.Warning(err) - } - _, err = m.wm.ConnectWorkspaceSwitched(m.handleWmWorkspaceSwithched) - if err != nil { - logger.Warning(err) - } - m.imageBlur = accounts.NewImageBlur(systemBus) - m.imageEffect = imageeffect.NewImageEffect(systemBus) - - m.xSettings = sessionmanager.NewXSettings(sessionBus) - theme_thumb.Init(m.getScaleFactor()) - - m.xSettings.InitSignalExt(m.sessionSigLoop, true) - _, err = m.xSettings.ConnectSetScaleFactorStarted(handleSetScaleFactorStarted) - if err != nil { - logger.Warning(err) - } - _, err = m.xSettings.ConnectSetScaleFactorDone(handleSetScaleFactorDone) - if err != nil { - logger.Warning(err) - } - - m.initUserObj(systemBus) - background.NotifyFunc = func(type0, value string) { - m.emitSignalChanged(type0, value) - } - m.initCurrentBgs() - m.display = display.NewDisplay(sessionBus) - m.display.InitSignalExt(m.sessionSigLoop, true) - err = m.display.Monitors().ConnectChanged(func(hasValue bool, value []dbus.ObjectPath) { - m.handleDisplayChanged(hasValue) - }) - if err != nil { - logger.Warning("failed to connect Monitors changed:", err) - } - err = m.display.Primary().ConnectChanged(func(hasValue bool, value string) { - m.handleDisplayChanged(hasValue) - }) - if err != nil { - logger.Warning("failed to connect Primary changed:", err) - } - m.updateMonitorMap() - m.syncConfig = dsync.NewConfig("appearance", &syncConfig{m: m}, m.sessionSigLoop, dbusPath, logger) - m.bgSyncConfig = dsync.NewConfig("background", &backgroundSyncConfig{m: m}, m.sessionSigLoop, - backgroundDBusPath, logger) - - m.sysSigLoop = dbusutil.NewSignalLoop(systemBus, 10) - m.sysSigLoop.Start() - m.login1Manager = login1.NewManager(systemBus) - m.login1Manager.InitSignalExt(m.sysSigLoop, true) - if m.WallpaperURIs.Get() == "" { // 壁纸设置更新为v2.0版本,但是数据依旧为v1.0的数据 - err := m.updateNewVersionData() - if err != nil { - logger.Warning(err) - } - } - m.initWallpaperSlideshow() - - m.timeDate = timedate.NewTimedate(systemBus) - m.timeDate.InitSignalExt(m.sysSigLoop, true) - - listenLicenseInfoDBusPropChanged(systemBus, m.sysSigLoop) - - m.sessionTimeDate = sessiontimedate.NewTimedate(sessionBus) - m.sessionTimeDate.InitSignalExt(m.sessionSigLoop, true) - - zone, err := m.timeDate.Timezone().Get(0) - if err != nil { - logger.Warning("Get Timezone Failed:", err) - } - l, err := time.LoadLocation(zone) - if err != nil { - logger.Warning("LoadLocation Failed :", err) - } - m.loc = l - err = m.timeDate.Timezone().ConnectChanged(func(hasValue bool, value string) { - if err != nil { - logger.Warning(err) - } - for ct, coordinate := range m.coordinateMap { - if value == ct { - m.longitude = coordinate.longitude - m.latitude = coordinate.latitude - } - } - l, err := time.LoadLocation(value) - if err != nil { - logger.Warning("LoadLocation Failed :", err) - } - m.loc = l - logger.Debug("value", value, m.longitude, m.latitude) - if m.GtkTheme.Get() == autoGtkTheme { - m.autoSetTheme(m.latitude, m.longitude) - m.resetThemeAutoTimer() - } - }) - - if err != nil { - logger.Warning(err) - } - - //修改时间后通过信号通知自动改变主题 - _, err = m.sessionTimeDate.ConnectTimeUpdate(func() { - time.AfterFunc(2*time.Second, m.handleSysClockChanged) - }) - if err != nil { - logger.Warning("connect signal TimeUpdate failed:", err) - } - err = m.timeDate.NTP().ConnectChanged(func(hasValue bool, value bool) { - time.AfterFunc(2*time.Second, m.handleSysClockChanged) - }) - if err != nil { - logger.Warning("connect NTP failed:", err) - } - - // set gtk theme - gtkThemes := subthemes.ListGtkTheme() - currentGtkTheme := m.GtkTheme.Get() - - if currentGtkTheme == autoGtkTheme { - m.updateThemeAuto(true) - } else { - gtkTheme := defaultGtkTheme - if gtkThemes.Get(currentGtkTheme) != nil { - gtkTheme = currentGtkTheme - } - m.GtkTheme.Set(gtkTheme) - err = m.doSetGtkTheme(gtkTheme) - if err != nil { - logger.Warning("failed to set gtk theme:", err) - } - } - - // set icon theme - iconThemes := subthemes.ListIconTheme() - currentIconTheme := m.IconTheme.Get() - if iconThemes.Get(currentIconTheme) == nil { - m.IconTheme.Set(defaultIconTheme) - currentIconTheme = defaultIconTheme - } - err = m.doSetIconTheme(currentIconTheme) - if err != nil { - logger.Warning("failed to set icon theme:", err) - } - - // set cursor theme - cursorThemes := subthemes.ListCursorTheme() - currentCursorTheme := m.CursorTheme.Get() - if cursorThemes.Get(currentCursorTheme) == nil { - m.CursorTheme.Set(defaultCursorTheme) - currentCursorTheme = defaultCursorTheme - } - err = m.doSetCursorTheme(currentCursorTheme) - if err != nil { - logger.Warning("failed to set cursor theme:", err) - } - - // Init IrregularFontWhiteList - m.initAppearanceDSettings() - return nil -} - -// initFont 初始化字体设置 -func (m *Manager) initFont() { - value := fonts.FcFont_Match("system-ui") - if m.StandardFont.Get() != value { - m.StandardFont.Set(value) - err := m.xSettings.SetString(0, "Qt/FontName", value) - if err != nil { - logger.Warning("failed to set xsetting Qt/FontName:", err) - } - } - value = fonts.FcFont_Match("monospace") - if m.MonospaceFont.Get() != value { - m.MonospaceFont.Set(value) - err := m.xSettings.SetString(0, "Qt/MonoFontName", value) - if err != nil { - logger.Warning("failed to set xsetting Qt/MonoFontName:", err) - } - } - - err := setDQtTheme(dQtFile, dQtSectionTheme, - []string{ - dQtKeyIcon, - dQtKeyFont, - dQtKeyMonoFont, - dQtKeyFontSize}, - []string{ - m.IconTheme.Get(), - m.StandardFont.Get(), - m.MonospaceFont.Get(), - strconv.FormatFloat(m.FontSize.Get(), 'f', 1, 64)}) - if err != nil { - logger.Warning("failed to set deepin qt theme:", err) - } - err = saveDQtTheme(dQtFile) - if err != nil { - logger.Warning("Failed to save deepin qt theme:", err) - } -} - -func (m *Manager) handleDisplayChanged(hasValue bool) { - if !hasValue { - return - } - m.updateMonitorMap() - err := m.doUpdateWallpaperURIs() - m.updateGreeterBackground() - if err != nil { - logger.Warning("failed to update WallpaperURIs:", err) - } -} - -func (m *Manager) handleWmWorkspaceCountChanged(count int32) { - logger.Debug("wm workspace count changed", count) - bgs := m.setting.GetStrv(gsKeyBackgroundURIs) - if len(bgs) < int(count) { - allBgs := background.ListBackground() - - numAdded := int(count) - len(bgs) - for i := 0; i < numAdded; i++ { - idx := rand.Intn(len(allBgs)) // #nosec G404 - // Id is file url - bgs = append(bgs, allBgs[idx].Id) - } - m.setting.SetStrv(gsKeyBackgroundURIs, bgs) - } else if len(bgs) > int(count) { - bgs = bgs[:int(count)] - m.setting.SetStrv(gsKeyBackgroundURIs, bgs) - } - err := m.doUpdateWallpaperURIs() - if err != nil { - logger.Warning("failed to update WallpaperURIs:", err) - } -} - -// 同步当前主屏的壁纸到greeter界面壁纸 -func (m *Manager) updateGreeterBackground() { - for item, _ := range m.monitorMap { - if m.monitorMap[item] == "Primary" { - bg, err := m.wm.GetCurrentWorkspaceBackgroundForMonitor(0, item) - if err != nil { - logger.Warning("get current background failed", err) - return - } - err = m.doSetGreeterBackground(bg) - if err != nil { - logger.Warning("set greeter background failed", err) - return - } - return - } - } -} - -// 切换工作区 -func (m *Manager) handleWmWorkspaceSwithched(from, to int32) { - logger.Debugf("wm workspace switched from %d to %d", from, to) - if m.userObj != nil { - err := m.userObj.SetCurrentWorkspace(0, to) - if err != nil { - logger.Warning("call userObj.SetCurrentWorkspace err:", err) - } - } - // 切换工作区,需要同步当前主屏的壁纸到greeter界面壁纸 - m.updateGreeterBackground() -} - -func (m *Manager) doSetGtkTheme(value string) error { - if value == autoGtkTheme { - return nil - } - if !subthemes.IsGtkTheme(value) { - return fmt.Errorf("invalid gtk theme '%v'", value) - } - - // set dde-kwin decoration theme - var ddeKWinTheme string - switch value { - case "deepin": - ddeKWinTheme = "light" - case "deepin-dark": - ddeKWinTheme = "dark" - } - if ddeKWinTheme != "" { - err := m.wm.SetDecorationDeepinTheme(0, ddeKWinTheme) - if err != nil { - logger.Warning(err) - } - } - - return subthemes.SetGtkTheme(value) -} - -func (m *Manager) doSetIconTheme(value string) error { - if !subthemes.IsIconTheme(value) { - return fmt.Errorf("invalid icon theme '%v'", value) - } - - err := subthemes.SetIconTheme(value) - if err != nil { - return err - } - - return m.writeDQtTheme(dQtKeyIcon, value) -} - -func (m *Manager) doSetCursorTheme(value string) error { - if !subthemes.IsCursorTheme(value) { - return fmt.Errorf("invalid cursor theme '%v'", value) - } - - return subthemes.SetCursorTheme(value) -} - -func (m *Manager) doSetMonitorBackground(monitorName string, imageFile string) (string, error) { - logger.Debugf("call doSetMonitorBackground monitor:%q file:%q", monitorName, imageFile) - file, t := background.GetWallpaperType(imageFile) - if t == background.Unknown { - return "", errors.New("invalid background") - } - // 如果设置的壁纸不是/usr/share/wallpapers/下的,则认为是用户自定义壁纸,需要发送add信号 - needNotify := false - if !strings.HasPrefix(file, "/usr/share/wallpapers/") { - needNotify = true - } - file, err := background.Prepare(file, t) - if err != nil { - logger.Warning("failed to prepare:", err) - return "", err - } - logger.Debug("prepare result:", file) - uri := dutils.EncodeURI(file, dutils.SCHEME_FILE) - err = m.wm.SetCurrentWorkspaceBackgroundForMonitor(0, uri, monitorName) - if err != nil { - return "", err - } - - // 如果文件发生增删,发送add/delete的信号 - if needNotify { - // 由于用户操作,统一将用户自定义设置的壁纸当做新的壁纸处理,发送新增信号,告知上层 - m.emitSignalChanged("background-add", file) - // 在此处理删除操作 - background.NotifyChanged() - } - err = m.doUpdateWallpaperURIs() - if err != nil { - logger.Warning("failed to update WallpaperURIs:", err) - } - _, err = m.imageBlur.Get(0, file) - if err != nil { - logger.Warning("call imageBlur.Get err:", err) - } - go func() { - outputFile, err := m.imageEffect.Get(0, "", file) - if err != nil { - logger.Warning("imageEffect Get err:", err) - } else { - logger.Warning("imageEffect Get outputFile:", outputFile) - } - }() - return file, nil -} - -func (m *Manager) updateMonitorMap() { - monitorList, _ := m.display.ListOutputNames(0) - primary, _ := m.display.Primary().Get(0) - index := 0 - m.monitorMap = make(map[string]string) - for _, item := range monitorList { - if item == primary { - m.monitorMap[item] = "Primary" - } else { - m.monitorMap[item] = "Subsidiary" + strconv.Itoa(index) - index++ - } - } -} - -func (m *Manager) reverseMonitorMap() map[string]string { - reverseMap := make(map[string]string) - for k, v := range m.monitorMap { - reverseMap[v] = k - } - return reverseMap -} - -func (m *Manager) doUpdateWallpaperURIs() error { - mapWallpaperURIs := make(mapMonitorWorkspaceWallpaperURIs) - workspaceCount, _ := m.wm.WorkspaceCount(0) - monitorList, _ := m.display.ListOutputNames(0) - for _, monitor := range monitorList { - for idx := int32(1); idx <= workspaceCount; idx++ { - wallpaperURI, err := m.wm.GetWorkspaceBackgroundForMonitor(0, idx, monitor) - if err != nil { - logger.Warning("get wallpaperURI failed:", err) - continue - } - key := genMonitorKeyString(m.monitorMap[monitor], int(idx)) - mapWallpaperURIs[key] = wallpaperURI - } - } - - err := m.setPropertyWallpaperURIs(mapWallpaperURIs) - if err != nil { - return err - } - return nil -} - -func doUnmarshalMonitorWorkspaceWallpaperURIs(jsonString string) (mapMonitorWorkspaceWallpaperURIs, error) { - var cfg mapMonitorWorkspaceWallpaperURIs - var byteMonitorWorkspaceWallpaperURIs = []byte(jsonString) - err := json.Unmarshal(byteMonitorWorkspaceWallpaperURIs, &cfg) - return cfg, err -} - -func doMarshalMonitorWorkspaceWallpaperURIs(cfg mapMonitorWorkspaceWallpaperURIs) (string, error) { - data, err := json.Marshal(cfg) - if err != nil { - return "", err - } - return string(data), err -} - -func (m *Manager) setPropertyWallpaperURIs(cfg mapMonitorWorkspaceWallpaperURIs) error { - uris, err := doMarshalMonitorWorkspaceWallpaperURIs(cfg) - if err != nil { - logger.Warning(err) - return err - } - m.WallpaperURIs.Set(uris) - return nil -} - -func doUnmarshalWallpaperSlideshow(jsonString string) (mapMonitorWorkspaceWSPolicy, error) { - var cfg mapMonitorWorkspaceWSPolicy - var byteWallpaperSlideShow []byte = []byte(jsonString) - err := json.Unmarshal(byteWallpaperSlideShow, &cfg) - return cfg, err -} - -func doMarshalWallpaperSlideshow(cfg mapMonitorWorkspaceWSPolicy) (string, error) { - data, err := json.Marshal(cfg) - if err != nil { - return "", err - } - return string(data), err -} - -func (m *Manager) setPropertyWallpaperSlideShow(cfg mapMonitorWorkspaceWSPolicy) error { - slideshow, err := doMarshalWallpaperSlideshow(cfg) - if err != nil { - logger.Warning(err) - return err - } - m.WallpaperSlideShow.Set(slideshow) - return nil -} - -func (m *Manager) doSetWallpaperSlideShow(monitorName string, wallpaperSlideShow string) error { - idx, err := m.wm.GetCurrentWorkspace(0) - if err != nil { - logger.Warning("Get Current Workspace failure:", err) - return err - } - cfg, err := doUnmarshalWallpaperSlideshow(m.WallpaperSlideShow.Get()) - if err != nil { - logger.Warning("doUnmarshalWallpaperSlideshow Failed:", err) - } - if cfg == nil { - cfg = make(mapMonitorWorkspaceWSPolicy) - } - - key := genMonitorKeyString(monitorName, int(idx)) - cfg[key] = wallpaperSlideShow - err = m.setPropertyWallpaperSlideShow(cfg) - if err != nil { - return err - } - m.curMonitorSpace = key - return nil -} - -func (m *Manager) doGetWallpaperSlideShow(monitorName string) (string, error) { - idx, err := m.wm.GetCurrentWorkspace(0) - if err != nil { - logger.Warning("Get Current Workspace failure:", err) - return "", err - } - cfg, err := doUnmarshalWallpaperSlideshow(m.WallpaperSlideShow.Get()) - if err != nil { - return "", nil - } - key := genMonitorKeyString(monitorName, int(idx)) - wallpaperSlideShow := cfg[key] - return wallpaperSlideShow, nil -} - -func (m *Manager) doSetBackground(value string) (string, error) { - logger.Debugf("call doSetBackground %q", value) - file, t := background.GetWallpaperType(value) - if t == background.Unknown { - return "", errors.New("invalid background") - } - - // 如果设置的壁纸不是/usr/share/wallpapers/下的,则认为是用户自定义壁纸,需要发送add信号 - needNotify := false - if !strings.HasPrefix(file, "/usr/share/wallpapers/") { - needNotify = true - } - file, err := background.Prepare(file, t) - if err != nil { - logger.Warning("failed to prepare:", err) - return "", err - } - logger.Debug("prepare result:", file) - uri := dutils.EncodeURI(file, dutils.SCHEME_FILE) - err = m.wm.ChangeCurrentWorkspaceBackground(0, uri) - if err != nil { - return "", err - } - // 如果文件发生增删,发送add/delete的信号 - if needNotify { - // 由于用户操作,统一将用户自定义设置的壁纸当做新的壁纸处理,发送新增信号,告知上层 - m.emitSignalChanged("background-add", file) - // 在此处理删除操作 - background.NotifyChanged() - } - _, err = m.imageBlur.Get(0, file) - if err != nil { - logger.Warning("call imageBlur.Get err:", err) - } - go func() { - outputFile, err := m.imageEffect.Get(0, "", file) - if err != nil { - logger.Warning("imageEffect Get err:", err) - } else { - logger.Warning("imageEffect Get outputFile:", outputFile) - } - }() - - return file, nil -} - -func (m *Manager) doSetGreeterBackground(value string) error { - logger.Debugf("call doSetGreeterBackground file:%q", value) - file, t := background.GetWallpaperType(value) - if t == background.Unknown { - return errors.New("invalid background") - } - - file, err := background.Prepare(file, t) - if err != nil { - logger.Warning("failed to prepare:", err) - return err - } - file = dutils.EncodeURI(file, dutils.SCHEME_FILE) - m.greeterBg = file - if m.userObj == nil { - return errors.New("user object is nil") - } - logger.Debug("set greeter background:", file) - return m.userObj.SetGreeterBackground(0, file) -} - -func (m *Manager) doSetStandardFont(value string) error { - if !fonts.IsFontFamily(value) { - return fmt.Errorf("invalid font family '%v'", value) - } - - monoFont := m.MonospaceFont.Get() - if !fonts.IsFontFamily(monoFont) { - monoList := fonts.GetFamilyTable().ListMonospace() - if len(monoList) == 0 { - return fmt.Errorf("no valid mono font") - } - monoFont = monoList[0] - } - - err := fonts.SetFamily(value, monoFont, m.FontSize.Get()) - if err != nil { - return err - } - - err = m.xSettings.SetString(0, "Qt/FontName", value) - if err != nil { - return err - } - - return m.writeDQtTheme(dQtKeyFont, value) -} - -func (m *Manager) doSetMonospaceFont(value string) error { - if !fonts.IsFontFamily(value) { - return fmt.Errorf("invalid font family '%v'", value) - } - - standardFont := m.StandardFont.Get() - if !fonts.IsFontFamily(standardFont) { - standardList := fonts.GetFamilyTable().ListStandard() - if len(standardList) == 0 { - return fmt.Errorf("no valid standard font") - } - standardFont = standardList[0] - } - - err := fonts.SetFamily(standardFont, value, m.FontSize.Get()) - if err != nil { - return err - } - - err = m.xSettings.SetString(0, "Qt/MonoFontName", value) - if err != nil { - return err - } - - return m.writeDQtTheme(dQtKeyMonoFont, value) -} - -func (m *Manager) doSetFontSize(size float64) error { - if !fonts.IsFontSizeValid(size) { - logger.Debug("[doSetFontSize] invalid size:", size) - return fmt.Errorf("invalid font size '%v'", size) - } - - err := fonts.SetFamily(m.StandardFont.Get(), m.MonospaceFont.Get(), size) - if err != nil { - return err - } - - err = m.xSettings.SetString(0, "Qt/FontPointSize", - strconv.FormatFloat(size, 'f', -1, 64)) - if err != nil { - return err - } - - return m.writeDQtTheme(dQtKeyFontSize, strconv.FormatFloat(size, 'f', 1, 64)) -} - -func (m *Manager) doSetDTKSizeMode(enabled int32) error { - err := m.xSettings.SetInteger(0, "DTK/SizeMode", enabled) - return err -} - -func (m *Manager) isHasDTKSizeModeKey() bool { - return m.setting.GetSchema().HasKey(gsKeyDTKSizeMode) -} - -func (*Manager) doShow(ifc interface{}) (string, error) { - if ifc == nil { - return "", fmt.Errorf("not found target") - } - content, err := json.Marshal(ifc) - return string(content), err -} - -func (m *Manager) writeDQtTheme(key, value string) error { - err := setDQtTheme(dQtFile, dQtSectionTheme, - []string{key}, []string{value}) - if err != nil { - logger.Warning("failed to set deepin qt theme:", err) - } - return saveDQtTheme(dQtFile) -} - -func (m *Manager) setDesktopBackgrounds(val []string) { - if m.userObj != nil { - err := m.userObj.SetDesktopBackgrounds(0, val) - if err != nil { - logger.Warning("call userObj.SetDesktopBackgrounds err:", err) - } - } -} - -func (*Manager) GetInterfaceName() string { - return dbusInterface -} - -func (m *Manager) saveWSConfig(monitorSpace string, t time.Time) error { - cfg, _ := loadWSConfig(wsConfigFile) - var tempCfg WSConfig - tempCfg.LastChange = t - if m.wsLoopMap[monitorSpace] != nil { - tempCfg.Showed = m.wsLoopMap[monitorSpace].GetShowed() - } - if cfg == nil { - cfg = make(mapMonitorWorkspaceWSConfig) - } - cfg[monitorSpace] = tempCfg - return cfg.save(wsConfigFile) -} - -func (m *Manager) autoChangeBg(monitorSpace string, t time.Time) { - logger.Debug("autoChangeBg", monitorSpace, t) - if m.wsLoopMap[monitorSpace] == nil { - return - } - idx, err := m.wm.GetCurrentWorkspace(0) - if err != nil { - logger.Warning(err) - } - strIdx := strconv.Itoa(int(idx)) - splitter := strings.Index(monitorSpace, "&&") - if splitter == -1 { - logger.Warning("monitorSpace format error") - return - } - if strIdx == monitorSpace[splitter+len("&&"):] { - monitorname := monitorSpace[:splitter] - // 获取当前monitor的wallpaper,check是否是纯色壁纸 - currentURI, err := m.wm.GetWorkspaceBackgroundForMonitor(0, idx, monitorname) - if err != nil { - logger.Warning("get wallpaperURI failed:", err) - return - } - _, t := background.GetWallpaperType(currentURI) - file := m.wsLoopMap[monitorSpace].GetNext(t) - if file == "" { - logger.Warning("file is empty") - return - } - _, err = m.doSetMonitorBackground(monitorname, file) - if m.monitorMap[monitorname] == "Primary" { - m.updateGreeterBackground() - } - if err != nil { - logger.Warning("failed to set background:", err) - } - } - err = m.saveWSConfig(monitorSpace, t) - if err != nil { - logger.Warning(err) - } -} - -func (m *Manager) initWallpaperSlideshow() { - m.loadWSConfig() - cfg, err := doUnmarshalWallpaperSlideshow(m.WallpaperSlideShow.Get()) - if err == nil { - for monitorSpace, policy := range cfg { - _, ok := m.wsSchedulerMap[monitorSpace] - if !ok { - m.wsSchedulerMap[monitorSpace] = newWSScheduler(m.autoChangeBg) - } - _, ok = m.wsLoopMap[monitorSpace] - if !ok { - m.wsLoopMap[monitorSpace] = newWSLoop() - } - if isValidWSPolicy(policy) { - if policy == wsPolicyLogin { - err := m.changeBgAfterLogin(monitorSpace) - if err != nil { - logger.Warning("failed to change background after login:", err) - } - } else { - nSec, err := strconv.ParseUint(policy, 10, 32) - if err == nil && m.wsSchedulerMap[monitorSpace] != nil { - m.wsSchedulerMap[monitorSpace].updateInterval(monitorSpace, time.Duration(nSec)*time.Second) - } - } - } - } - } else { - logger.Debug("doUnmarshalWallpaperSlideshow err is ", err) - } -} - -func (m *Manager) changeBgAfterLogin(monitorSpace string) error { - runDir, err := basedir.GetUserRuntimeDir(true) - if err != nil { - return err - } - - currentSessionId, err := getSessionId("/proc/self/sessionid") - if err != nil { - return err - } - - var needChangeBg bool - markFile := filepath.Join(runDir, "dde-daemon-wallpaper-slideshow-login"+monitorSpace) - sessionId, err := getSessionId(markFile) - if err == nil { - if sessionId != currentSessionId { - needChangeBg = true - } - } else if os.IsNotExist(err) { - needChangeBg = true - } else if err != nil { - return err - } - - if needChangeBg { - m.autoChangeBg(monitorSpace, time.Now()) - err = ioutil.WriteFile(markFile, []byte(currentSessionId), 0644) - if err != nil { - return err - } - } - return nil -} - -func getSessionId(filename string) (string, error) { - content, err := ioutil.ReadFile(filename) - if err != nil { - return "", err - } - return string(bytes.TrimSpace(content)), nil -} - -func (m *Manager) loadWSConfig() { - cfg := loadWSConfigSafe(wsConfigFile) - for monitorSpace := range cfg { - _, ok := m.wsSchedulerMap[monitorSpace] - if !ok { - m.wsSchedulerMap[monitorSpace] = newWSScheduler(m.autoChangeBg) - } - m.wsSchedulerMap[monitorSpace].mu.Lock() - m.wsSchedulerMap[monitorSpace].lastSetBg = cfg[monitorSpace].LastChange - m.wsSchedulerMap[monitorSpace].mu.Unlock() - - _, ok = m.wsLoopMap[monitorSpace] - if !ok { - m.wsLoopMap[monitorSpace] = newWSLoop() - } - m.wsLoopMap[monitorSpace].mu.Lock() - for _, file := range cfg[monitorSpace].Showed { - m.wsLoopMap[monitorSpace].showed[file] = struct{}{} - } - m.wsLoopMap[monitorSpace].mu.Unlock() - } -} - -func (m *Manager) updateWSPolicy(policy string) { - cfg, err := doUnmarshalWallpaperSlideshow(policy) - m.loadWSConfig() - if err == nil { - for monitorSpace, policy := range cfg { - _, ok := m.wsSchedulerMap[monitorSpace] - if !ok { - m.wsSchedulerMap[monitorSpace] = newWSScheduler(m.autoChangeBg) - } - _, ok = m.wsLoopMap[monitorSpace] - if !ok { - m.wsLoopMap[monitorSpace] = newWSLoop() - } - if m.curMonitorSpace == monitorSpace && isValidWSPolicy(policy) { - nSec, err := strconv.ParseUint(policy, 10, 32) - if err == nil { - m.wsSchedulerMap[monitorSpace].lastSetBg = time.Now() - m.wsSchedulerMap[monitorSpace].updateInterval(monitorSpace, time.Duration(nSec)*time.Second) - err = m.saveWSConfig(monitorSpace, time.Now()) - if err != nil { - logger.Warning(err) - } - } else { - m.wsSchedulerMap[monitorSpace].stop() - } - } - } - } -} - -func (m *Manager) enableDetectSysClock(enabled bool) { - nSec := 60 // 1 min - if logger.GetLogLevel() == log.LevelDebug { - // debug mode: 10 s - nSec = 10 - } - interval := time.Duration(nSec) * time.Second - if enabled { - m.ts = time.Now().Unix() - if m.detectSysClockTimer == nil { - m.detectSysClockTimer = time.AfterFunc(interval, func() { - nowTs := time.Now().Unix() - d := nowTs - m.ts - int64(nSec) - if !(-2 < d && d < 2) { - m.handleSysClockChanged() - } - - m.ts = time.Now().Unix() - m.detectSysClockTimer.Reset(interval) - }) - } else { - m.detectSysClockTimer.Reset(interval) - } - } else { - // disable - if m.detectSysClockTimer != nil { - m.detectSysClockTimer.Stop() - } - } -} - -func (m *Manager) handleSysClockChanged() { - logger.Debug("system clock changed") - if m.locationValid { - m.autoSetTheme(m.latitude, m.longitude) - m.resetThemeAutoTimer() - } -} - -func (m *Manager) updateThemeAuto(enabled bool) { - m.enableDetectSysClock(enabled) - logger.Debug("updateThemeAuto:", enabled) - if enabled { - var err error - if m.themeAutoTimer == nil { - m.themeAutoTimer = time.AfterFunc(0, func() { - if m.locationValid { - m.autoSetTheme(m.latitude, m.longitude) - - time.AfterFunc(5*time.Second, func() { - m.resetThemeAutoTimer() - }) - } - }) - } else { - m.themeAutoTimer.Reset(0) - } - - city, err := m.timeDate.Timezone().Get(0) - if err != nil { - logger.Warning(err) - } - for ct, coordinate := range m.coordinateMap { - if city == ct { - m.longitude = coordinate.longitude - m.latitude = coordinate.latitude - } - } - - m.updateLocation(m.latitude, m.longitude) - logger.Debug("city", city, m.longitude, m.latitude) - - } else { - m.latitude = 0 - m.longitude = 0 - m.locationValid = false - if m.themeAutoTimer != nil { - m.themeAutoTimer.Stop() - } - } -} - -func (m *Manager) updateLocation(latitude, longitude float64) { - m.latitude = latitude - m.longitude = longitude - m.locationValid = true - logger.Debugf("update location, latitude: %v, longitude: %v", - latitude, longitude) - m.autoSetTheme(latitude, longitude) - m.resetThemeAutoTimer() -} - -func (m *Manager) resetThemeAutoTimer() { - if m.themeAutoTimer == nil { - logger.Debug("themeAutoTimer is nil") - return - } - if !m.locationValid { - logger.Debug("location is invalid") - return - } - - now := time.Now().In(m.loc) - changeTime, err := m.getThemeAutoChangeTime(now, m.latitude, m.longitude) - if err != nil { - logger.Warning("failed to get theme auto change time:", err) - return - } - - interval := changeTime.Sub(now) - logger.Debug("change theme after:", interval) - m.themeAutoTimer.Reset(interval) -} - -func (m *Manager) autoSetTheme(latitude, longitude float64) { - now := time.Now().In(m.loc) - if m.GtkTheme.Get() != autoGtkTheme { - return - } - - sunriseT, sunsetT, err := m.getSunriseSunset(now, latitude, longitude) - if err != nil { - logger.Warning(err) - return - } - logger.Debugf("now: %v, sunrise: %v, sunset: %v", - now, sunriseT, sunsetT) - themeName := getThemeAutoName(isDaytime(now, sunriseT, sunsetT)) - logger.Debug("auto theme name:", themeName) - - currentTheme := m.GtkTheme.Get() - if currentTheme != themeName { - err = m.doSetGtkTheme(themeName) - if err != nil { - logger.Warning(err) - } - } -} - -func (m *Manager) getQtActiveColor() (string, error) { - str := m.xSettingsGs.GetString(gsKeyQtActiveColor) - return xsColorToHexColor(str) -} - -func xsColorToHexColor(str string) (string, error) { - fields := strings.Split(str, ",") - if len(fields) != 4 { - return "", errors.New("length of fields is not 4") - } - - var array [4]uint16 - for idx, field := range fields { - v, err := strconv.ParseUint(field, 10, 16) - if err != nil { - return "", err - } - array[idx] = uint16(v) - } - - var byteArr [4]byte - for idx, value := range array { - byteArr[idx] = byte((float64(value) / float64(math.MaxUint16)) * float64(math.MaxUint8)) - } - return byteArrayToHexColor(byteArr), nil -} - -func byteArrayToHexColor(p [4]byte) string { - // p : [R G B A] - if p[3] == 255 { - return fmt.Sprintf("#%02X%02X%02X", p[0], p[1], p[2]) - } - return fmt.Sprintf("#%02X%02X%02X%02X", p[0], p[1], p[2], p[3]) -} - -var hexColorReg = regexp.MustCompile(`^#([0-9A-F]{6}|[0-9A-F]{8})$`) - -func parseHexColor(hexColor string) (array [4]byte, err error) { - hexColor = strings.ToUpper(hexColor) - match := hexColorReg.FindStringSubmatch(hexColor) - if match == nil { - err = errors.New("invalid hex color format") - return - } - hexNums := string(match[1]) - count := 4 - if len(hexNums) == 6 { - count = 3 - array[3] = 255 - } - - for i := 0; i < count; i++ { - array[i], err = parseHexNum(hexNums[i*2 : i*2+2]) - if err != nil { - return - } - } - return -} - -func parseHexNum(str string) (byte, error) { - v, err := strconv.ParseUint(str, 16, 8) - return byte(v), err -} - -func (m *Manager) setQtActiveColor(hexColor string) error { - xsColor, err := hexColorToXsColor(hexColor) - if err != nil { - return err - } - - ok := m.xSettingsGs.SetString(gsKeyQtActiveColor, xsColor) - if !ok { - return errors.New("failed to save") - } - return nil -} - -// 原有的壁纸数据保存在background-uris字段中,当壁纸模块升级后,将该数据迁移至wallpaper-uris中; -// wallpaper-slideshow前后版本的格式不同,根据旧数据重新生成新数据 -func (m *Manager) updateNewVersionData() error { - reverseMonitorMap := m.reverseMonitorMap() - primaryMonitor := reverseMonitorMap["Primary"] - slideshowConfig := make(mapMonitorWorkspaceWSPolicy) - slideShow := m.WallpaperSlideShow.Get() - workspaceCount, _ := m.wm.WorkspaceCount(0) - _, err := doUnmarshalWallpaperSlideshow(slideShow) - if err != nil { - // slideShow的内容无法解析为map[string]string数据表示低版本壁纸,进行数据格式转换 - for i := 1; i <= int(workspaceCount); i++ { - key := genMonitorKeyString(primaryMonitor, i) - slideshowConfig[key] = slideShow - } - err := m.setPropertyWallpaperSlideShow(slideshowConfig) - if err != nil { - return err - } - } - - monitorWorkspaceWallpaperURIs := make(mapMonitorWorkspaceWallpaperURIs) - backgroundURIs := m.getBackgroundURIs() - for i, uri := range backgroundURIs { - err := m.wm.SetWorkspaceBackgroundForMonitor(0, int32(i+1), primaryMonitor, uri) - if err != nil { - return fmt.Errorf("failed to set background:%v to workspace%v : %v", uri, i+1, err) - } - key := genMonitorKeyString("Primary", i+1) - monitorWorkspaceWallpaperURIs[key] = uri - } - err = m.setPropertyWallpaperURIs(monitorWorkspaceWallpaperURIs) - if err != nil { - return err - } - - go func() { - // V20对应SP3, SP2阶段gsettings background-uris中部分数据丢失,SP2升到SP3通过窗管接口获取壁纸 - // 目前第一次初始化,wm和appearance存在互相依赖,因此这里同步wm数据只能异步,这属于设计问题,后续可以优化交互逻辑 - monitorWorkspaceWallpaperURIs := make(mapMonitorWorkspaceWallpaperURIs) - for monitorName, convertMonitorName := range m.monitorMap { - for i := int32(0); i < workspaceCount; i++ { - uri, err := m.wm.GetWorkspaceBackgroundForMonitor(0, i+1, monitorName) - if err != nil { - logger.Warningf("failed to get monitor:%v workspace:%v background:%v", monitorName, i+1, err) - continue - } - - key := genMonitorKeyString(convertMonitorName, i+1) - monitorWorkspaceWallpaperURIs[key] = uri - } - } - err := m.setPropertyWallpaperURIs(monitorWorkspaceWallpaperURIs) - if err != nil { - logger.Warning("failed to set wallpaper:", err) - } - }() - return nil -} - -func genMonitorKeyString(monitor string, idx interface{}) string { - return fmt.Sprintf("%v&&%v", monitor, idx) -} - -func hexColorToXsColor(hexColor string) (string, error) { - byteArr, err := parseHexColor(hexColor) - if err != nil { - return "", err - } - var array [4]uint16 - for idx, value := range byteArr { - array[idx] = uint16((float64(value) / float64(math.MaxUint8)) * float64(math.MaxUint16)) - } - return fmt.Sprintf("%d,%d,%d,%d", array[0], array[1], - array[2], array[3]), nil -} - -func (m *Manager) initCoordinate() { - content, err := ioutil.ReadFile(zonePath) - if err != nil { - logger.Warning(err) - return - } - var ( - lines = strings.Split(string(content), "\n") - match = regexp.MustCompile(`^#`) - ) - for _, line := range lines { - if len(line) == 0 { - continue - } - - if match.MatchString(line) { - continue - } - strv := strings.Split(line, "\t") - m.iso6709Parsing(string(strv[2]), strv[1]) - } -} - -func (m *Manager) iso6709Parsing(city, coordinates string) { - var cdn coordinate - match := regexp.MustCompile(`(\+|-)\d+\.?\d*`) - - temp := match.FindAllString(coordinates, 2) - - temp[0] = temp[0][:3] + "." + temp[0][3:] - temp[1] = temp[1][:4] + "." + temp[1][4:] - lat, _ := strconv.ParseFloat(temp[0], 64) - lon, _ := strconv.ParseFloat(temp[1], 64) - cdn.longitude = lon - cdn.latitude = lat - m.coordinateMap[city] = &cdn -} - -func (m *Manager) initAppearanceDSettings() { - ds := configManager.NewConfigManager(m.sysSigLoop.Conn()) - - appearancePath, err := ds.AcquireManager(0, dsettingsAppID, dsettingsAppearanceName, "") - if err != nil { - logger.Warning(err) - return - } - - dsAppearance, err := configManager.NewManager(m.sysSigLoop.Conn(), appearancePath) - if err != nil { - logger.Warning(err) - return - } - - getIrregularFontWhiteListKey := func() { - v, err := dsAppearance.Value(0, dsettingsIrregularFontOverrideKey) - if err != nil { - logger.Warning(err) - return - } - var overrideMap fonts.IrregularFontOverrideMap - overrideMapString := v.Value().(string) - err = json.Unmarshal([]byte(overrideMapString), &overrideMap) - if err != nil { - logger.Warning(err) - return - } - fonts.SetIrregularFontWhiteList(overrideMap) - } - - getIrregularFontWhiteListKey() - - dsAppearance.InitSignalExt(m.sysSigLoop, true) - _, err = dsAppearance.ConnectValueChanged(func(key string) { - if key == dsettingsIrregularFontOverrideKey { - getIrregularFontWhiteListKey() - } - }) - if err != nil { - logger.Warning(err) - } -} diff --git a/appearance/manager_test.go b/appearance/manager_test.go deleted file mode 100644 index 8c98204e1..000000000 --- a/appearance/manager_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package appearance - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_genMonitorKeyString(t *testing.T) { - assert.Equal(t, genMonitorKeyString("abc", 123), "abc&&123") - assert.Equal(t, genMonitorKeyString("abc", "def"), "abc&&def") -} diff --git a/appearance/scale.go b/appearance/scale.go deleted file mode 100644 index 1e9cd33bb..000000000 --- a/appearance/scale.go +++ /dev/null @@ -1,94 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package appearance - -import ( - "sync/atomic" - - "github.com/godbus/dbus" - notifications "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.notifications" - "github.com/linuxdeepin/go-lib/gettext" -) - -func (m *Manager) getScaleFactor() float64 { - scaleFactor, err := m.xSettings.GetScaleFactor(dbus.FlagNoAutoStart) - if err != nil { - logger.Warning("failed to get scale factor:", err) - scaleFactor = 1.0 - } - return scaleFactor -} - -func (m *Manager) setScaleFactor(scale float64) error { - err := m.xSettings.SetScaleFactor(dbus.FlagNoAutoStart, scale) - if err != nil { - logger.Warning("failed to set scale factor:", err) - } - return err -} - -var notifyId uint32 - -const icon = "dialog-window-scale" - -func handleSetScaleFactorDone() { - const ( - expireTimeout = 0 - requestLogout = "dbus-send,--type=method_call,--dest=com.deepin.SessionManager,/com/deepin/SessionManager,com.deepin.SessionManager.RequestLogout" - ) - body := gettext.Tr("Log out for display scaling settings to take effect") - summary := gettext.Tr("Set successfully") - sessionBus, err := dbus.SessionBus() - if err != nil { - logger.Warning(err) - return - } - nid := atomic.LoadUint32(¬ifyId) - notifier := notifications.NewNotifications(sessionBus) - nid, err = notifier.Notify(0, "dde-control-center", nid, - icon, summary, body, - []string{"_logout", gettext.Tr("Log Out Now"), "_later", gettext.Tr("Later")}, - map[string]dbus.Variant{ - "x-deepin-action-_logout": dbus.MakeVariant(requestLogout), - "x-deepin-action-_later": dbus.MakeVariant(""), - "x-deepin-ClickToDisappear": dbus.MakeVariant(false), - "x-deepin-DisappearAfterLock": dbus.MakeVariant(false), - }, expireTimeout) - if err != nil { - logger.Warning(err) - } else { - atomic.StoreUint32(¬ifyId, nid) - } - -} - -func handleSetScaleFactorStarted() { - body := gettext.Tr("Setting display scaling") - summary := gettext.Tr("Display scaling") - sessionBus, err := dbus.SessionBus() - if err != nil { - logger.Warning(err) - return - } - nid := atomic.LoadUint32(¬ifyId) - notifier := notifications.NewNotifications(sessionBus) - nid, err = notifier.Notify(0, "dde-control-center", nid, - icon, summary, body, - nil, nil, 0) - if err != nil { - logger.Warning(err) - } else { - atomic.StoreUint32(¬ifyId, nid) - } - -} - -func (m *Manager) setScreenScaleFactors(factors map[string]float64) error { - return m.xSettings.SetScreenScaleFactors(dbus.FlagNoAutoStart, factors) -} - -func (m *Manager) getScreenScaleFactors() (map[string]float64, error) { - return m.xSettings.GetScreenScaleFactors(dbus.FlagNoAutoStart) -} diff --git a/appearance/subthemes/themes.go b/appearance/subthemes/themes.go deleted file mode 100644 index 9bf96253c..000000000 --- a/appearance/subthemes/themes.go +++ /dev/null @@ -1,211 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package subthemes - -import ( - "fmt" - "os" - "path" - "strings" - - "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-api/theme_thumb" - "github.com/linuxdeepin/dde-api/themes" - cursorhelper "github.com/linuxdeepin/go-dbus-factory/com.deepin.api.cursorhelper" - "github.com/linuxdeepin/go-gir/gio-2.0" -) - -const ( - appearanceSchema = "com.deepin.dde.appearance" - gsKeyExcludedIcon = "excluded-icon-themes" -) - -type Theme struct { - Id string - Path string - - Deletable bool -} -type Themes []*Theme - -var ( - cacheGtkThemes Themes - cacheIconThemes Themes - cacheCursorThemes Themes - - home = os.Getenv("HOME") -) - -func RefreshGtkThemes() { - cacheGtkThemes = getThemes(themes.ListGtkTheme()) -} - -func RefreshIconThemes() { - infos := getThemes(themes.ListIconTheme()) - s := gio.NewSettings(appearanceSchema) - defer s.Unref() - blacklist := s.GetStrv(gsKeyExcludedIcon) - - var ret Themes - for _, info := range infos { - if isItemInList(info.Id, blacklist) { - continue - } - ret = append(ret, info) - } - cacheIconThemes = ret -} - -func RefreshCursorThemes() { - cacheCursorThemes = getThemes(themes.ListCursorTheme()) -} - -func ListGtkTheme() Themes { - if len(cacheGtkThemes) == 0 { - RefreshGtkThemes() - } - return cacheGtkThemes -} - -func ListIconTheme() Themes { - if len(cacheIconThemes) == 0 { - RefreshIconThemes() - } - return cacheIconThemes -} - -func ListCursorTheme() Themes { - if len(cacheCursorThemes) == 0 { - RefreshCursorThemes() - } - return cacheCursorThemes -} - -func IsGtkTheme(id string) bool { - return themes.IsThemeInList(id, themes.ListGtkTheme()) -} - -func IsIconTheme(id string) bool { - return themes.IsThemeInList(id, themes.ListIconTheme()) -} - -func IsCursorTheme(id string) bool { - return themes.IsThemeInList(id, themes.ListCursorTheme()) -} - -func SetGtkTheme(id string) error { - return themes.SetGtkTheme(id) -} - -func SetIconTheme(id string) error { - return themes.SetIconTheme(id) -} - -func SetCursorTheme(id string) error { - sessionBus, err := dbus.SessionBus() - if err != nil { - return err - } - helper := cursorhelper.NewCursorHelper(sessionBus) - return helper.Set(0, id) -} - -func GetGtkThumbnail(id string) (string, error) { - info := ListGtkTheme().Get(id) - if info == nil { - return "", fmt.Errorf("not found %q", id) - } - - descFile := path.Join(info.Path, "index.theme") - return theme_thumb.GetGtk(id, descFile) -} - -func GetIconThumbnail(id string) (string, error) { - info := ListIconTheme().Get(id) - if info == nil { - return "", fmt.Errorf("not found %q", id) - } - - descFile := path.Join(info.Path, "index.theme") - return theme_thumb.GetIcon(id, descFile) -} - -func GetCursorThumbnail(id string) (string, error) { - info := ListCursorTheme().Get(id) - if info == nil { - return "", fmt.Errorf("not found %q", id) - } - descFile := path.Join(info.Path, "cursor.theme") - return theme_thumb.GetCursor(id, descFile) -} - -func (infos Themes) GetIds() []string { - var ids []string - for _, info := range infos { - ids = append(ids, info.Id) - } - return ids -} - -func (infos Themes) Get(id string) *Theme { - for _, info := range infos { - if id == info.Id { - return info - } - } - return nil -} - -func (infos Themes) ListGet(ids []string) Themes { - var ret Themes - for _, id := range ids { - info := infos.Get(id) - if info == nil { - continue - } - ret = append(ret, info) - } - return ret -} - -func (infos Themes) Delete(id string) error { - info := infos.Get(id) - if info == nil { - return fmt.Errorf("not found %q", id) - } - return info.Delete() -} - -func (info *Theme) Delete() error { - if !info.Deletable { - return fmt.Errorf("permission denied") - } - return os.RemoveAll(info.Path) -} - -func getThemes(files []string) Themes { - var infos Themes - for _, v := range files { - infos = append(infos, &Theme{ - Id: path.Base(v), - Path: v, - Deletable: isDeletable(v), - }) - } - return infos -} - -func isDeletable(file string) bool { - return strings.Contains(file, home) -} - -func isItemInList(item string, list []string) bool { - for _, v := range list { - if item == v { - return true - } - } - return false -} diff --git a/appearance/sync_config.go b/appearance/sync_config.go deleted file mode 100644 index f183cfd81..000000000 --- a/appearance/sync_config.go +++ /dev/null @@ -1,309 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package appearance - -import ( - "encoding/json" - "errors" - "fmt" - "strconv" - "strings" -) - -const ( - backgroundDBusPath = dbusPath + "/Background" -) - -type syncConfig struct { - m *Manager -} - -func (sc *syncConfig) Get() (interface{}, error) { - var v syncData - v.Version = "1.0" - v.FontSize = sc.m.FontSize.Get() - v.GTK = sc.m.GtkTheme.Get() - v.Icon = sc.m.IconTheme.Get() - v.Cursor = sc.m.CursorTheme.Get() - v.FontStandard = sc.m.StandardFont.Get() - v.FontMonospace = sc.m.MonospaceFont.Get() - return &v, nil -} - -func (sc *syncConfig) Set(data []byte) error { - var v syncData - err := json.Unmarshal(data, &v) - if err != nil { - return err - } - - m := sc.m - if m.FontSize.Get() != v.FontSize { - err = m.doSetFontSize(v.FontSize) - if err != nil { - logger.Warning("failed to set font size:", err) - } else { - m.FontSize.Set(v.FontSize) - } - } - - if m.GtkTheme.Get() != v.GTK { - err = m.doSetGtkTheme(v.GTK) - if err != nil { - logger.Warning("failed to set gtk theme:", err) - } else { - m.GtkTheme.Set(v.GTK) - } - } - - if m.IconTheme.Get() != v.Icon { - err = m.doSetIconTheme(v.Icon) - if err != nil { - logger.Warning("failed to set icon theme:", err) - } else { - m.IconTheme.Set(v.Icon) - } - } - - if m.CursorTheme.Get() != v.Cursor { - err = m.doSetCursorTheme(v.Cursor) - if err != nil { - logger.Warning("failed to set cursor theme:", err) - } else { - m.CursorTheme.Set(v.Cursor) - } - } - - if m.StandardFont.Get() != v.FontStandard { - err = m.doSetStandardFont(v.FontStandard) - if err != nil { - logger.Warning("failed to set standard font:", err) - } else { - m.StandardFont.Set(v.FontStandard) - } - } - - if m.MonospaceFont.Get() != v.FontMonospace { - err = m.doSetMonospaceFont(v.FontMonospace) - if err != nil { - logger.Warning("failed to set monospace font:", err) - } else { - m.MonospaceFont.Set(v.FontMonospace) - } - } - - return nil -} - -// version: 1.0 -type syncData struct { - Version string `json:"version"` - FontSize float64 `json:"font_size"` - GTK string `json:"gtk"` - Icon string `json:"icon"` - Cursor string `json:"cursor"` - FontStandard string `json:"font_standard"` - FontMonospace string `json:"font_monospace"` -} - -type backgroundSyncConfig struct { - m *Manager -} - -func (sc *backgroundSyncConfig) Get() (interface{}, error) { - var v backgroundSyncData - v.Version = "2.0" - v.GreeterBackground = sc.m.greeterBg - slideShow := sc.m.WallpaperSlideShow.Get() - var cfgSlideshow mapMonitorWorkspaceWSPolicy - var err error - if slideShow != "" { //避免slideshow为空时,导致后续数据为空 - cfgSlideshow, err = doUnmarshalWallpaperSlideshow(slideShow) // slideShow是一个map 格式为: "HDMI-0&&1":"600" 分别是屏幕名称&&工作区编号和自动切换壁纸配置 - if err != nil { - logger.Warning(err) - return nil, err - } - } - - uploadSlideShow := make(mapMonitorWorkspaceWSPolicy) - for k, value := range cfgSlideshow { // 将具体的屏幕名称(例如"HDMI-0"或"VGA-0")转换为 主屏幕或副屏幕(Primary或Subsidiary0/Subsidiary1等) - keySlice := strings.Split(k, "&&") - if len(keySlice) < 2 { - continue - } - index, err := strconv.ParseInt(keySlice[1], 10, 32) - if err != nil { - logger.Warning(err) - return nil, err - } - if int32(index) < 1 { - return nil, errors.New("invalid workspace index") - } - monitorName := sc.m.monitorMap[keySlice[0]] - key := genMonitorKeyString(monitorName, keySlice[1]) - uploadSlideShow[key] = value - } - wallpaperURIsString := sc.m.WallpaperURIs.Get() - var cfgWallpaperURIs mapMonitorWorkspaceWallpaperURIs - if wallpaperURIsString != "" { - cfgWallpaperURIs, err = doUnmarshalMonitorWorkspaceWallpaperURIs(wallpaperURIsString) - if err != nil { - logger.Warning(err) - return nil, err - } - } - - uploadWallpaperURIs := make(mapMonitorWorkspaceWallpaperURIs) - for key, value := range cfgWallpaperURIs { // 对需要上传的壁纸信息进行过滤,只有当对应的自动切换的配置为空时(即:未配置自动切换相关内容),将该壁纸信息上传 - if uploadSlideShow[key] == "" { - uploadWallpaperURIs[key] = value - } - } - v.WallpaperURIs = uploadWallpaperURIs - v.SlideShowConfig = uploadSlideShow - - return &v, nil -} - -func (sc *backgroundSyncConfig) Set(data []byte) error { - var v backgroundSyncData - err := json.Unmarshal(data, &v) - if err != nil { - return err - } - m := sc.m - if m.greeterBg != v.GreeterBackground { - err = m.doSetGreeterBackground(v.GreeterBackground) - if err != nil { - logger.Warning(err) - } - } - - reverseMonitorMap := m.reverseMonitorMap() // 主副屏幕对应的具体屏幕名称的map 格式为{"Primary": "HDMI-0"} - if v.Version == "1.0" { // 兼容v1.0的数据内容 - primaryMonitor := reverseMonitorMap["Primary"] - // 处理自动切换的配置 - wallpaperSlideShow := m.WallpaperSlideShow.Get() - var slideshowConfig mapMonitorWorkspaceWSPolicy - if wallpaperSlideShow != "" { - slideshowConfig, err = doUnmarshalWallpaperSlideshow(wallpaperSlideShow) - if err != nil { - logger.Warning(err) - return err - } - } else { - slideshowConfig = make(mapMonitorWorkspaceWSPolicy) - } - - workspaceCount, _ := m.wm.WorkspaceCount(0) - for i := 1; i <= int(workspaceCount); i++ { - key := genMonitorKeyString(primaryMonitor, i) - slideshowConfig[key] = v.SlideShow - } - err := m.setPropertyWallpaperSlideShow(slideshowConfig) - if err != nil { - logger.Warning(err) - return err - } - if v.SlideShow != "" { - return nil - } - // 处理壁纸同步 - wallpaperURIs := m.WallpaperURIs.Get() - var monitorWorkspaceWallpaperURIs mapMonitorWorkspaceWallpaperURIs - if wallpaperURIs != "" { - monitorWorkspaceWallpaperURIs, err = doUnmarshalMonitorWorkspaceWallpaperURIs(wallpaperURIs) - if err != nil { - logger.Warning(err) - return err - } - } else { - monitorWorkspaceWallpaperURIs = make(mapMonitorWorkspaceWallpaperURIs) - } - - for i, uri := range v.BackgroundURIs { - err := m.wm.SetWorkspaceBackgroundForMonitor(0, int32(i+1), primaryMonitor, uri) - if err != nil { - err = fmt.Errorf("failed to set background:%v to workspace%v : %v", uri, i+1, err) - logger.Warning(err) - return err - } - key := genMonitorKeyString("Primary", i+1) - monitorWorkspaceWallpaperURIs[key] = uri - } - err = m.setPropertyWallpaperURIs(monitorWorkspaceWallpaperURIs) - if err != nil { - logger.Warning(err) - return err - } - return nil - } - - slideShow := make(mapMonitorWorkspaceWSPolicy) - for k, value := range v.SlideShowConfig { - keySlice := strings.Split(k, "&&") - if len(keySlice) < 2 { - continue - } - monitorName := reverseMonitorMap[keySlice[0]] //将主屏幕或副屏幕(Primary或Subsidiary0/Subsidiary1等)转换为具体的屏幕名称(例如"HDMI-0"或"VGA-0") - index, err := strconv.ParseInt(keySlice[1], 10, 32) - if err != nil { - logger.Warning(err) - return err - } - if int32(index) < 1 { - return errors.New("invalid workspace index") - } - key := genMonitorKeyString(monitorName, keySlice[1]) - slideShow[key] = value - } - - err = m.setPropertyWallpaperSlideShow(slideShow) - if err != nil { - return err - } - err = m.setPropertyWallpaperURIs(v.WallpaperURIs) - if err != nil { - return err - } - - workspaceCount, _ := m.wm.WorkspaceCount(0) // 当前工作区数量 - for key, value := range v.WallpaperURIs { - keySlice := strings.Split(key, "&&") - if len(keySlice) < 2 { - continue - } - monitorName := reverseMonitorMap[keySlice[0]] // 将主屏幕或副屏幕(Primary或Subsidiary0/Subsidiary1等)转换为具体的屏幕名称(例如"HDMI-0"或"VGA-0") - index, err := strconv.ParseInt(keySlice[1], 10, 32) - if err != nil { - logger.Warning(err) - return err - } - if monitorName == "" { - continue - } - if int32(index) < 1 { // index由1开始,代表工作区的编号,小于1代表编号错误 - return errors.New("invalid workspace index") - } - if int32(index) > workspaceCount { - continue - } - err = m.wm.SetWorkspaceBackgroundForMonitor(0, int32(index), monitorName, value) - if err != nil { - logger.Warning("failed to set WorkspaceBackgroundForMonitor:", err) - } - } - return nil -} - -// version: 2.0 -type backgroundSyncData struct { - Version string `json:"version"` - GreeterBackground string `json:"greeter_background"` - SlideShowConfig mapMonitorWorkspaceWSPolicy `json:"slide_show_config"` // v2.0配置 - WallpaperURIs mapMonitorWorkspaceWallpaperURIs `json:"wallpaper_uris"` // v2.0配置 - BackgroundURIs []string `json:"background_uris"` // 兼容v1.0的内容 - SlideShow string `json:"slide_show"` // 兼容v1.0的内容 -} diff --git a/appearance/testdata/fontVersionConf b/appearance/testdata/fontVersionConf deleted file mode 100644 index 840ca8cbf..000000000 --- a/appearance/testdata/fontVersionConf +++ /dev/null @@ -1 +0,0 @@ -1.4 \ No newline at end of file diff --git a/appearance/theme_auto.go b/appearance/theme_auto.go deleted file mode 100644 index 9f139e481..000000000 --- a/appearance/theme_auto.go +++ /dev/null @@ -1,65 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package appearance - -import ( - "time" - - "github.com/kelvins/sunrisesunset" -) - -func (m *Manager) getSunriseSunset(t time.Time, latitude, longitude float64) (time.Time, time.Time, error) { - timeUtc := t.UTC() - _, offsetSec := t.Zone() - utcOffset := float64(offsetSec / 3600.0) - sunrise, sunset, err := sunrisesunset.GetSunriseSunset(latitude, longitude, utcOffset, timeUtc) - if err != nil { - return time.Time{}, time.Time{}, err - } - sunriseT := time.Date(t.Year(), t.Month(), t.Day(), - sunrise.Hour(), sunrise.Minute(), sunrise.Second(), - 0, m.loc) - sunsetT := time.Date(t.Year(), t.Month(), t.Day(), - sunset.Hour(), sunset.Minute(), sunset.Second(), - 0, m.loc) - return sunriseT, sunsetT, nil -} - -func isDaytime(t, sunriseT, sunsetT time.Time) bool { - return sunriseT.Before(t) && t.Before(sunsetT) -} - -func getThemeAutoName(isDaytime bool) string { - if isDaytime { - return "deepin" - } - return "deepin-dark" -} - -func (m *Manager) getThemeAutoChangeTime(t time.Time, latitude, longitude float64) (time.Time, error) { - sunrise, sunset, err := m.getSunriseSunset(t, latitude, longitude) - if err != nil { - return time.Time{}, err - } - logger.Debugf("t: %v, sunrise: %v, sunset: %v", t, sunrise, sunset) - if t.Before(sunrise) || t.Equal(sunrise) { - // t <= sunrise - return sunrise, nil - } - - if t.Before(sunset) || t.Equal(sunset) { - // t <= sunset - return sunset, nil - } - - nextDay := t.AddDate(0, 0, 1) - nextDaySunrise, _, err := m.getSunriseSunset(nextDay, latitude, longitude) - logger.Debug("next day sunrise:", nextDaySunrise) - if err != nil { - return time.Time{}, err - } - - return nextDaySunrise, nil -} diff --git a/appearance/theme_auto_test.go b/appearance/theme_auto_test.go deleted file mode 100644 index 7a6d94a48..000000000 --- a/appearance/theme_auto_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package appearance - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_getThemeAutoName(t *testing.T) { - assert.Equal(t, getThemeAutoName(true), "deepin") - assert.Equal(t, getThemeAutoName(false), "deepin-dark") -} diff --git a/appearance/wallpaper-slideshow.go b/appearance/wallpaper-slideshow.go deleted file mode 100644 index 5e80d8e0e..000000000 --- a/appearance/wallpaper-slideshow.go +++ /dev/null @@ -1,257 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package appearance - -import ( - "encoding/json" - "io/ioutil" - "math/rand" - "os" - "path/filepath" - "strconv" - "sync" - "time" - - "github.com/linuxdeepin/dde-daemon/appearance/background" - - "github.com/linuxdeepin/go-lib/utils" -) - -type changeBgFunc func(monitorSpace string, t time.Time) - -// wallpaper slideshow scheduler -type WSScheduler struct { - mu sync.Mutex - lastSetBg time.Time //last set wallpaper time - interval time.Duration - quit chan chan struct{} - intervalChanged chan struct{} - running bool - fn changeBgFunc -} - -func newWSScheduler(fun changeBgFunc) *WSScheduler { - s := &WSScheduler{ - quit: make(chan chan struct{}), - intervalChanged: make(chan struct{}), - fn: fun, - } - return s -} - -func (s *WSScheduler) remainDuration() time.Duration { - s.mu.Lock() - defer s.mu.Unlock() - - elapsed := time.Since(s.lastSetBg) - if elapsed < 0 { - elapsed = 0 - } - result := s.interval - elapsed - return result -} - -func (s *WSScheduler) loopCheck(mointorSpace string) { - s.running = true - for { - select { - case <-s.intervalChanged: - continue - case t := <-time.After(s.remainDuration()): - if s.fn != nil { - go s.fn(mointorSpace, t) - } - s.lastSetBg = t - case ch := <-s.quit: - s.running = false - close(ch) - return - } - } -} - -func (s *WSScheduler) updateInterval(monitorSpace string, v time.Duration) { - if v < time.Second { - v = time.Second - } - logger.Debug("update interval", v) - - s.mu.Lock() - s.interval = v - if s.running { - s.mu.Unlock() - s.intervalChanged <- struct{}{} - return - } - - s.mu.Unlock() - go s.loopCheck(monitorSpace) -} - -func (s *WSScheduler) stop() { - s.mu.Lock() - defer s.mu.Unlock() - - if !s.running { - return - } - - logger.Debug("stop") - ch := make(chan struct{}) - s.quit <- ch - // wait quit - <-ch -} - -// wallpaper slideshow config -type WSConfig struct { - LastChange time.Time - Showed []string -} - -func loadWSConfig(filename string) (mapMonitorWorkspaceWSConfig, error) { - var cfg mapMonitorWorkspaceWSConfig - data, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - err = json.Unmarshal(data, &cfg) - if err != nil { - return nil, err - } - return cfg, nil -} - -func loadWSConfigSafe(filename string) mapMonitorWorkspaceWSConfig { - cfg, _ := loadWSConfig(filename) - return cfg -} - -func (c mapMonitorWorkspaceWSConfig) save(filename string) error { - data, err := json.Marshal(c) - if err != nil { - return err - } - dir := filepath.Dir(filename) - err = os.MkdirAll(dir, 0755) - if err != nil { - return err - } - - err = ioutil.WriteFile(filename, data, 0644) - return err -} - -// wallpaper slideshow loop -type WSLoop struct { - mu sync.Mutex - rand *rand.Rand - showed map[string]struct{} - all []string - fsChanged bool -} - -func newWSLoop() *WSLoop { - // #nosec G404 - return &WSLoop{ - rand: rand.New(rand.NewSource(time.Now().UnixNano())), - showed: make(map[string]struct{}), - fsChanged: true, - } -} - -func (wrl *WSLoop) GetShowed() []string { - wrl.mu.Lock() - - result := make([]string, 0, len(wrl.showed)) - for file := range wrl.showed { - result = append(result, file) - } - - wrl.mu.Unlock() - return result -} - -func (wrl *WSLoop) getNotShowed(t uint32) []string { - if wrl.fsChanged { - bgs := background.ListBackground() - bgFiles := make([]string, 0, len(bgs)) - for _, bg := range bgs { - bgFiles = append(bgFiles, utils.DecodeURI(bg.Id)) - } - wrl.all = bgFiles - } - - var result []string - for _, file := range wrl.all { - _, ok := wrl.showed[file] - if !ok { - _, t1 := background.GetWallpaperType(file) - if t == t1 { - result = append(result, file) - } - } - } - return result -} - -func (wrl *WSLoop) getNext(t uint32) string { - notShowed := wrl.getNotShowed(t) - if len(notShowed) == 0 { - return "" - } - idx := wrl.rand.Intn(len(notShowed)) - next := notShowed[idx] - wrl.showed[next] = struct{}{} - return next -} - -func (wrl *WSLoop) reset() { - logger.Debug("WSLoop.reset") - wrl.rand = rand.New(rand.NewSource(time.Now().UnixNano())) // #nosec - // clear showed - for key := range wrl.showed { - delete(wrl.showed, key) - } -} - -func (wrl *WSLoop) AddToShowed(file string) { - file = utils.DecodeURI(file) - wrl.mu.Lock() - wrl.showed[file] = struct{}{} - wrl.mu.Unlock() -} - -func (wrl *WSLoop) GetNext(t uint32) string { - wrl.mu.Lock() - defer wrl.mu.Unlock() - - next := wrl.getNext(t) - if next != "" { - return next - } - - if len(wrl.all) > 0 { - wrl.reset() - next = wrl.getNext(t) - } - - return next -} - -func (wrl *WSLoop) NotifyFsChanged() { - wrl.mu.Lock() - wrl.fsChanged = true - wrl.mu.Unlock() -} - -func isValidWSPolicy(policy string) bool { - if policy == wsPolicyWakeup || policy == wsPolicyLogin || policy == "" { - return true - } - - _, err := strconv.ParseUint(policy, 10, 32) - return err == nil -} diff --git a/apps/alrecorder.go b/apps1/alrecorder.go similarity index 96% rename from apps/alrecorder.go rename to apps1/alrecorder.go index 49f41261a..4b4327df4 100644 --- a/apps/alrecorder.go +++ b/apps1/alrecorder.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package apps +package apps1 import ( "errors" @@ -13,14 +13,14 @@ import ( "sync" "github.com/fsnotify/fsnotify" - dbus "github.com/godbus/dbus" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + dbus "github.com/godbus/dbus/v5" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" "github.com/linuxdeepin/go-lib/dbusutil" ) const ( - dbusServiceName = "com.deepin.daemon.Apps" - dbusPath = "/com/deepin/daemon/Apps" + dbusServiceName = "org.deepin.dde.Apps1" + dbusPath = "/org/deepin/dde/Apps1" alRecorderDBusInterface = dbusServiceName + ".LaunchedRecorder" minUid = 1000 ) @@ -256,7 +256,7 @@ func (r *ALRecorder) watchAppsDir(uid int, home, appsDir string) { r.subRecorders[appsDir] = sr } -//判断filename是否是符号链接 +// 判断filename是否是符号链接 func isSymlink(filename string) bool { fileInfo, err := os.Lstat(filename) if err != nil { @@ -265,7 +265,7 @@ func isSymlink(filename string) bool { return fileInfo.Mode()&os.ModeSymlink != 0 } -//获取path所有子path +// 获取path所有子path func getPathDirs(filename string) (ret []string) { for { ret = append(ret, filename) diff --git a/apps/debug.go b/apps1/debug.go similarity index 92% rename from apps/debug.go rename to apps1/debug.go index 6b964c793..9ea9577f0 100644 --- a/apps/debug.go +++ b/apps1/debug.go @@ -1,10 +1,11 @@ +//go:build debug // +build debug // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later -package apps +package apps1 //func (r *ALRecorder) DebugUserRemoved(sender dbus.Sender) *dbus.Error { // uid, err := r.Service().GetConnUID(string(sender)) diff --git a/apps/dfwatcher.go b/apps1/dfwatcher.go similarity index 99% rename from apps/dfwatcher.go rename to apps1/dfwatcher.go index dbc09c16c..0bcf20e2d 100644 --- a/apps/dfwatcher.go +++ b/apps1/dfwatcher.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package apps +package apps1 import ( "os" diff --git a/apps/exported_methods_auto.go b/apps1/exported_methods_auto.go similarity index 98% rename from apps/exported_methods_auto.go rename to apps1/exported_methods_auto.go index 5c07adf46..3af6e0f3f 100644 --- a/apps/exported_methods_auto.go +++ b/apps1/exported_methods_auto.go @@ -1,6 +1,6 @@ // Code generated by "dbusutil-gen em -type ALRecorder,DFWatcher"; DO NOT EDIT. -package apps +package apps1 import ( "github.com/linuxdeepin/go-lib/dbusutil" diff --git a/apps/file_event.go b/apps1/file_event.go similarity index 98% rename from apps/file_event.go rename to apps1/file_event.go index a2bb5f1f5..fc57c35ce 100644 --- a/apps/file_event.go +++ b/apps1/file_event.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package apps +package apps1 import ( "os" diff --git a/apps/fs_watcher.go b/apps1/fs_watcher.go similarity index 99% rename from apps/fs_watcher.go rename to apps1/fs_watcher.go index 6f9386838..6dd348c72 100644 --- a/apps/fs_watcher.go +++ b/apps1/fs_watcher.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package apps +package apps1 import ( "os" diff --git a/apps/main.go b/apps1/main.go similarity index 98% rename from apps/main.go rename to apps1/main.go index e8986a275..cf2fb1dce 100644 --- a/apps/main.go +++ b/apps1/main.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package apps +package apps1 import ( "github.com/linuxdeepin/dde-daemon/loader" diff --git a/apps/subrecorder.go b/apps1/subrecorder.go similarity index 96% rename from apps/subrecorder.go rename to apps1/subrecorder.go index fef4812ed..680c599da 100644 --- a/apps/subrecorder.go +++ b/apps1/subrecorder.go @@ -2,13 +2,14 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package apps +package apps1 import ( "bufio" "crypto/md5" "encoding/csv" "fmt" + "github.com/linuxdeepin/go-lib/utils" "io" "io/ioutil" "os" @@ -250,7 +251,15 @@ func (sr *SubRecorder) save() error { } } else { if err := os.Rename(tmpFile, file); err != nil { - return err + if strings.Contains(err.Error(), "invalid cross-device link") { + logger.Debugf("invalid cross-device link, use move file, src is %v, dest is %v", tmpFile, file) + err = utils.MoveFile(tmpFile, file) + if err != nil { + return err + } + } else { + return err + } } } return nil diff --git a/apps/utils.go b/apps1/utils.go similarity index 99% rename from apps/utils.go rename to apps1/utils.go index 8863d6c27..527197f96 100644 --- a/apps/utils.go +++ b/apps1/utils.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package apps +package apps1 import ( "os" diff --git a/apps/utils_test.go b/apps1/utils_test.go similarity index 99% rename from apps/utils_test.go rename to apps1/utils_test.go index 4cc1c32ae..2944b377c 100644 --- a/apps/utils_test.go +++ b/apps1/utils_test.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package apps +package apps1 import ( "os" diff --git a/audio/alsa.go b/audio1/alsa.go similarity index 69% rename from audio/alsa.go rename to audio1/alsa.go index 439c7f0ae..1cc0c27e6 100644 --- a/audio/alsa.go +++ b/audio1/alsa.go @@ -77,51 +77,51 @@ static int find_card_control(char *name, int *card_num, char **control_id) { */ import "C" import ( - "errors" - "fmt" - "os/exec" - "strconv" - "unsafe" + "errors" + "fmt" + "os/exec" + "strconv" + "unsafe" ) var errNotFoundControl = errors.New("not found control") func findCardControl(name string) (card int, controlId string, err error) { - var cCard C.int - var cControlId *C.char - cName := C.CString(name) + var cCard C.int + var cControlId *C.char + cName := C.CString(name) - cErr := C.find_card_control(cName, &cCard, &cControlId) - C.free(unsafe.Pointer(cName)) + cErr := C.find_card_control(cName, &cCard, &cControlId) + C.free(unsafe.Pointer(cName)) - if cErr < 0 { - err = fmt.Errorf("find_card_control err code: %d", err) - return - } + if cErr < 0 { + err = fmt.Errorf("find_card_control err code: %d", err) + return + } - if cControlId != nil { - card = int(cCard) - controlId = C.GoString(cControlId) - C.free(unsafe.Pointer(cControlId)) - return - } + if cControlId != nil { + card = int(cCard) + controlId = C.GoString(cControlId) + C.free(unsafe.Pointer(cControlId)) + return + } - err = errNotFoundControl - return + err = errNotFoundControl + return } func disableAutoMuteMode() error { - cardNum, controlId, err := findCardControl("Auto-Mute Mode") - if err != nil { - if err == errNotFoundControl { - err = nil - } - return err - } - out, err := exec.Command("amixer", "-c", strconv.Itoa(cardNum), "cset", controlId, "Disabled").Output() - if err != nil { - return err - } - logger.Debugf("command amixer -c %d cset %s Disabled\n out: %s", cardNum, controlId, out) - return nil + cardNum, controlId, err := findCardControl("Auto-Mute Mode") + if err != nil { + if err == errNotFoundControl { + err = nil + } + return err + } + out, err := exec.Command("amixer", "-c", strconv.Itoa(cardNum), "cset", controlId, "Disabled").Output() + if err != nil { + return err + } + logger.Debugf("command amixer -c %d cset %s Disabled\n out: %s", cardNum, controlId, out) + return nil } diff --git a/audio/audio.go b/audio1/audio.go similarity index 95% rename from audio/audio.go rename to audio1/audio.go index b572da78b..37d543d74 100644 --- a/audio/audio.go +++ b/audio1/audio.go @@ -15,7 +15,7 @@ import ( "sync" "time" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/common/dsync" gio "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil" @@ -42,8 +42,8 @@ const ( gsKeyEnabled = "enabled" gsKeyDisableAutoMute = "disable-auto-mute" - dbusServiceName = "com.deepin.daemon.Audio" - dbusPath = "/com/deepin/daemon/Audio" + dbusServiceName = "org.deepin.dde.Audio1" + dbusPath = "/org/deepin/dde/Audio1" dbusInterface = dbusServiceName cmdSystemctl = "systemctl" @@ -58,6 +58,7 @@ const ( dsgKeyReduceNoise = "reduceNoise" dsgKeyInputDefaultPriorities = "inputDefaultPrioritiesByType" dsgKeyOutputDefaultPriorities = "outputDefaultPrioritiesByType" + dsgKeyBluezModeDefault = "bluezModeDefault" ) var ( @@ -672,11 +673,19 @@ func (a *Audio) init() error { } for _, source := range a.sources { - if source.Name == a.defaultSourceName { + if strings.Contains(a.defaultSourceName, "record_mono") && strings.Contains(source.Name, "alsa_input.platform-rk809-sound.analog-stereo") { a.defaultSource = source a.PropsMu.Lock() a.setPropDefaultSource(source.getPath()) a.PropsMu.Unlock() + logger.Debug("init setPropDefaultSource:", source.Name, source.getPath()) + } else { + if source.Name == a.defaultSourceName { + a.defaultSource = source + a.PropsMu.Lock() + a.setPropDefaultSource(source.getPath()) + a.PropsMu.Unlock() + } } } a.mu.Unlock() @@ -731,7 +740,7 @@ func (a *Audio) init() error { a.moveSinkInputsToDefaultSink() // 蓝牙支持的模式 - a.setPropBluetoothAudioModeOpts([]string{"a2dp", "headset"}) + a.setPropBluetoothAudioModeOpts([]string{"a2dp", "headset", "handsfree"}) return nil } @@ -879,10 +888,15 @@ func (a *Audio) setDefaultSourceWithPort(cardId uint32, portName string) error { logger.Debugf("set source #%d port %s", source.Index, portName) a.ctx.SetSourcePortByIndex(source.Index, portName) } - + logger.Debug("a.getDefaultSourceName() ", a.getDefaultSourceName()) if a.getDefaultSourceName() != source.Name { - logger.Debugf("set default source #%d %s", source.Index, source.Name) - a.ctx.SetDefaultSource(source.Name) + if strings.Contains(source.Name, "platform-rk809-sound.analog-stereo") { + a.ctx.SetDefaultSource("record_mono") + a.updateDefaultSource(source.Name) + logger.Debugf("set default source %s as record_mono", source.Name) + } else { + a.ctx.SetDefaultSource(source.Name) + } } return nil @@ -1373,6 +1387,14 @@ func (a *Audio) updateDefaultSource(sourceName string) { } logger.Debugf("updateDefaultSource #%d %s", sourceInfo.Index, sourceName) + if !isPhysicalDevice(sourceName) { + sourceInfo = a.getSourceInfoByName(sourceInfo.Proplist["device.master_device"]) + if sourceInfo == nil { + logger.Warning("failed to get virtual device sourceInfo for name:", sourceName) + return + } + } + logger.Debug("sourceInfo", sourceInfo) a.mu.Lock() source, ok := a.sources[sourceInfo.Index] a.mu.Unlock() @@ -1386,6 +1408,16 @@ func (a *Audio) updateDefaultSource(sourceName string) { } } + if strings.Contains(source.Name, "record_mono") { + sourceInfo := a.getSourceInfoByName("alsa_input.platform-rk809-sound.analog-stereo") + if sourceInfo != nil { + a.mu.Lock() + if v, ok := a.sources[sourceInfo.Index]; ok { + source = v + } + a.mu.Unlock() + } + } a.mu.Lock() a.defaultSource = source a.mu.Unlock() @@ -1584,7 +1616,7 @@ func (a *Audio) SetBluetoothAudioMode(mode string) *dbus.Error { card.core.SetProfile(profile.Name) // 手动切换蓝牙模式为headset, - if mode == bluezModeHeadset { + if mode == bluezModeHeadset || mode == bluezModeHandsfree { a.inputAutoSwitchCount = 0 GetPriorityManager().Input.SetTheFirstType(PortTypeBluetooth) } @@ -1707,6 +1739,21 @@ func (a *Audio) initDsgProp() error { } logger.Info("output default priority list", outputDefaultPriorities) } + + getBluezModeDefault := func() { + var val string + err = systemConnObj.Call("org.desktopspec.ConfigManager.Manager.value", 0, dsgKeyBluezModeDefault).Store(&val) + if err != nil { + logger.Warning(err) + } else { + if val == bluezModeA2dp || val == bluezModeHandsfree || val == bluezModeHeadset { + bluezModeDefault = val + logger.Info("bluez default mode:", bluezModeDefault) + } + } + } + getBluezModeDefault() + // 监听dsg配置变化 a.systemSigLoop.AddHandler(&dbusutil.SignalRule{ Name: "org.desktopspec.ConfigManager.Manager.valueChanged", @@ -1714,14 +1761,19 @@ func (a *Audio) initDsgProp() error { if strings.Contains(sig.Name, "org.desktopspec.ConfigManager.Manager.valueChanged") && strings.Contains(string(sig.Path), "org_deepin_dde_daemon_audio") && len(sig.Body) >= 1 { key, ok := sig.Body[0].(string) - if ok && key == dsgKeyAutoSwitchPort { - var val bool - err = systemConnObj.Call("org.desktopspec.ConfigManager.Manager.value", 0, key).Store(&val) - if err != nil { - logger.Warning(err) - } else { - logger.Info("auto switch port:", val) - a.setEnableAutoSwitchPort(val) + if ok { + switch key { + case dsgKeyAutoSwitchPort: + var val bool + err = systemConnObj.Call("org.desktopspec.ConfigManager.Manager.value", 0, key).Store(&val) + if err != nil { + logger.Warning(err) + } else { + logger.Info("auto switch port:", val) + a.setEnableAutoSwitchPort(val) + } + case dsgKeyBluezModeDefault: + getBluezModeDefault() } } diff --git a/audio/audio_config.go b/audio1/audio_config.go similarity index 97% rename from audio/audio_config.go rename to audio1/audio_config.go index 11d2cf97e..a452a177f 100644 --- a/audio/audio_config.go +++ b/audio1/audio_config.go @@ -9,8 +9,8 @@ import ( "os/exec" "time" - dbus "github.com/godbus/dbus" - soundthemeplayer "github.com/linuxdeepin/go-dbus-factory/com.deepin.api.soundthemeplayer" + dbus "github.com/godbus/dbus/v5" + soundthemeplayer "github.com/linuxdeepin/go-dbus-factory/system/com.deepin.api.soundthemeplayer" "github.com/linuxdeepin/go-lib/asound" "github.com/linuxdeepin/go-lib/pulse" ) diff --git a/audio/audio_dbusutil.go b/audio1/audio_dbusutil.go similarity index 99% rename from audio/audio_dbusutil.go rename to audio1/audio_dbusutil.go index 830ea95db..43a62d3f8 100644 --- a/audio/audio_dbusutil.go +++ b/audio1/audio_dbusutil.go @@ -3,7 +3,7 @@ package audio import ( - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" ) func (v *Audio) setPropSinkInputs(value []dbus.ObjectPath) (changed bool) { diff --git a/audio/audio_events.go b/audio1/audio_events.go similarity index 98% rename from audio/audio_events.go rename to audio1/audio_events.go index e09b7a91a..beaa1c0ff 100644 --- a/audio/audio_events.go +++ b/audio1/audio_events.go @@ -11,8 +11,8 @@ import ( "strconv" "strings" - dbus "github.com/godbus/dbus" - notifications "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.notifications" + dbus "github.com/godbus/dbus/v5" + notifications "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.notifications" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/gettext" "github.com/linuxdeepin/go-lib/gsettings" @@ -358,7 +358,7 @@ func (a *Audio) handleSinkChanged(idx uint32) { logger.Debugf("sink %d changed", idx) // 蓝牙模式切换、触发sink change - if a.defaultSink.index == idx && isBluezAudio(a.defaultSink.Name) { + if a.defaultSink != nil && a.defaultSink.index == idx && isBluezAudio(a.defaultSink.Name) { card, err := a.cards.get(a.defaultSink.Card) if err == nil { a.setPropBluetoothAudioMode(card.BluezMode()) @@ -435,9 +435,9 @@ func (a *Audio) handleSinkInputChanged(idx uint32) { /* 创建开启端口的命令,提供给notification调用 */ func makeNotifyCmdEnablePort(cardId uint32, portName string) string { - dest := "com.deepin.daemon.Audio" - path := "/com/deepin/daemon/Audio" - method := "com.deepin.daemon.Audio.SetPortEnabled" + dest := "org.deepin.dde.Audio1" + path := "/org/deepin/dde/Audio1" + method := "org.deepin.dde.Audio1.SetPortEnabled" return fmt.Sprintf("dbus-send,--type=method_call,--dest=%s,%s,%s,uint32:%d,string:%s,boolean:true", dest, path, method, cardId, portName) } diff --git a/audio/audio_test.go b/audio1/audio_test.go similarity index 87% rename from audio/audio_test.go rename to audio1/audio_test.go index 8da240235..c15b192dc 100644 --- a/audio/audio_test.go +++ b/audio1/audio_test.go @@ -9,15 +9,15 @@ import ( "github.com/stretchr/testify/assert" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/pulse" ) func Test_objectPathSliceEqual(t *testing.T) { - var str = []dbus.ObjectPath{"/com/deepin/daemon/Bluetooth", "/com/deepin/daemon/Audio"} - var str1 = []dbus.ObjectPath{"/com/deepin/daemon/Bluetooth", "/com/deepin/daemon/Audio"} - var str2 = []dbus.ObjectPath{"/com/deepin/daemon/Bluetooth", "/com/deepin/daemon/Audio", "/"} - var str3 = []dbus.ObjectPath{"/com/deepin/daemon/Bluetooth", "/com/deepin/daemon/Accounts"} + var str = []dbus.ObjectPath{"/org/deepin/dde/Bluetooth1", "/org/deepin/dde/Audio1"} + var str1 = []dbus.ObjectPath{"/org/deepin/dde/Bluetooth1", "/org/deepin/dde/Audio1"} + var str2 = []dbus.ObjectPath{"/org/deepin/dde/Bluetooth1", "/org/deepin/dde/Audio1", "/"} + var str3 = []dbus.ObjectPath{"/org/deepin/dde/Bluetooth1", "/org/deepin/dde/Accounts1"} assert.Equal(t, objectPathSliceEqual(str, str1), true) assert.Equal(t, objectPathSliceEqual(str, str2), false) diff --git a/audio/bluez_audio.go b/audio1/bluez_audio.go similarity index 91% rename from audio/bluez_audio.go rename to audio1/bluez_audio.go index e72361bc6..4e1e7fa76 100644 --- a/audio/bluez_audio.go +++ b/audio1/bluez_audio.go @@ -10,19 +10,20 @@ import ( "path/filepath" "strings" - dbus "github.com/godbus/dbus" - bluez "github.com/linuxdeepin/go-dbus-factory/org.bluez" + dbus "github.com/godbus/dbus/v5" + bluez "github.com/linuxdeepin/go-dbus-factory/system/org.bluez" "github.com/linuxdeepin/go-lib/strv" "github.com/linuxdeepin/go-lib/xdg/basedir" ) const ( - bluezModeA2dp = "a2dp" - bluezModeHeadset = "headset" - bluezModeDefault = bluezModeA2dp + bluezModeA2dp = "a2dp" + bluezModeHeadset = "headset" + bluezModeHandsfree = "handsfree" ) var ( + bluezModeDefault = bluezModeA2dp bluezModeFilterList = []string{"a2dp_source"} ) @@ -166,6 +167,8 @@ func (card *Card) BluezMode() string { return bluezModeA2dp } else if strings.Contains(strings.ToLower(profileName), bluezModeHeadset) { return bluezModeHeadset + } else if strings.Contains(strings.ToLower(profileName), bluezModeHandsfree) { + return bluezModeHandsfree } else { return "" } @@ -188,11 +191,6 @@ func (card *Card) BluezModeOpts() []string { continue } - if strings.Contains(profile.Description, "HFP") && !strings.Contains(profile.Description, "HSP") { - logger.Debugf("%s %s is a HFP profile", card.core.Name, profile.Name) - continue - } - if strings.Contains(strings.ToLower(profile.Name), "a2dp") { opts = append(opts, "a2dp") } @@ -200,6 +198,10 @@ func (card *Card) BluezModeOpts() []string { if strings.Contains(strings.ToLower(profile.Name), "headset") { opts = append(opts, "headset") } + + if strings.Contains(strings.ToLower(profile.Name), "handsfree") { + opts = append(opts, "handsfree") + } } return opts } diff --git a/audio/card.go b/audio1/card.go similarity index 98% rename from audio/card.go rename to audio1/card.go index 2fd23656a..641d18693 100644 --- a/audio/card.go +++ b/audio1/card.go @@ -171,7 +171,7 @@ func (cards CardList) string() string { Bluetooth: isBluetoothCard(cardInfo.core), Description: portInfo.Description, Direction: portInfo.Direction, - PortType: DetectPortType(cardInfo.core, &portInfo), + PortType: GetIconPortType(cardInfo.Name, portInfo.Name), }) } @@ -200,7 +200,7 @@ func (cards CardList) stringWithoutUnavailable() string { Bluetooth: isBluetoothCard(cardInfo.core), Description: portInfo.Description, Direction: portInfo.Direction, - PortType: DetectPortType(cardInfo.core, &portInfo), + PortType: GetIconPortType(cardInfo.Name, portInfo.Name), }) } diff --git a/audio/card_profile_workaround.go b/audio1/card_profile_workaround.go similarity index 94% rename from audio/card_profile_workaround.go rename to audio1/card_profile_workaround.go index 2058342fd..cca4fcb57 100644 --- a/audio/card_profile_workaround.go +++ b/audio1/card_profile_workaround.go @@ -8,8 +8,8 @@ import ( "fmt" "sort" - dbus "github.com/godbus/dbus" - bluez "github.com/linuxdeepin/go-dbus-factory/org.bluez" + dbus "github.com/godbus/dbus/v5" + bluez "github.com/linuxdeepin/go-dbus-factory/system/org.bluez" "github.com/linuxdeepin/go-lib/pulse" "github.com/linuxdeepin/go-lib/strv" ) @@ -46,7 +46,7 @@ func profileBlacklist(c *pulse.Card) strv.Strv { return strv.Strv(blacklist) } -//select New Card Profile By priority, protocl. +// select New Card Profile By priority, protocl. func selectNewCardProfile(c *pulse.Card) { blacklist := profileBlacklist(c) if !blacklist.Contains(c.ActiveProfile.Name) { diff --git a/audio/card_test.go b/audio1/card_test.go similarity index 100% rename from audio/card_test.go rename to audio1/card_test.go diff --git a/audio/config.go b/audio1/config.go similarity index 100% rename from audio/config.go rename to audio1/config.go diff --git a/audio/config_keeper.go b/audio1/config_keeper.go similarity index 100% rename from audio/config_keeper.go rename to audio1/config_keeper.go diff --git a/audio/config_keeper_test.go b/audio1/config_keeper_test.go similarity index 100% rename from audio/config_keeper_test.go rename to audio1/config_keeper_test.go diff --git a/audio/config_test.go b/audio1/config_test.go similarity index 100% rename from audio/config_test.go rename to audio1/config_test.go diff --git a/audio/exported_methods_auto.go b/audio1/exported_methods_auto.go similarity index 100% rename from audio/exported_methods_auto.go rename to audio1/exported_methods_auto.go diff --git a/audio/meter.go b/audio1/meter.go similarity index 93% rename from audio/meter.go rename to audio1/meter.go index a1a5b55ee..160cafb22 100644 --- a/audio/meter.go +++ b/audio1/meter.go @@ -8,7 +8,7 @@ import ( "sync" "time" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/pulse" ) @@ -23,7 +23,7 @@ type Meter struct { core *pulse.SourceMeter } -//TODO: use pulse.Meter instead of remove pulse.SourceMeter +// TODO: use pulse.Meter instead of remove pulse.SourceMeter func newMeter(id string, core *pulse.SourceMeter, audio *Audio) *Meter { m := &Meter{ id: id, diff --git a/audio/module.go b/audio1/module.go similarity index 100% rename from audio/module.go rename to audio1/module.go diff --git a/audio/port.go b/audio1/port.go similarity index 100% rename from audio/port.go rename to audio1/port.go diff --git a/audio/port_test.go b/audio1/port_test.go similarity index 100% rename from audio/port_test.go rename to audio1/port_test.go diff --git a/audio/priority_manager.go b/audio1/priority_manager.go similarity index 100% rename from audio/priority_manager.go rename to audio1/priority_manager.go diff --git a/audio/priority_old.go b/audio1/priority_old.go similarity index 94% rename from audio/priority_old.go rename to audio1/priority_old.go index e33d55ecc..3989ab8e8 100644 --- a/audio/priority_old.go +++ b/audio1/priority_old.go @@ -62,18 +62,50 @@ func GetPortType(cardName string, portName string) int { return PortTypeMultiChannel } + if contains(cardName, portName, "bluez") || + contains(cardName, portName, "bluetooth") { + return PortTypeBluetooth + } + + if contains(cardName, portName, "linein") || + contains(cardName, portName, "lineout") { + return PortTypeLineIO + } + + if contains(cardName, portName, "usb") || + contains(cardName, portName, "rear-mic") || + contains(cardName, portName, "front-mic") || + contains(cardName, portName, "headset") || + contains(cardName, portName, "headphone") { + return PortTypeHeadset + } + + if contains(cardName, portName, "hdmi") { + return PortTypeHdmi + } + if contains(cardName, portName, "speaker") || contains(cardName, portName, "input-mic") { return PortTypeBuiltin } + return PortTypeUnknown +} + +// 图标类型 扬声器 > 耳机 > HDMI > 蓝牙 +func GetIconPortType(cardName string, portName string) int { + if contains(cardName, portName, "linein") || contains(cardName, portName, "lineout") { return PortTypeLineIO } - if contains(cardName, portName, "usb") || - contains(cardName, portName, "rear-mic") || + if contains(cardName, portName, "speaker") || + contains(cardName, portName, "input-mic") { + return PortTypeBuiltin + } + + if contains(cardName, portName, "rear-mic") || contains(cardName, portName, "front-mic") || contains(cardName, portName, "headset") || contains(cardName, portName, "headphone") { @@ -89,6 +121,10 @@ func GetPortType(cardName string, portName string) int { return PortTypeBluetooth } + if contains(cardName, portName, "usb") { + return PortTypeUsb + } + return PortTypeUnknown } diff --git a/audio/priority_policy.go b/audio1/priority_policy.go similarity index 99% rename from audio/priority_policy.go rename to audio1/priority_policy.go index 8437dfad3..2200c6580 100644 --- a/audio/priority_policy.go +++ b/audio1/priority_policy.go @@ -49,12 +49,9 @@ func DetectPortType(card *pulse.Card, port *pulse.CardPortInfo) int { return PortTypeMultiChannel } - if hasKeyword(stringList, "speaker") || - hasKeyword(stringList, "input-mic") { - if hasKeyword(stringList, "usb") { - return PortTypeUsb - } - return PortTypeBuiltin + if hasKeyword(stringList, "bluez") || + hasKeyword(stringList, "bluetooth") { + return PortTypeBluetooth } if hasKeyword(stringList, "linein") || @@ -77,9 +74,9 @@ func DetectPortType(card *pulse.Card, port *pulse.CardPortInfo) int { return PortTypeHdmi } - if hasKeyword(stringList, "bluez") || - hasKeyword(stringList, "bluetooth") { - return PortTypeBluetooth + if hasKeyword(stringList, "speaker") || + hasKeyword(stringList, "input-mic") { + return PortTypeBuiltin } return PortTypeUnknown diff --git a/audio/priority_test.go b/audio1/priority_test.go similarity index 99% rename from audio/priority_test.go rename to audio1/priority_test.go index 5259b4c11..50163aa69 100644 --- a/audio/priority_test.go +++ b/audio1/priority_test.go @@ -25,7 +25,7 @@ func Test_GetPortType(t *testing.T) { assert.Equal(t, GetPortType("usb.abcd.1234", "world.abcd.1234"), PortTypeHeadset) assert.Equal(t, GetPortType("hbc.abcd.1234", "usb.abcd.1234"), PortTypeHeadset) assert.Equal(t, GetPortType("hello.abcd.speaker", "world.abcd.1234"), PortTypeBuiltin) - assert.Equal(t, GetPortType("hdmi.abcd.speaker", "world.abcd.1234"), PortTypeBuiltin) + assert.Equal(t, GetPortType("hdmi.abcd.speaker", "world.abcd.1234"), PortTypeHdmi) } func Test_IsInputTypeAfter(t *testing.T) { diff --git a/audio/profile.go b/audio1/profile.go similarity index 100% rename from audio/profile.go rename to audio1/profile.go diff --git a/audio/sink.go b/audio1/sink.go similarity index 99% rename from audio/sink.go rename to audio1/sink.go index 4e50eefb8..18e17025d 100644 --- a/audio/sink.go +++ b/audio1/sink.go @@ -9,7 +9,7 @@ import ( "strconv" "sync" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/pulse" ) @@ -184,7 +184,6 @@ func (s *Sink) SetFade(value float64) *dbus.Error { // v: volume音量值 // b: balance左右平衡值 // f: fade前后平衡值 -// func (s *Sink) setVBF(v, b, f float64) *dbus.Error { if !isVolumeValid(v) { return dbusutil.ToError(fmt.Errorf("invalid volume value: %v", v)) diff --git a/audio/sinkinput.go b/audio1/sinkinput.go similarity index 99% rename from audio/sinkinput.go rename to audio1/sinkinput.go index 17e6c9a88..3ef6fa226 100644 --- a/audio/sinkinput.go +++ b/audio1/sinkinput.go @@ -10,7 +10,7 @@ import ( "strings" "sync" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/procfs" "github.com/linuxdeepin/go-lib/pulse" diff --git a/audio/source.go b/audio1/source.go similarity index 99% rename from audio/source.go rename to audio1/source.go index ef0a533b6..0208caea3 100644 --- a/audio/source.go +++ b/audio1/source.go @@ -9,7 +9,7 @@ import ( "strconv" "sync" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/pulse" ) @@ -165,7 +165,6 @@ func (s *Source) SetFade(value float64) *dbus.Error { // v: volume音量值 // b: balance左右平衡值 // f: fade前后平衡值 -// func (s *Source) setVBF(v, b, f float64) *dbus.Error { if v < -1.00 || v > 1.00 { return dbusutil.ToError(fmt.Errorf("invalid volume value: %v", v)) diff --git a/audio/sync_config.go b/audio1/sync_config.go similarity index 97% rename from audio/sync_config.go rename to audio1/sync_config.go index 2e2da4307..79321e355 100644 --- a/audio/sync_config.go +++ b/audio1/sync_config.go @@ -7,8 +7,8 @@ package audio import ( "encoding/json" - dbus "github.com/godbus/dbus" - soundthemeplayer "github.com/linuxdeepin/go-dbus-factory/com.deepin.api.soundthemeplayer" + dbus "github.com/godbus/dbus/v5" + soundthemeplayer "github.com/linuxdeepin/go-dbus-factory/system/com.deepin.api.soundthemeplayer" gio "github.com/linuxdeepin/go-gir/gio-2.0" ) diff --git a/audio/testdata/bluezAudio.json b/audio1/testdata/bluezAudio.json similarity index 100% rename from audio/testdata/bluezAudio.json rename to audio1/testdata/bluezAudio.json diff --git a/audio/util.go b/audio1/util.go similarity index 93% rename from audio/util.go rename to audio1/util.go index 48a073a04..f128b8ae5 100644 --- a/audio/util.go +++ b/audio1/util.go @@ -13,10 +13,10 @@ import ( "strings" "unicode" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-api/soundutils" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" - mpris2 "github.com/linuxdeepin/go-dbus-factory/org.mpris.mediaplayer2" + ofdbus "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.dbus" + mpris2 "github.com/linuxdeepin/go-dbus-factory/session/org.mpris.mediaplayer2" //"github.com/linuxdeepin/go-lib/pulse" ) diff --git a/audio/util_test.go b/audio1/util_test.go similarity index 100% rename from audio/util_test.go rename to audio1/util_test.go diff --git a/bin/backlight_helper/ddcci/ddcci.go b/bin/backlight_helper/ddcci/ddcci.go index 1d10505cb..1277e47a2 100644 --- a/bin/backlight_helper/ddcci/ddcci.go +++ b/bin/backlight_helper/ddcci/ddcci.go @@ -112,10 +112,10 @@ func newDDCCI() (*ddcci, error) { displayHandleMap: make(map[string]*displayHandle), } - status := C.ddca_set_max_tries(C.DDCA_MULTI_PART_TRIES, 5) - if status < C.int(0) { - return nil, fmt.Errorf("brightness: Error setting retries: %d", status) - } + //status := C.ddca_set_max_tries(C.DDCA_MULTI_PART_TRIES, 5) + //if status < C.int(0) { + // return nil, fmt.Errorf("brightness: Error setting retries: %d", status) + //} err := ddc.RefreshDisplays() if err != nil { diff --git a/bin/backlight_helper/ddcci/manager.go b/bin/backlight_helper/ddcci/manager.go index 898153773..1200e5034 100644 --- a/bin/backlight_helper/ddcci/manager.go +++ b/bin/backlight_helper/ddcci/manager.go @@ -8,15 +8,15 @@ import ( "fmt" "sync" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/log" x "github.com/linuxdeepin/go-x11-client" ) const ( - DbusPath = "/com/deepin/daemon/helper/Backlight/DDCCI" - dbusInterface = "com.deepin.daemon.helper.Backlight.DDCCI" + DbusPath = "/org/deepin/dde/BacklightHelper1/DDCCI" + dbusInterface = "org.deepin.dde.BacklightHelper1.DDCCI" ) var logger = log.NewLogger("backlight_helper/ddcci") diff --git a/bin/backlight_helper/main.go b/bin/backlight_helper/main.go index b2b73e65a..783dc46d2 100644 --- a/bin/backlight_helper/main.go +++ b/bin/backlight_helper/main.go @@ -12,7 +12,7 @@ import ( "strings" "time" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/bin/backlight_helper/ddcci" ConfigManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" "github.com/linuxdeepin/go-lib/dbusutil" @@ -22,9 +22,9 @@ import ( //go:generate dbusutil-gen em -type Manager const ( - dbusServiceName = "com.deepin.daemon.helper.Backlight" - dbusPath = "/com/deepin/daemon/helper/Backlight" - dbusInterface = "com.deepin.daemon.helper.Backlight" + dbusServiceName = "org.deepin.dde.BacklightHelper1" + dbusPath = "/org/deepin/dde/BacklightHelper1" + dbusInterface = dbusServiceName configManagerId = "org.desktopspec.ConfigManager" ) diff --git a/bin/dde-authority/authority.go b/bin/dde-authority/authority.go index 219c6a692..176fe4157 100644 --- a/bin/dde-authority/authority.go +++ b/bin/dde-authority/authority.go @@ -5,6 +5,7 @@ package main import ( + "encoding/json" "errors" "fmt" "os" @@ -13,18 +14,21 @@ import ( "sync" "time" - "github.com/godbus/dbus" - accounts "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.accounts" - fprint "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.fprintd" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" + "github.com/godbus/dbus/v5" + accounts "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.accounts1" + fprint "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.fprintd1" + ofdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.dbus" + polkit "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.policykit1" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/pam" + "github.com/linuxdeepin/go-lib/utils" ) //go:generate dbusutil-gen em -type Authority,PAMTransaction,FPrintTransaction const ( - pamConfigDir = "/etc/pam.d" + pamConfigDir = "/etc/pam.d" + polkitActionDoAuthorized = "org.deepin.dde.Authority1.doAuthorized" ) func isPamServiceExist(name string) bool { @@ -43,6 +47,10 @@ type Authority struct { accounts accounts.Accounts } +type PolkitDetail struct { + Message string `json:"message"` +} + func newAuthority(service *dbusutil.Service) *Authority { sysBus := service.Conn() auth := &Authority{ @@ -229,6 +237,68 @@ func (a *Authority) CheckCookie(user, cookie string) (result bool, authToken str return false, "", nil } +func (a *Authority) CheckAuth(sender dbus.Sender, details string) *dbus.Error { + ret, err := checkAuthByPolkit(polkitActionDoAuthorized, details, string(sender)) + if err != nil { + return dbusutil.ToError(err) + } + if !ret.IsAuthorized { + inf, err := getDetailsKey(ret.Details, "polkit.dismissed") + if err == nil { + if dismiss, ok := inf.(string); ok { + if dismiss != "" { + return dbusutil.ToError(errors.New("")) + } + } + } + return dbusutil.ToError(errors.New("policykit authentication failed")) + } + return nil +} + +func checkAuthByPolkit(actionId string, details string, sysBusName string) (ret polkit.AuthorizationResult, err error) { + systemBus, err := dbus.SystemBus() + if err != nil { + return + } + authority := polkit.NewAuthority(systemBus) + subject := polkit.MakeSubject(polkit.SubjectKindSystemBusName) + subject.SetDetail("name", sysBusName) + + var polkitDetail PolkitDetail + err = json.Unmarshal([]byte(details), &polkitDetail) + if err != nil { + return + } + + detail := map[string]string{ + "polkit.message": polkitDetail.Message, + "exAuth": "true", + "exAuthFlags": "1", + } + + ret, err = authority.CheckAuthorization(0, subject, + actionId, detail, + polkit.CheckAuthorizationFlagsAllowUserInteraction, "") + if err != nil { + logger.Warningf("call check auth failed, err: %v", err) + return + } + logger.Debugf("call check auth success, ret: %v", ret) + return +} + +func getDetailsKey(details map[string]dbus.Variant, key string) (interface{}, error) { + result, ok := details[key] + if !ok { + return nil, errors.New("key dont exist in details") + } + if utils.IsInterfaceNil(result) { + return nil, errors.New("result is nil") + } + return result.Value(), nil +} + func (a *Authority) HasCookie(user string) (result bool, busErr *dbus.Error) { a.service.DelayAutoQuit() if user == "" { diff --git a/bin/dde-authority/exported_methods_auto.go b/bin/dde-authority/exported_methods_auto.go index ce057ff5e..5d0f8aa94 100644 --- a/bin/dde-authority/exported_methods_auto.go +++ b/bin/dde-authority/exported_methods_auto.go @@ -8,6 +8,11 @@ import ( func (v *Authority) GetExportedMethods() dbusutil.ExportedMethods { return dbusutil.ExportedMethods{ + { + Name: "CheckAuth", + Fn: v.CheckAuth, + InArgs: []string{"details"}, + }, { Name: "CheckCookie", Fn: v.CheckCookie, diff --git a/bin/dde-authority/fprint_transaction.go b/bin/dde-authority/fprint_transaction.go index 0e460ec34..ca2951a0f 100644 --- a/bin/dde-authority/fprint_transaction.go +++ b/bin/dde-authority/fprint_transaction.go @@ -13,9 +13,9 @@ import ( "time" "unicode/utf8" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/gosexy/gettext" - fprint "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.fprintd" + fprint "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.fprintd1" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/proxy" "github.com/linuxdeepin/go-lib/strv" diff --git a/bin/dde-authority/main.go b/bin/dde-authority/main.go index 1be27bb71..142b0234c 100644 --- a/bin/dde-authority/main.go +++ b/bin/dde-authority/main.go @@ -20,9 +20,9 @@ func init() { } const ( - dbusInterface = "com.deepin.daemon.Authority" + dbusInterface = "org.deepin.dde.Authority1" dbusServiceName = dbusInterface - dbusPath = "/com/deepin/daemon/Authority" + dbusPath = "/org/deepin/dde/Authority1" dbusAgentInterface = dbusInterface + ".Agent" ) diff --git a/bin/dde-authority/pam_transaction.go b/bin/dde-authority/pam_transaction.go index 23aaeada8..094c65568 100644 --- a/bin/dde-authority/pam_transaction.go +++ b/bin/dde-authority/pam_transaction.go @@ -11,7 +11,7 @@ import ( "errors" "sync" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/pam" ) diff --git a/bin/dde-authority/transaction.go b/bin/dde-authority/transaction.go index b35403ff0..3ef1f37fd 100644 --- a/bin/dde-authority/transaction.go +++ b/bin/dde-authority/transaction.go @@ -10,7 +10,7 @@ import ( "strconv" "sync" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" ) diff --git a/bin/dde-greeter-setter/manager.go b/bin/dde-greeter-setter/manager.go index 2eb33b71f..d8588ce04 100644 --- a/bin/dde-greeter-setter/manager.go +++ b/bin/dde-greeter-setter/manager.go @@ -11,7 +11,7 @@ import ( "regexp" "strconv" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/keyfile" "github.com/linuxdeepin/go-lib/procfs" @@ -20,8 +20,8 @@ import ( //go:generate dbusutil-gen em -type Manager const ( - dbusServiceName = "com.deepin.daemon.Greeter" - dbusPath = "/com/deepin/daemon/Greeter" + dbusServiceName = "org.deepin.dde.Greeter1" + dbusPath = "/org/deepin/dde/Greeter1" dbusInterface = dbusServiceName ) diff --git a/bin/dde-lockservice/livecd.go b/bin/dde-lockservice/livecd.go index 1ae11823d..cf0a44ab9 100644 --- a/bin/dde-lockservice/livecd.go +++ b/bin/dde-lockservice/livecd.go @@ -4,32 +4,17 @@ package main -//#include -//#include -//#include -//#include -//#cgo LDFLAGS: -lcrypt -//#cgo CFLAGS: -W -Wall -fstack-protector-all -fPIC -//int is_livecd(const char *username)\ -//{\ -// if (strcmp("deepin", username) != 0) {\ -// return 0;\ -// }\ -// struct spwd *data = getspnam(username);\ -// if (data == NULL || strlen(data->sp_pwdp) == 0) {\ -// return 0;\ -// }\ -// if (strcmp(crypt("", data->sp_pwdp), data->sp_pwdp) != 0) {\ -// return 0;\ -// }\ -// return 1;\ -//} -import "C" -import "unsafe" +import ( + "fmt" + "io/ioutil" + "strings" +) func isInLiveCD(username string) bool { - cName := C.CString(username) - ret := C.is_livecd(cName) - C.free(unsafe.Pointer(cName)) - return (int(ret) == 1) + cmdline, err := ioutil.ReadFile("/proc/cmdline") + if err != nil { + fmt.Println("failed to read /proc/cmdline") + return false + } + return strings.Contains(string(cmdline), "boot=live") } diff --git a/bin/dde-lockservice/manager.go b/bin/dde-lockservice/manager.go index 3d6e8c5e4..4ce9258fd 100644 --- a/bin/dde-lockservice/manager.go +++ b/bin/dde-lockservice/manager.go @@ -13,7 +13,7 @@ import ( "sync" "time" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/msteinert/pam" ) @@ -49,9 +49,9 @@ type Manager struct { } const ( - dbusServiceName = "com.deepin.dde.LockService" - dbusPath = "/com/deepin/dde/LockService" - dbusInterface = "com.deepin.dde.LockService" + dbusServiceName = "org.deepin.dde.LockService1" + dbusPath = "/org/deepin/dde/LockService1" + dbusInterface = dbusServiceName ) var _m *Manager diff --git a/bin/dde-session-daemon/daemon.go b/bin/dde-session-daemon/daemon.go index 99af7a612..bea9575b6 100644 --- a/bin/dde-session-daemon/daemon.go +++ b/bin/dde-session-daemon/daemon.go @@ -10,7 +10,7 @@ import ( "os" "strings" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-api/session" "github.com/linuxdeepin/dde-daemon/calltrace" "github.com/linuxdeepin/dde-daemon/loader" @@ -26,8 +26,8 @@ const ( ProfTypeCPU = "cpu" //nolint ProfTypeMem = "memory" //nolint - dbusPath = "/com/deepin/daemon/Daemon" - dbusServiceName = "com.deepin.daemon.Daemon" + dbusPath = "/org/deepin/dde/Daemon" + dbusServiceName = "org.deepin.dde.Daemon" dbusInterface = dbusServiceName configManagerId = "org.desktopspec.ConfigManager" ) @@ -177,16 +177,13 @@ func (s *SessionDaemon) register(service *dbusutil.Service) error { func (s *SessionDaemon) initModules() { part1ModuleNames := []string{ - "dock", "trayicon", "x-event-monitor", } part2ModuleNames := []string{ - "launcher", "network", "audio", - "appearance", "screensaver", "sessionwatcher", "power", // need screensaver and sessionwatcher @@ -200,12 +197,8 @@ func (s *SessionDaemon) initModules() { "timedate", "bluetooth", "screenedge", - "mime", - //"calendar", - //"miracast", // need network "systeminfo", "lastore", - "eventlog", "calltrace", "debug", } diff --git a/bin/dde-session-daemon/main.go b/bin/dde-session-daemon/main.go index 38d306dc7..b61bbfa3d 100644 --- a/bin/dde-session-daemon/main.go +++ b/bin/dde-session-daemon/main.go @@ -23,12 +23,12 @@ import ( "strings" "time" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-api/soundutils" "github.com/linuxdeepin/dde-api/userenv" "github.com/linuxdeepin/dde-daemon/loader" - soundthemeplayer "github.com/linuxdeepin/go-dbus-factory/com.deepin.api.soundthemeplayer" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + soundthemeplayer "github.com/linuxdeepin/go-dbus-factory/system/com.deepin.api.soundthemeplayer" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil" . "github.com/linuxdeepin/go-lib/gettext" @@ -68,10 +68,10 @@ func allowRun() bool { logger.Warning(err) os.Exit(1) } - sessionManagerObj := systemBus.Object("com.deepin.SessionManager", - "/com/deepin/SessionManager") + sessionManagerObj := systemBus.Object("org.deepin.dde.SessionManager1", + "/org/deepin/dde/SessionManager1") var allowRun bool - err = sessionManagerObj.Call("com.deepin.SessionManager.AllowSessionDaemonRun", + err = sessionManagerObj.Call("org.deepin.dde.SessionManager1.AllowSessionDaemonRun", dbus.FlagNoAutoStart).Store(&allowRun) if err != nil { logger.Warning(err) diff --git a/bin/dde-session-daemon/module.go b/bin/dde-session-daemon/module.go index c49d1a59a..8219237fc 100644 --- a/bin/dde-session-daemon/module.go +++ b/bin/dde-session-daemon/module.go @@ -10,39 +10,31 @@ import ( "github.com/linuxdeepin/dde-daemon/loader" - _ "github.com/linuxdeepin/dde-daemon/appearance" - _ "github.com/linuxdeepin/dde-daemon/audio" - _ "github.com/linuxdeepin/dde-daemon/bluetooth" - _ "github.com/linuxdeepin/dde-daemon/screenedge" - - _ "github.com/linuxdeepin/dde-daemon/mime" + _ "github.com/linuxdeepin/dde-daemon/audio1" + _ "github.com/linuxdeepin/dde-daemon/bluetooth1" + _ "github.com/linuxdeepin/dde-daemon/screenedge1" // depends: network - _ "github.com/linuxdeepin/dde-daemon/systeminfo" - _ "github.com/linuxdeepin/dde-daemon/calltrace" - _ "github.com/linuxdeepin/dde-daemon/clipboard" + _ "github.com/linuxdeepin/dde-daemon/clipboard1" _ "github.com/linuxdeepin/dde-daemon/debug" - _ "github.com/linuxdeepin/dde-daemon/dock" - _ "github.com/linuxdeepin/dde-daemon/gesture" + + _ "github.com/linuxdeepin/dde-daemon/gesture1" _ "github.com/linuxdeepin/dde-daemon/housekeeping" - _ "github.com/linuxdeepin/dde-daemon/inputdevices" - _ "github.com/linuxdeepin/dde-daemon/keybinding" - _ "github.com/linuxdeepin/dde-daemon/lastore" - _ "github.com/linuxdeepin/dde-daemon/launcher" - _ "github.com/linuxdeepin/dde-daemon/mime" - _ "github.com/linuxdeepin/dde-daemon/network" - _ "github.com/linuxdeepin/dde-daemon/screenedge" - _ "github.com/linuxdeepin/dde-daemon/screensaver" + _ "github.com/linuxdeepin/dde-daemon/inputdevices1" + _ "github.com/linuxdeepin/dde-daemon/keybinding1" + _ "github.com/linuxdeepin/dde-daemon/lastore1" + + _ "github.com/linuxdeepin/dde-daemon/network1" + _ "github.com/linuxdeepin/dde-daemon/screensaver1" _ "github.com/linuxdeepin/dde-daemon/service_trigger" - _ "github.com/linuxdeepin/dde-daemon/session/eventlog" - _ "github.com/linuxdeepin/dde-daemon/session/power" - _ "github.com/linuxdeepin/dde-daemon/session/uadpagent" - _ "github.com/linuxdeepin/dde-daemon/sessionwatcher" - _ "github.com/linuxdeepin/dde-daemon/systeminfo" - _ "github.com/linuxdeepin/dde-daemon/timedate" - _ "github.com/linuxdeepin/dde-daemon/trayicon" - _ "github.com/linuxdeepin/dde-daemon/x_event_monitor" + _ "github.com/linuxdeepin/dde-daemon/session/power1" + _ "github.com/linuxdeepin/dde-daemon/session/uadpagent1" + _ "github.com/linuxdeepin/dde-daemon/sessionwatcher1" + _ "github.com/linuxdeepin/dde-daemon/systeminfo1" + _ "github.com/linuxdeepin/dde-daemon/timedate1" + _ "github.com/linuxdeepin/dde-daemon/trayicon1" + _ "github.com/linuxdeepin/dde-daemon/x_event_monitor1" ) var ( diff --git a/bin/dde-system-daemon/bluetooth.go b/bin/dde-system-daemon/bluetooth.go index ff8f1c447..1fa84f77b 100644 --- a/bin/dde-system-daemon/bluetooth.go +++ b/bin/dde-system-daemon/bluetooth.go @@ -8,7 +8,7 @@ import ( "fmt" "path/filepath" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/keyfile" ) diff --git a/bin/dde-system-daemon/gesture.go b/bin/dde-system-daemon/gesture.go index 5ed6a126b..04af07151 100644 --- a/bin/dde-system-daemon/gesture.go +++ b/bin/dde-system-daemon/gesture.go @@ -7,9 +7,9 @@ package main import ( "fmt" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/loader" - "github.com/linuxdeepin/dde-daemon/system/gesture" + "github.com/linuxdeepin/dde-daemon/system/gesture1" ) func (*Daemon) SetLongPressDuration(duration uint32) *dbus.Error { @@ -23,6 +23,6 @@ func (*Daemon) SetLongPressDuration(duration uint32) *dbus.Error { return dbus.NewError(epath, []interface{}{"Not found module 'gesture'"}) } - m.(*gesture.Daemon).SetLongPressDuration(int(duration)) + m.(*gesture1.Daemon).SetLongPressDuration(int(duration)) return nil } diff --git a/bin/dde-system-daemon/main.go b/bin/dde-system-daemon/main.go index 5e9aff3f8..8db3e3647 100644 --- a/bin/dde-system-daemon/main.go +++ b/bin/dde-system-daemon/main.go @@ -8,31 +8,31 @@ import ( "os" // modules: - _ "github.com/linuxdeepin/dde-daemon/accounts" - _ "github.com/linuxdeepin/dde-daemon/apps" - _ "github.com/linuxdeepin/dde-daemon/fprintd" - _ "github.com/linuxdeepin/dde-daemon/image_effect" - _ "github.com/linuxdeepin/dde-daemon/system/airplane_mode" - _ "github.com/linuxdeepin/dde-daemon/system/bluetooth" - _ "github.com/linuxdeepin/dde-daemon/system/display" - _ "github.com/linuxdeepin/dde-daemon/system/gesture" + _ "github.com/linuxdeepin/dde-daemon/accounts1" + _ "github.com/linuxdeepin/dde-daemon/apps1" + _ "github.com/linuxdeepin/dde-daemon/fprintd1" + _ "github.com/linuxdeepin/dde-daemon/image_effect1" + _ "github.com/linuxdeepin/dde-daemon/system/airplane_mode1" + _ "github.com/linuxdeepin/dde-daemon/system/bluetooth1" + _ "github.com/linuxdeepin/dde-daemon/system/display1" + _ "github.com/linuxdeepin/dde-daemon/system/gesture1" _ "github.com/linuxdeepin/dde-daemon/system/hostname" - _ "github.com/linuxdeepin/dde-daemon/system/inputdevices" - _ "github.com/linuxdeepin/dde-daemon/system/keyevent" + _ "github.com/linuxdeepin/dde-daemon/system/inputdevices1" + _ "github.com/linuxdeepin/dde-daemon/system/keyevent1" _ "github.com/linuxdeepin/dde-daemon/system/lang" - _ "github.com/linuxdeepin/dde-daemon/system/network" - _ "github.com/linuxdeepin/dde-daemon/system/power" - _ "github.com/linuxdeepin/dde-daemon/system/power_manager" + _ "github.com/linuxdeepin/dde-daemon/system/network1" + _ "github.com/linuxdeepin/dde-daemon/system/power1" + _ "github.com/linuxdeepin/dde-daemon/system/power_manager1" _ "github.com/linuxdeepin/dde-daemon/system/resource_ctl" _ "github.com/linuxdeepin/dde-daemon/system/scheduler" - _ "github.com/linuxdeepin/dde-daemon/system/swapsched" - _ "github.com/linuxdeepin/dde-daemon/system/systeminfo" - _ "github.com/linuxdeepin/dde-daemon/system/timedated" - _ "github.com/linuxdeepin/dde-daemon/system/uadp" - systemd1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.systemd1" + _ "github.com/linuxdeepin/dde-daemon/system/swapsched1" + _ "github.com/linuxdeepin/dde-daemon/system/systeminfo1" + _ "github.com/linuxdeepin/dde-daemon/system/timedate1" + _ "github.com/linuxdeepin/dde-daemon/system/uadp1" + systemd1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.systemd1" "github.com/linuxdeepin/dde-daemon/loader" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" glib "github.com/linuxdeepin/go-gir/glib-2.0" "github.com/linuxdeepin/go-lib/dbusutil" . "github.com/linuxdeepin/go-lib/gettext" @@ -54,8 +54,8 @@ type Daemon struct { } const ( - dbusServiceName = "com.deepin.daemon.Daemon" - dbusPath = "/com/deepin/daemon/Daemon" + dbusServiceName = "org.deepin.dde.Daemon1" + dbusPath = "/org/deepin/dde/Daemon1" dbusInterface = dbusServiceName ) diff --git a/bin/dde-system-daemon/network.go b/bin/dde-system-daemon/network.go index 9b3bd1912..9f8a56fe9 100644 --- a/bin/dde-system-daemon/network.go +++ b/bin/dde-system-daemon/network.go @@ -10,10 +10,10 @@ import ( "path/filepath" "sort" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" + . "github.com/linuxdeepin/dde-daemon/common/dsync" "github.com/linuxdeepin/go-gir/glib-2.0" "github.com/linuxdeepin/go-lib/dbusutil" - . "github.com/linuxdeepin/dde-daemon/common/dsync" ) const ( diff --git a/bin/dde-system-daemon/plymouth.go b/bin/dde-system-daemon/plymouth.go index 5f3638ea5..d26b10b45 100644 --- a/bin/dde-system-daemon/plymouth.go +++ b/bin/dde-system-daemon/plymouth.go @@ -10,7 +10,7 @@ import ( "os/exec" "sync" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" configManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" "github.com/linuxdeepin/go-lib/dbusutil" ) diff --git a/bin/dde-system-daemon/tty.go b/bin/dde-system-daemon/tty.go index c433c5b59..3322c2d04 100644 --- a/bin/dde-system-daemon/tty.go +++ b/bin/dde-system-daemon/tty.go @@ -12,7 +12,7 @@ import ( "path/filepath" "strings" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/keyfile" "github.com/linuxdeepin/go-lib/procfs" diff --git a/bin/dde-system-daemon/utils.go b/bin/dde-system-daemon/utils.go index 56b2902c1..a257aab2b 100644 --- a/bin/dde-system-daemon/utils.go +++ b/bin/dde-system-daemon/utils.go @@ -7,7 +7,7 @@ package main import ( "fmt" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" ) const ( @@ -52,7 +52,7 @@ func newSettingsBus() (dbus.BusObject, error) { func startBacklightHelperAsync(conn *dbus.Conn) { go func() { - obj := conn.Object("com.deepin.daemon.helper.Backlight", "/com/deepin/daemon/helper/Backlight") + obj := conn.Object("org.deepin.dde.BacklightHelper1", "/org/deepin/dde/BacklightHelper1") err := obj.Call("org.freedesktop.DBus.Peer.Ping", 0).Err if err != nil { diff --git a/bin/dde-system-daemon/virtual.go b/bin/dde-system-daemon/virtual.go index f3006d53a..1e4b1e37f 100644 --- a/bin/dde-system-daemon/virtual.go +++ b/bin/dde-system-daemon/virtual.go @@ -7,7 +7,7 @@ package main import ( "strings" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/keyfile" "github.com/linuxdeepin/go-lib/procfs" @@ -40,8 +40,8 @@ func init() { }() } -//从配置文件读取支持App的关键字段 -//当获取不到"/usr/share/dde-daemon/supportVirsConf.ini"数据的时候,使用默认值 +// 从配置文件读取支持App的关键字段 +// 当获取不到"/usr/share/dde-daemon/supportVirsConf.ini"数据的时候,使用默认值 func readSupConfigFile(key, value string) []string { kf := keyfile.NewKeyFile() err := kf.LoadFromFile(supportVirsConf) @@ -79,7 +79,7 @@ func getValidSupData(supApps []string) []string { return ret } -//获取App二进制名称,将exe和cmdline拼接成一个string +// 获取App二进制名称,将exe和cmdline拼接成一个string func getActivePidInfo(pid uint32) (execPath string, err error) { value := procfs.Process(pid) execPath, err = value.Exe() @@ -99,7 +99,7 @@ func getActivePidInfo(pid uint32) (execPath string, err error) { return strings.ToLower(execPath), err } -//判断是否是虚拟机 +// 判断是否是虚拟机 func isVirtual(exe string, supApps []string) bool { for _, vir := range supApps { //exe中是否包含,去掉空格的虚拟机相关字段 diff --git a/bin/dde-system-daemon/wallpaper.go b/bin/dde-system-daemon/wallpaper.go index 322ee360c..00057a3d9 100644 --- a/bin/dde-system-daemon/wallpaper.go +++ b/bin/dde-system-daemon/wallpaper.go @@ -17,7 +17,8 @@ import ( "strings" "sync" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" + polkit "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.policykit1" "github.com/linuxdeepin/go-lib/dbusutil" dutils "github.com/linuxdeepin/go-lib/utils" ) @@ -27,6 +28,7 @@ const maxSize = 32 * 1024 * 1024 const wallPaperDir = "/usr/share/wallpapers/custom-wallpapers/" const solidWallPaperPath = "/usr/share/wallpapers/custom-solidwallpapers/" const solidPrefix = "solid::" +const polkitActionUserAdministration = "org.deepin.dde.accounts1.user-administration" var wallPaperDirs = []string{ wallPaperDir, @@ -119,6 +121,76 @@ func DeleteWallPaper(username string, file string) error { var wallpaperMutex sync.Mutex +func checkAuth(actionId string, sysBusName string) error { + ret, err := checkAuthByPolkit(actionId, sysBusName) + if err != nil { + return err + } + if !ret.IsAuthorized { + inf, err := getDetailsKey(ret.Details, "polkit.dismissed") + if err == nil { + if dismiss, ok := inf.(string); ok { + if dismiss != "" { + return errors.New("") + } + } + } + return fmt.Errorf("Policykit authentication failed") + } + return nil +} + +func checkAuthByPolkit(actionId string, sysBusName string) (ret polkit.AuthorizationResult, err error) { + systemBus, err := dbus.SystemBus() + if err != nil { + return + } + authority := polkit.NewAuthority(systemBus) + subject := polkit.MakeSubject(polkit.SubjectKindSystemBusName) + subject.SetDetail("name", sysBusName) + + ret, err = authority.CheckAuthorization(0, subject, + actionId, nil, + polkit.CheckAuthorizationFlagsAllowUserInteraction, "") + if err != nil { + logger.Warningf("call check auth failed, err: %v", err) + return + } + logger.Debugf("call check auth success, ret: %v", ret) + return +} + +func getDetailsKey(details map[string]dbus.Variant, key string) (interface{}, error) { + result, ok := details[key] + if !ok { + return nil, errors.New("key dont exist in details") + } + if dutils.IsInterfaceNil(result) { + return nil, errors.New("result is nil") + } + return result.Value(), nil +} + +func (d *Daemon) isSelf(sender dbus.Sender, username string) error { + uid, err := d.service.GetConnUID(string(sender)) + if err != nil { + return dbusutil.ToError(err) + } + user, err := user.LookupId(strconv.Itoa(int(uid))) + if err != nil { + return dbusutil.ToError(err) + } + if user.Username != username { + err = fmt.Errorf("%s not allowed to delete %s custom wallpaper", user.Username, username) + return dbusutil.ToError(err) + } + return nil +} + +func (d *Daemon) checkAuth(sender dbus.Sender) error { + return checkAuth(polkitActionUserAdministration, string(sender)) +} + func (d *Daemon) SaveCustomWallPaper(sender dbus.Sender, username string, file string) (string, *dbus.Error) { var err error var isSolid bool = false @@ -214,7 +286,19 @@ func (d *Daemon) SaveCustomWallPaper(sender dbus.Sender, username string, file s return destFile, dbusutil.ToError(err) } -func (*Daemon) DeleteCustomWallPaper(username string, file string) *dbus.Error { +func (d *Daemon) DeleteCustomWallPaper(sender dbus.Sender, username string, file string) *dbus.Error { + err := d.isSelf(sender, username) + if err != nil { + logger.Warning(err) + + err = d.checkAuth(sender) + if err != nil { + return dbusutil.ToError(err) + } else { + return dbusutil.ToError(DeleteWallPaper(username, file)) + } + } + return dbusutil.ToError(DeleteWallPaper(username, file)) } diff --git a/bin/default-file-manager/main.c b/bin/default-file-manager/main.c deleted file mode 100644 index 61632c69a..000000000 --- a/bin/default-file-manager/main.c +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include - -#define FILE_MANAGER_MIME_TYPE "inode/directory" - -/** - * Open default file manager via mime type - * Some file managers custom the directory by user - **/ -int -main(int argc, char *argv[]) -{ - GAppInfo *app_info = g_app_info_get_default_for_type(FILE_MANAGER_MIME_TYPE, FALSE); - if (!app_info) { - g_error("Failed to get default app for %s", FILE_MANAGER_MIME_TYPE); - return -1; - } - g_debug("Executable: %s\n", g_app_info_get_executable(app_info)); - g_debug("Commandline: %s\n", g_app_info_get_commandline(app_info)); - - GError *error = NULL; - gboolean ret = g_app_info_launch(app_info, NULL, NULL, &error); - if (error) { - g_error("Failed to launch %s, error: %s", g_app_info_get_name(app_info), error->message); - g_error_free(error); - goto EXIT; - } - -EXIT: - g_object_unref(app_info); - return ret?0:-1; -} diff --git a/bin/default-file-manager/main.go b/bin/default-file-manager/main.go new file mode 100644 index 000000000..b2e4f8043 --- /dev/null +++ b/bin/default-file-manager/main.go @@ -0,0 +1,105 @@ +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +package main + +import ( + "errors" + "log" + "os/user" + "path/filepath" + "strings" + + dbus "github.com/godbus/dbus/v5" + appmanager "github.com/linuxdeepin/go-dbus-factory/session/org.desktopspec.applicationmanager1" + "github.com/linuxdeepin/go-gir/gio-2.0" + "github.com/linuxdeepin/go-lib/appinfo/desktopappinfo" + "github.com/linuxdeepin/go-lib/dbusutil" +) + +const ( + appManagerDBusServiceName = "org.desktopspec.ApplicationManager1" + appManagerDBusPath = "/org/desktopspec/ApplicationManager1" +) + +const ( + fileManagerMimeType = "inode/directory" +) + +func init() { + log.SetFlags(log.Lshortfile) +} + +func queryAppDesktopByMime() (string, error) { + appInfo := gio.AppInfoGetDefaultForType(fileManagerMimeType, false) + if appInfo == nil { + return "", errors.New("failed to get appInfo") + } + + defer appInfo.Unref() + + dAppInfo := gio.ToDesktopAppInfo(appInfo) + + return strings.TrimSpace(filepath.Base(dAppInfo.GetFilename())), nil +} + +func main() { + sessionBus, err := dbus.SessionBus() + if err != nil { + log.Fatal(err) + } + + session, err := dbusutil.NewSessionService() + if err != nil { + log.Fatal(err) + } + + has, err := session.NameHasOwner(appManagerDBusServiceName) + if err != nil { + log.Println("warning: call name has owner error:", err) + } + + if has { + var dBusObjPath dbus.ObjectPath + var mimeType string + + mimeManagerAppObj := appmanager.NewMimeManager(sessionBus) + + if mimeManagerAppObj != nil { + cur, err := user.Current() + if err != nil { + log.Fatal(err) + } + + mimeType, dBusObjPath, err = mimeManagerAppObj.QueryDefaultApplication(0, cur.HomeDir) + if err != nil { + log.Println("warning: query default application error:", err) + } + } + + if mimeType != fileManagerMimeType || dBusObjPath == "/" { + log.Println("warning: can not get default file manager from AM, query from xdg-mime:", err) + appDesktop, err := queryAppDesktopByMime() + if err != nil { + log.Fatal(err) + } + + dBusObjPath, err = desktopappinfo.GetDBusObjectFromAppDesktop(appDesktop, appManagerDBusServiceName, appManagerDBusPath) + if err != nil { + log.Println("warning: get dbus object path error:", err) + log.Fatal(err) + } + } + + appManagerAppObj, err := appmanager.NewApplication(sessionBus, dBusObjPath) + if err != nil { + log.Println("warning: new appManager error:", err) + } + + _, err = appManagerAppObj.Launch(0, "", []string{}, make(map[string]dbus.Variant)) + if err != nil { + log.Println("warning: launch app error:", err) + } + } +} diff --git a/bin/default-terminal/main.go b/bin/default-terminal/main.go index 5b21ed754..16418655f 100644 --- a/bin/default-terminal/main.go +++ b/bin/default-terminal/main.go @@ -9,11 +9,12 @@ import ( "os" "os/exec" - "github.com/godbus/dbus" - sessionmanager "github.com/linuxdeepin/go-dbus-factory/com.deepin.sessionmanager" - "github.com/linuxdeepin/dde-daemon/mime" - "github.com/linuxdeepin/go-gir/gio-2.0" + "github.com/godbus/dbus/v5" + appmanager "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.application1" + newAppmanager "github.com/linuxdeepin/go-dbus-factory/session/org.desktopspec.applicationmanager1" + gio "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/appinfo/desktopappinfo" + "github.com/linuxdeepin/go-lib/dbusutil" ) const ( @@ -22,6 +23,30 @@ const ( gsKeyExec = "exec" ) +const ( + appManagerDBusServiceName = "org.desktopspec.ApplicationManager1" + appManagerDBusPath = "/org/desktopspec/ApplicationManager1" +) + +var terms = []string{ + "deepin-terminal", + "gnome-terminal", + "terminator", + "xfce4-terminal", + "rxvt", + "xterm", +} + +func getPresetTerminalPath() string { + for _, exe := range terms { + file, _ := exec.LookPath(exe) + if file != "" { + return file + } + } + return "" +} + func init() { log.SetFlags(log.Lshortfile) } @@ -39,17 +64,47 @@ func main() { if err != nil { log.Fatal(err) } - startManager := sessionmanager.NewStartManager(sessionBus) - filename := appInfo.GetFileName() + workDir, err := os.Getwd() if err != nil { log.Println("warning: failed to get work dir:", err) } + options := map[string]dbus.Variant{ "path": dbus.MakeVariant(workDir), } - err = startManager.LaunchAppWithOptions(0, filename, 0, - nil, options) + + session, err := dbusutil.NewSessionService() + if err != nil { + log.Fatal(err) + } + + has, err := session.NameHasOwner(appManagerDBusServiceName) + if err != nil { + log.Println("warning: call name has owner error:", err) + + } + if has { + obj, err := desktopappinfo.GetDBusObjectFromAppDesktop(appId, appManagerDBusServiceName, appManagerDBusPath) + if err != nil { + log.Println("warning: get dbus object error:", err) + } + + appManagerAppObj, err := newAppmanager.NewApplication(sessionBus, obj) + if err != nil { + log.Println("warning: new appManager error:", err) + } + + _, err = appManagerAppObj.Launch(0, "", []string{}, options) + if err != nil { + log.Println("warning: launch app error:", err) + } + } else { + appManager := appmanager.NewManager(sessionBus) + err = appManager.LaunchAppWithOptions(0, appInfo.GetFileName(), 0, + nil, options) + } + if err != nil { log.Println(err) runFallbackTerm() @@ -63,7 +118,7 @@ func main() { termPath, _ := exec.LookPath(termExec) if termPath == "" { // try again - termPath = mime.GetPresetTerminalPath() + termPath = getPresetTerminalPath() if termPath == "" { log.Fatal("failed to get terminal path") } @@ -81,12 +136,12 @@ func main() { } func runFallbackTerm() { - termPath := mime.GetPresetTerminalPath() + termPath := getPresetTerminalPath() if termPath == "" { log.Println("failed to get terminal path") return } - cmd := exec.Command(termPath) // #nosec G204 + cmd := exec.Command(termPath) // #nosec G204 cmd.Stderr = os.Stderr cmd.Stdout = os.Stdout err := cmd.Run() diff --git a/bin/langselector/main.go b/bin/langselector/main.go index f18a36461..459f36d23 100644 --- a/bin/langselector/main.go +++ b/bin/langselector/main.go @@ -5,8 +5,8 @@ package main import ( + "github.com/linuxdeepin/dde-daemon/langselector1" "github.com/linuxdeepin/go-lib/gettext" - "github.com/linuxdeepin/dde-daemon/langselector" ) func main() { diff --git a/bin/search/ifc.go b/bin/search/ifc.go index ecef3a03c..c0718faa3 100644 --- a/bin/search/ifc.go +++ b/bin/search/ifc.go @@ -7,7 +7,7 @@ package main import ( "path" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/pinyin" dutils "github.com/linuxdeepin/go-lib/utils" ) diff --git a/bin/search/main.go b/bin/search/main.go index cc08d2f7b..fdb623c20 100644 --- a/bin/search/main.go +++ b/bin/search/main.go @@ -20,9 +20,9 @@ type Manager struct { } const ( - dbusServiceName = "com.deepin.daemon.Search" - dbusPath = "/com/deepin/daemon/Search" - dbusInterface = "com.deepin.daemon.Search" + dbusServiceName = "org.deepin.dde.Search1" + dbusPath = "/org/deepin/dde/Search1" + dbusInterface = dbusServiceName ) var ( diff --git a/bin/soundeffect/main.go b/bin/soundeffect/main.go index bc7083bea..fa3670cdd 100644 --- a/bin/soundeffect/main.go +++ b/bin/soundeffect/main.go @@ -5,7 +5,7 @@ package main import ( - "github.com/linuxdeepin/dde-daemon/soundeffect" + "github.com/linuxdeepin/dde-daemon/soundeffect1" ) func main() { diff --git a/bin/theme-thumb-tool/main.go b/bin/theme-thumb-tool/main.go deleted file mode 100644 index 36e1b05f9..000000000 --- a/bin/theme-thumb-tool/main.go +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package main - -import ( - "flag" - "fmt" - "os" - "path" - - dutils "github.com/linuxdeepin/go-lib/utils" -) - -const ( - TypeAll = "all" - TypeGtk = "gtk" - TypeIcon = "icon" - TypeCursor = "cursor" - TypeBackground = "background" - - forceFlagUsage = "Force generate thumbnails" - destDirUsage = "Thumbnails output directory" -) - -var _forceFlag bool -var _destDir string - -func init() { - flag.BoolVar(&_forceFlag, "force", false, forceFlagUsage) - flag.BoolVar(&_forceFlag, "f", false, forceFlagUsage) - flag.StringVar(&_destDir, "output", "", destDirUsage) - flag.StringVar(&_destDir, "o", "", destDirUsage) -} - -func main() { - flag.Usage = usage - flag.Parse() - - thumbType := flag.Arg(0) - var thumbFiles []string - switch thumbType { - case TypeAll: - thumbFiles = genAllThumbnails(_forceFlag) - case TypeGtk: - thumbFiles = genGtkThumbnails(_forceFlag) - case TypeIcon: - thumbFiles = genIconThumbnails(_forceFlag) - case TypeCursor: - thumbFiles = genCursorThumbnails(_forceFlag) - case TypeBackground: - thumbFiles = genBgThumbnails(_forceFlag) - default: - usage() - } - moveThumbFiles(thumbFiles) -} - -func usage() { - fmt.Println("Desc:") - fmt.Println("\ttheme-thumb-tool - gtk/icon/cursor/background thumbnail batch generator") - fmt.Println("Usage:") - fmt.Println("\ttheme-thumb-tool [Option] [Type]") - fmt.Println("Option:") - fmt.Println("\t-f --force: force to generate thumbnail regardless of file exist") - fmt.Println("\t-o --output: thumbnails output directory") - fmt.Println("Type:") - fmt.Println("\tall: generate all of the following types thumbnails") - fmt.Println("\tgtk: generate all gtk theme thumbnails") - fmt.Println("\ticon: generate all icon theme thumbnails") - fmt.Println("\tcursor: generate all cursor theme thumbnails") - fmt.Println("\tbackground: generate all background thumbnails") - - os.Exit(0) -} - -func moveThumbFiles(files []string) { - if len(_destDir) == 0 { - return - } - - err := os.MkdirAll(_destDir, 0755) - if err != nil { - _, _ = fmt.Fprintf(os.Stderr, "create %q failed: %v\n", _destDir, err) - return - } - for _, file := range files { - dest := path.Join(_destDir, path.Base(file)) - if !_forceFlag && dutils.IsFileExist(dest) { - continue - } - err = dutils.CopyFile(file, dest) - if err != nil { - _, _ = fmt.Fprintf(os.Stderr, "copy file %q to %q failed: %v\n", file, dest, err) - continue - } - err = os.Remove(file) - if err != nil { - _, _ = fmt.Fprintf(os.Stderr, "delete file %q failed: %v\n", file, err) - } - } -} diff --git a/bin/theme-thumb-tool/main_test.go b/bin/theme-thumb-tool/main_test.go deleted file mode 100644 index e88693269..000000000 --- a/bin/theme-thumb-tool/main_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package main - -import ( - "path/filepath" - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_moveThumbFiles(t *testing.T) { - type args struct { - files []string - } - tests := []struct { - name string - args args - dest string - }{ - { - name: "moveThumbFiles", - args: args{ - files: []string{ - "./testdata/moveThumbFiles/source1/f1", - }, - }, - dest: "./testdata/moveThumbFiles/dest1", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - _destDir = tt.dest - moveThumbFiles(tt.args.files) - - for _, f := range tt.args.files { - assert.FileExists(t, filepath.Join(tt.dest, filepath.Base(f))) - } - }) - } -} diff --git a/bin/theme-thumb-tool/testdata/moveThumbFiles/source1/f1 b/bin/theme-thumb-tool/testdata/moveThumbFiles/source1/f1 deleted file mode 100644 index e69de29bb..000000000 diff --git a/bin/theme-thumb-tool/thumbnail.go b/bin/theme-thumb-tool/thumbnail.go deleted file mode 100644 index 32c8f0c6f..000000000 --- a/bin/theme-thumb-tool/thumbnail.go +++ /dev/null @@ -1,126 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package main - -import ( - "fmt" - "io/ioutil" - "math/rand" - "path" - "time" - - "github.com/linuxdeepin/go-lib/graphic" - "github.com/linuxdeepin/dde-api/themes" - "github.com/linuxdeepin/dde-api/thumbnails/cursor" - "github.com/linuxdeepin/dde-api/thumbnails/gtk" - "github.com/linuxdeepin/dde-api/thumbnails/icon" - "github.com/linuxdeepin/dde-api/thumbnails/images" - "github.com/linuxdeepin/dde-daemon/appearance/background" -) - -const ( - thumbBgDir = "/var/cache/appearance/thumbnail/background" - - defaultWidth = 128 - defaultHeight = 72 -) - -func genAllThumbnails(force bool) []string { - var ret []string - ret = append(ret, genGtkThumbnails(force)...) - ret = append(ret, genIconThumbnails(force)...) - ret = append(ret, genCursorThumbnails(force)...) - ret = append(ret, genBgThumbnails(force)...) - return ret -} - -func genGtkThumbnails(force bool) []string { - var ret []string - list := themes.ListGtkTheme() - for _, v := range list { - thumb, err := gtk.ThumbnailForTheme(path.Join(v, "index.theme"), - getThumbBg(), defaultWidth, defaultHeight, force) - if err != nil { - fmt.Printf("Gen '%s' thumbnail failed: %v\n", v, err) - continue - } - ret = append(ret, thumb) - } - return ret -} - -func genIconThumbnails(force bool) []string { - var ret []string - list := themes.ListIconTheme() - for _, v := range list { - thumb, err := icon.ThumbnailForTheme(path.Join(v, "index.theme"), - getThumbBg(), defaultWidth, defaultHeight, force) - if err != nil { - fmt.Printf("Gen '%s' thumbnail failed: %v\n", v, err) - continue - } - ret = append(ret, thumb) - } - return ret -} - -func genCursorThumbnails(force bool) []string { - var ret []string - list := themes.ListCursorTheme() - for _, v := range list { - thumb, err := cursor.ThumbnailForTheme(path.Join(v, "cursor.theme"), - getThumbBg(), defaultWidth, defaultHeight, force) - if err != nil { - fmt.Printf("Gen '%s' thumbnail failed: %v\n", v, err) - continue - } - ret = append(ret, thumb) - } - return ret -} - -func genBgThumbnails(force bool) []string { - var ret []string - infos := background.ListBackground() - for _, info := range infos { - thumb, err := images.ThumbnailForTheme(info.Id, - defaultWidth, defaultHeight, force) - if err != nil { - fmt.Printf("Gen '%s' thumbnail failed: %v\n", info.Id, err) - continue - } - ret = append(ret, thumb) - } - return ret -} - -func getThumbBg() string { - var imgs = getImagesInDir() - if len(imgs) == 0 { - return "" - } - - rand.Seed(time.Now().UnixNano()) - // #nosec G404 - idx := rand.Intn(len(imgs)) - return imgs[idx] -} - -func getImagesInDir() []string { - finfos, err := ioutil.ReadDir(thumbBgDir) - if err != nil { - return nil - } - - var imgs []string - for _, finfo := range finfos { - tmp := path.Join(thumbBgDir, finfo.Name()) - if !graphic.IsSupportedImage(tmp) { - continue - } - imgs = append(imgs, tmp) - } - return imgs -} diff --git a/bin/user-config/config_datas.go b/bin/user-config/config_datas.go index e37a57707..4365c1c63 100644 --- a/bin/user-config/config_datas.go +++ b/bin/user-config/config_datas.go @@ -13,9 +13,9 @@ import ( "regexp" "strings" + "github.com/linuxdeepin/dde-daemon/accounts1/users" "github.com/linuxdeepin/go-lib/archive" dutils "github.com/linuxdeepin/go-lib/utils" - "github.com/linuxdeepin/dde-daemon/accounts/users" ) const ( diff --git a/bluetooth/adapter.go b/bluetooth1/adapter.go similarity index 98% rename from bluetooth/adapter.go rename to bluetooth1/adapter.go index f748d800e..dc64af93d 100644 --- a/bluetooth/adapter.go +++ b/bluetooth1/adapter.go @@ -8,7 +8,7 @@ import ( "encoding/json" "sync" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" ) type AdapterInfo struct { diff --git a/bluetooth/agent.go b/bluetooth1/agent.go similarity index 70% rename from bluetooth/agent.go rename to bluetooth1/agent.go index c6d9ff781..cab5169c6 100644 --- a/bluetooth/agent.go +++ b/bluetooth1/agent.go @@ -14,14 +14,14 @@ import ( "github.com/linuxdeepin/go-lib/strv" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" btcommon "github.com/linuxdeepin/dde-daemon/common/bluetooth" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/gettext" ) const ( - sessionAgentInterface = "com.deepin.system.Bluetooth.Agent" + sessionAgentInterface = "org.deepin.dde.Bluetooth1.Agent" ) type authorize struct { @@ -46,19 +46,20 @@ func (*agent) GetInterfaceName() string { /*****************************************************************************/ -//Release method gets called when the service daemon unregisters the agent. -//An agent can use it to do cleanup tasks. There is no need to unregister the -//agent, because when this method gets called it has already been unregistered. +// Release method gets called when the service daemon unregisters the agent. +// An agent can use it to do cleanup tasks. There is no need to unregister the +// agent, because when this method gets called it has already been unregistered. func (a *agent) Release() *dbus.Error { logger.Info("dbus call agent Release") return nil } -//RequestPinCode method gets called when the service daemon needs to get the passkey for an authentication. -//The return value should be a string of 1-16 characters length. The string can be alphanumeric. -//Possible errors: org.bluez.Error.Rejected -// org.bluez.Error.Canceled +// RequestPinCode method gets called when the service daemon needs to get the passkey for an authentication. +// The return value should be a string of 1-16 characters length. The string can be alphanumeric. +// Possible errors: org.bluez.Error.Rejected +// +// org.bluez.Error.Canceled func (a *agent) RequestPinCode(device dbus.ObjectPath) (pinCode string, busErr *dbus.Error) { logger.Infof("dbus call agent RequestPinCode with device %v", device) @@ -71,15 +72,16 @@ func (a *agent) RequestPinCode(device dbus.ObjectPath) (pinCode string, busErr * return auth.key, nil } -//DisplayPinCode method gets called when the service daemon needs to display a pincode for an authentication. -//An empty reply should be returned. When the pincode needs no longer to be displayed, the Cancel method -//of the agent will be called. This is used during the pairing process of keyboards that don't support -//Bluetooth 2.1 Secure Simple Pairing, in contrast to DisplayPasskey which is used for those that do. -//This method will only ever be called once since older keyboards do not support typing notification. -//Note that the PIN will always be a 6-digit number, zero-padded to 6 digits. This is for harmony with -//the later specification. -//Possible errors: org.bluez.Error.Rejected -// org.bluez.Error.Canceled +// DisplayPinCode method gets called when the service daemon needs to display a pincode for an authentication. +// An empty reply should be returned. When the pincode needs no longer to be displayed, the Cancel method +// of the agent will be called. This is used during the pairing process of keyboards that don't support +// Bluetooth 2.1 Secure Simple Pairing, in contrast to DisplayPasskey which is used for those that do. +// This method will only ever be called once since older keyboards do not support typing notification. +// Note that the PIN will always be a 6-digit number, zero-padded to 6 digits. This is for harmony with +// the later specification. +// Possible errors: org.bluez.Error.Rejected +// +// org.bluez.Error.Canceled func (a *agent) DisplayPinCode(device dbus.ObjectPath, pinCode string) *dbus.Error { logger.Infof("dbus call agent DisplayPinCode with device %v and pinCode %s", device, pinCode) @@ -93,10 +95,11 @@ func (a *agent) DisplayPinCode(device dbus.ObjectPath, pinCode string) *dbus.Err return nil } -//RequestPasskey method gets called when the service daemon needs to get the passkey for an authentication. -//The return value should be a numeric value between 0-999999. -//Possible errors: org.bluez.Error.Rejected -// org.bluez.Error.Canceled +// RequestPasskey method gets called when the service daemon needs to get the passkey for an authentication. +// The return value should be a numeric value between 0-999999. +// Possible errors: org.bluez.Error.Rejected +// +// org.bluez.Error.Canceled func (a *agent) RequestPasskey(device dbus.ObjectPath) (passkey uint32, busErr *dbus.Error) { logger.Infof("dbus call agent RequestPasskey with device %v", device) @@ -115,13 +118,13 @@ func (a *agent) RequestPasskey(device dbus.ObjectPath) (passkey uint32, busErr * return passkey, nil } -//DisplayPasskey method gets called when the service daemon needs to display a passkey for an authentication. -//The entered parameter indicates the number of already typed keys on the remote side. -//An empty reply should be returned. When the passkey needs no longer to be displayed, the Cancel method -//of the agent will be called. -//During the pairing process this method might be called multiple times to update the entered value. -//Note that the passkey will always be a 6-digit number, so the display should be zero-padded at the start if -//the value contains less than 6 digits. +// DisplayPasskey method gets called when the service daemon needs to display a passkey for an authentication. +// The entered parameter indicates the number of already typed keys on the remote side. +// An empty reply should be returned. When the passkey needs no longer to be displayed, the Cancel method +// of the agent will be called. +// During the pairing process this method might be called multiple times to update the entered value. +// Note that the passkey will always be a 6-digit number, so the display should be zero-padded at the start if +// the value contains less than 6 digits. func (a *agent) DisplayPasskey(device dbus.ObjectPath, passkey uint32, entered uint16) *dbus.Error { logger.Infof("dbus call agent DisplayPasskey with device %v,passkey %d and entered %d", device, passkey, entered) @@ -136,12 +139,13 @@ func (a *agent) DisplayPasskey(device dbus.ObjectPath, passkey uint32, entered u return nil } -//RequestConfirmation This method gets called when the service daemon needs to confirm a passkey for an authentication. -//To confirm the value it should return an empty reply or an error in case the passkey is invalid. -//Note that the passkey will always be a 6-digit number, so the display should be zero-padded at the start if -//the value contains less than 6 digits. -//Possible errors: org.bluez.Error.Rejected -// org.bluez.Error.Canceled +// RequestConfirmation This method gets called when the service daemon needs to confirm a passkey for an authentication. +// To confirm the value it should return an empty reply or an error in case the passkey is invalid. +// Note that the passkey will always be a 6-digit number, so the display should be zero-padded at the start if +// the value contains less than 6 digits. +// Possible errors: org.bluez.Error.Rejected +// +// org.bluez.Error.Canceled func (a *agent) RequestConfirmation(device dbus.ObjectPath, passkey uint32) *dbus.Error { logger.Infof("dbus call agent RequestConfirmation with device %v and passkey %d", device, passkey) @@ -156,12 +160,13 @@ func (a *agent) RequestConfirmation(device dbus.ObjectPath, passkey uint32) *dbu return nil } -//RequestAuthorization This method gets called to request the user to authorize an incoming pairing attempt -//which would in other circumstances trigger the just-works model, or when the user plugged in a device that -//implements cable pairing. In the latter case, the device would not be connected to the adapter via Bluetooth yet. -//Just-Works 配对适用于点击智能手机/计算机和蓝牙设备上的按钮以启动配对而无需输入密钥。 -//Possible errors: org.bluez.Error.Rejected -// org.bluez.Error.Canceled +// RequestAuthorization This method gets called to request the user to authorize an incoming pairing attempt +// which would in other circumstances trigger the just-works model, or when the user plugged in a device that +// implements cable pairing. In the latter case, the device would not be connected to the adapter via Bluetooth yet. +// Just-Works 配对适用于点击智能手机/计算机和蓝牙设备上的按钮以启动配对而无需输入密钥。 +// Possible errors: org.bluez.Error.Rejected +// +// org.bluez.Error.Canceled func (a *agent) RequestAuthorization(device dbus.ObjectPath) *dbus.Error { logger.Infof("dbus call agent RequestAuthorization with device %v", device) @@ -174,9 +179,10 @@ func (a *agent) RequestAuthorization(device dbus.ObjectPath) *dbus.Error { return nil } -//AuthorizeService method gets called when the service daemon needs to authorize a connection/service request. -//Possible errors: org.bluez.Error.Rejected -// org.bluez.Error.Canceled +// AuthorizeService method gets called when the service daemon needs to authorize a connection/service request. +// Possible errors: org.bluez.Error.Rejected +// +// org.bluez.Error.Canceled func (a *agent) AuthorizeService(device dbus.ObjectPath, uuid string) *dbus.Error { logger.Infof("dbus call agent AuthorizeService with device %v and uuid %s", device, uuid) @@ -184,7 +190,7 @@ func (a *agent) AuthorizeService(device dbus.ObjectPath, uuid string) *dbus.Erro return nil } -//Cancel method gets called to indicate that the agent request failed before a reply was returned. +// Cancel method gets called to indicate that the agent request failed before a reply was returned. func (a *agent) Cancel() *dbus.Error { logger.Info("dbus call agent Cancel") diff --git a/bluetooth/bluetooth.go b/bluetooth1/bluetooth.go similarity index 97% rename from bluetooth/bluetooth.go rename to bluetooth1/bluetooth.go index 9054982fb..f92ccbcf5 100644 --- a/bluetooth/bluetooth.go +++ b/bluetooth1/bluetooth.go @@ -8,19 +8,20 @@ import ( "encoding/json" "errors" "fmt" + "os" "strings" "sync" "time" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" btcommon "github.com/linuxdeepin/dde-daemon/common/bluetooth" - airplanemode "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.airplanemode" - audio "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.audio" - sysbt "github.com/linuxdeepin/go-dbus-factory/com.deepin.system.bluetooth" - obex "github.com/linuxdeepin/go-dbus-factory/org.bluez.obex" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" - mpris2 "github.com/linuxdeepin/go-dbus-factory/org.mpris.mediaplayer2" + audio "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.audio1" + mpris2 "github.com/linuxdeepin/go-dbus-factory/session/org.mpris.mediaplayer2" + obex "github.com/linuxdeepin/go-dbus-factory/system/org.bluez.obex" + airplanemode "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.airplanemode1" + sysbt "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.bluetooth1" + ofdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.dbus" gio "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/gsprop" @@ -28,8 +29,8 @@ import ( ) const ( - dbusServiceName = "com.deepin.daemon.Bluetooth" - dbusPath = "/com/deepin/daemon/Bluetooth" + dbusServiceName = "org.deepin.dde.Bluetooth1" + dbusPath = "/org/deepin/dde/Bluetooth1" dbusInterface = dbusServiceName configManagerId = "org.desktopspec.ConfigManager" ) diff --git a/bluetooth/bluetooth_dbusutil.go b/bluetooth1/bluetooth_dbusutil.go similarity index 100% rename from bluetooth/bluetooth_dbusutil.go rename to bluetooth1/bluetooth_dbusutil.go diff --git a/bluetooth/bluetooth_ifc.go b/bluetooth1/bluetooth_ifc.go similarity index 93% rename from bluetooth/bluetooth_ifc.go rename to bluetooth1/bluetooth_ifc.go index 0ee0772ff..b0c17cdb9 100644 --- a/bluetooth/bluetooth_ifc.go +++ b/bluetooth1/bluetooth_ifc.go @@ -10,7 +10,7 @@ import ( "fmt" "time" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" ) @@ -249,7 +249,7 @@ func (b *Bluetooth) SetAdapterDiscoverableTimeout(adapter dbus.ObjectPath, return nil } -//Confirm should call when you receive RequestConfirmation signal +// Confirm should call when you receive RequestConfirmation signal func (b *Bluetooth) Confirm(device dbus.ObjectPath, accept bool) *dbus.Error { logger.Infof("dbus call Confirm with device %v and accept %t", device, accept) @@ -262,8 +262,8 @@ func (b *Bluetooth) Confirm(device dbus.ObjectPath, accept bool) *dbus.Error { return nil } -//FeedPinCode should call when you receive RequestPinCode signal, notice that accept must true -//if you accept connect request. If accept is false, pinCode will be ignored. +// FeedPinCode should call when you receive RequestPinCode signal, notice that accept must true +// if you accept connect request. If accept is false, pinCode will be ignored. func (b *Bluetooth) FeedPinCode(device dbus.ObjectPath, accept bool, pinCode string) *dbus.Error { logger.Infof("dbus call FeedPinCode with device %v, accept %t and pinCode %s", device, accept, pinCode) @@ -276,9 +276,9 @@ func (b *Bluetooth) FeedPinCode(device dbus.ObjectPath, accept bool, pinCode str return nil } -//FeedPasskey should call when you receive RequestPasskey signal, notice that accept must true -//if you accept connect request. If accept is false, passkey will be ignored. -//passkey must be range in 0~999999. +// FeedPasskey should call when you receive RequestPasskey signal, notice that accept must true +// if you accept connect request. If accept is false, passkey will be ignored. +// passkey must be range in 0~999999. func (b *Bluetooth) FeedPasskey(device dbus.ObjectPath, accept bool, passkey uint32) *dbus.Error { logger.Infof("dbus call FeedPasskey with device %v, accept %t and passkey %d", device, accept, passkey) @@ -303,7 +303,7 @@ func (b *Bluetooth) DebugInfo() (info string, busErr *dbus.Error) { return info, nil } -//ClearUnpairedDevice will remove all device in unpaired list +// ClearUnpairedDevice will remove all device in unpaired list func (b *Bluetooth) ClearUnpairedDevice() *dbus.Error { logger.Infof("dbus call ClearUnpairedDevice") diff --git a/bluetooth/bluez_profile.go b/bluetooth1/bluez_profile.go similarity index 98% rename from bluetooth/bluez_profile.go rename to bluetooth1/bluez_profile.go index 77ad69f49..733dde73c 100644 --- a/bluetooth/bluez_profile.go +++ b/bluetooth1/bluez_profile.go @@ -10,7 +10,7 @@ type profile struct { uuid, name string } -//nolint +// nolint var profiles = []profile{ profile{SPP_UUID, Tr("Serial port")}, profile{DUN_GW_UUID, Tr("Dial-Up networking")}, diff --git a/bluetooth/bluez_uuid.go b/bluetooth1/bluez_uuid.go similarity index 100% rename from bluetooth/bluez_uuid.go rename to bluetooth1/bluez_uuid.go diff --git a/bluetooth/develop.md b/bluetooth1/develop.md similarity index 100% rename from bluetooth/develop.md rename to bluetooth1/develop.md diff --git a/bluetooth/device.go b/bluetooth1/device.go similarity index 99% rename from bluetooth/device.go rename to bluetooth1/device.go index 39476a1b8..115eeb6b9 100644 --- a/bluetooth/device.go +++ b/bluetooth1/device.go @@ -9,7 +9,7 @@ import ( "fmt" "sync" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" ) const ( diff --git a/bluetooth/doc.go b/bluetooth1/doc.go similarity index 100% rename from bluetooth/doc.go rename to bluetooth1/doc.go diff --git a/bluetooth/exported_methods_auto.go b/bluetooth1/exported_methods_auto.go similarity index 100% rename from bluetooth/exported_methods_auto.go rename to bluetooth1/exported_methods_auto.go diff --git a/bluetooth/init.go b/bluetooth1/init.go similarity index 100% rename from bluetooth/init.go rename to bluetooth1/init.go index fa451a025..630d7e684 100644 --- a/bluetooth/init.go +++ b/bluetooth1/init.go @@ -5,8 +5,8 @@ package bluetooth import ( - "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/dde-daemon/loader" + "github.com/linuxdeepin/go-lib/log" ) var logger = log.NewLogger("daemon/bluetooth") diff --git a/bluetooth/main.go b/bluetooth1/main.go similarity index 100% rename from bluetooth/main.go rename to bluetooth1/main.go diff --git a/bluetooth/obex_agent.go b/bluetooth1/obex_agent.go similarity index 98% rename from bluetooth/obex_agent.go rename to bluetooth1/obex_agent.go index 02bc22ea4..f7b8203fb 100644 --- a/bluetooth/obex_agent.go +++ b/bluetooth1/obex_agent.go @@ -7,6 +7,7 @@ package bluetooth import ( "errors" "fmt" + "math" "math/rand" "os" @@ -17,9 +18,9 @@ import ( dutils "github.com/linuxdeepin/go-lib/utils" - "github.com/godbus/dbus" - obex "github.com/linuxdeepin/go-dbus-factory/org.bluez.obex" - notifications "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.notifications" + "github.com/godbus/dbus/v5" + notifications "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.notifications" + obex "github.com/linuxdeepin/go-dbus-factory/system/org.bluez.obex" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/gettext" "github.com/linuxdeepin/go-lib/xdg/userdir" diff --git a/bluetooth/utils.go b/bluetooth1/utils.go similarity index 100% rename from bluetooth/utils.go rename to bluetooth1/utils.go diff --git a/bluetooth/utils_notify.go b/bluetooth1/utils_notify.go similarity index 97% rename from bluetooth/utils_notify.go rename to bluetooth1/utils_notify.go index 9d05b9107..a5528e7a7 100644 --- a/bluetooth/utils_notify.go +++ b/bluetooth1/utils_notify.go @@ -11,8 +11,8 @@ import ( "sync" "time" - "github.com/godbus/dbus" - notifications "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.notifications" + "github.com/godbus/dbus/v5" + notifications "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.notifications" "github.com/linuxdeepin/go-lib/dbusutil" . "github.com/linuxdeepin/go-lib/gettext" ) diff --git a/bluetooth/utils_test.go b/bluetooth1/utils_test.go similarity index 100% rename from bluetooth/utils_test.go rename to bluetooth1/utils_test.go diff --git a/clipboard/clipboard_test.go b/clipboard1/clipboard_test.go similarity index 98% rename from clipboard/clipboard_test.go rename to clipboard1/clipboard_test.go index c1bd4e9e8..c06f288e2 100644 --- a/clipboard/clipboard_test.go +++ b/clipboard1/clipboard_test.go @@ -10,10 +10,10 @@ import ( "path/filepath" "testing" + "github.com/linuxdeepin/dde-daemon/clipboard1/mocks" x "github.com/linuxdeepin/go-x11-client" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/linuxdeepin/dde-daemon/clipboard/mocks" ) func TestEventCaptor(t *testing.T) { diff --git a/clipboard/event_captor.go b/clipboard1/event_captor.go similarity index 100% rename from clipboard/event_captor.go rename to clipboard1/event_captor.go diff --git a/clipboard/exported_methods_auto.go b/clipboard1/exported_methods_auto.go similarity index 100% rename from clipboard/exported_methods_auto.go rename to clipboard1/exported_methods_auto.go diff --git a/clipboard/manager.go b/clipboard1/manager.go similarity index 90% rename from clipboard/manager.go rename to clipboard1/manager.go index a692bdbb1..26b8c6d5a 100644 --- a/clipboard/manager.go +++ b/clipboard1/manager.go @@ -12,7 +12,7 @@ import ( "sync" "time" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" ConfigManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/log" @@ -358,10 +358,48 @@ func (m *Manager) handleClipboardUpdated(ts x.Timestamp) error { return err } logger.Debug("targets:", targets) + + // 过滤云桌面复制的数据 + // 判断是否从wps复制的数据并且是否包含text格式 + var tmpTarget x.Atom + hasKingsoftData := false + hasTextData := false + + for _, target := range targets { + targetName, err := m.xc.GetAtomName(target) + targetName = strings.ToLower(targetName) + if err == nil { + if targetName == "uos/remote-copy" { + return nil + } else if targetName == "text/plain" { + hasTextData = true + tmpTarget = target + } else if strings.Contains(targetName, "kingsoft") { + hasKingsoftData = true + } + } + } + + logger.Debug("hasKingsoftData:", hasKingsoftData, ", hasTextData:", hasTextData) + + // 如果 是从wps复制的数据并且包含text格式数据,则先读取text数据大小 + // 如果text数据大小超过10M,则只缓存text数据,否则所有格式都缓存 + if hasKingsoftData && hasTextData { + td, err := m.saveTarget(tmpTarget, ts) + if err == nil && len(td.Data) > 10*1024*1024 { + m.setContent(map[x.Atom]*TargetData{ + td.Target: td, + }) + + logger.Debug("handleClipboardUpdated wps text format finish", ts) + return nil + } + } + targetDataMap := m.saveTargets(targets, ts) m.setContent(targetDataMap) - logger.Debug("handleClipboardUpdated finish", ts) + logger.Debug("handleClipboardUpdated all format finish", ts) return nil } @@ -526,6 +564,47 @@ func (m *Manager) covertClipboardManagerSaveTargets(ev *x.SelectionRequestEvent) } } + logger.Debug("targets:", targets) + + // 过滤云桌面复制的数据 + // 判断是否从wps复制的数据并且是否包含text格式 + var tmpTarget x.Atom + hasKingsoftData := false + hasTextData := false + + for _, target := range targets { + targetName, err := m.xc.GetAtomName(target) + targetName = strings.ToLower(targetName) + if err == nil { + if targetName == "uos/remote-copy" { + return nil + } else if targetName == "text/plain" { + hasTextData = true + tmpTarget = target + } else if strings.Contains(targetName, "kingsoft") { + hasKingsoftData = true + } + } + } + + logger.Debug("hasKingsoftData:", hasKingsoftData, ", hasTextData:", hasTextData) + + // 如果 是从wps复制的数据并且包含text格式数据,则先读取text数据大小 + // 如果text数据大小超过10M,则只缓存text数据,否则所有格式都缓存 + if hasKingsoftData && hasTextData { + td, err := m.saveTarget(tmpTarget, ev.Time) + if err == nil && len(td.Data) > 10*1024*1024 { + m.setContent(map[x.Atom]*TargetData{ + td.Target: td, + }) + + logger.Debug("covertClipboardManagerSaveTargets text format finish", ev.Time) + m.saveTargetsRequestor = ev.Requestor + m.saveTargetsSuccessTime = time.Now() + return nil + } + } + targetDataMap := m.saveTargets(targets, ev.Time) m.setContent(targetDataMap) diff --git a/clipboard/manager_debug.go b/clipboard1/manager_debug.go similarity index 99% rename from clipboard/manager_debug.go rename to clipboard1/manager_debug.go index c68e3c72b..78ea4b176 100644 --- a/clipboard/manager_debug.go +++ b/clipboard1/manager_debug.go @@ -12,7 +12,7 @@ import ( "path/filepath" "strconv" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" x "github.com/linuxdeepin/go-x11-client" ) diff --git a/clipboard/manager_test.go b/clipboard1/manager_test.go similarity index 98% rename from clipboard/manager_test.go rename to clipboard1/manager_test.go index 0cced1516..676b9a0bf 100644 --- a/clipboard/manager_test.go +++ b/clipboard1/manager_test.go @@ -8,7 +8,7 @@ import ( "errors" "testing" - "github.com/linuxdeepin/dde-daemon/clipboard/mocks" + "github.com/linuxdeepin/dde-daemon/clipboard1/mocks" x "github.com/linuxdeepin/go-x11-client" "github.com/stretchr/testify/assert" ) diff --git a/clipboard/mocks/XClient.go b/clipboard1/mocks/XClient.go similarity index 100% rename from clipboard/mocks/XClient.go rename to clipboard1/mocks/XClient.go diff --git a/clipboard/module.go b/clipboard1/module.go similarity index 89% rename from clipboard/module.go rename to clipboard1/module.go index 0fb15127c..3f8adf9d2 100644 --- a/clipboard/module.go +++ b/clipboard1/module.go @@ -13,7 +13,10 @@ import ( "github.com/linuxdeepin/go-x11-client/ext/xfixes" ) -const dbusServiceName = "com.deepin.daemon.ClipboardManager" +const ( + dbusServiceName = "org.deepin.dde.ClipboardManager1" + dbusPath = "/org/deepin/dde/ClipboardManager1" +) var logger *log.Logger @@ -65,7 +68,7 @@ func (mo *Module) Start() error { } service := loader.GetService() - err = service.Export("/com/deepin/daemon/ClipboardManager", m) + err = service.Export(dbusPath, m) if err != nil { return err } diff --git a/clipboard/util.go b/clipboard1/util.go similarity index 100% rename from clipboard/util.go rename to clipboard1/util.go diff --git a/clipboard/x_client.go b/clipboard1/x_client.go similarity index 100% rename from clipboard/x_client.go rename to clipboard1/x_client.go diff --git a/common/bluetooth/bluetooth.go b/common/bluetooth/bluetooth.go index 24d024910..565b30840 100644 --- a/common/bluetooth/bluetooth.go +++ b/common/bluetooth/bluetooth.go @@ -4,7 +4,7 @@ package bluetooth -import "github.com/godbus/dbus" +import "github.com/godbus/dbus/v5" type NotifyMsg struct { Icon string @@ -33,4 +33,4 @@ var ErrCanceled = &dbus.Error{ } // SessionAgentPath 目前唯一支持的标准的 session agent 对象路径 -const SessionAgentPath = "/com/deepin/system/Bluetooth/Agent" +const SessionAgentPath = "/org/deepin/dde/Bluetooth1/Agent" diff --git a/common/dconfig/dconfig.go b/common/dconfig/dconfig.go index d00766513..d27b2dc2c 100644 --- a/common/dconfig/dconfig.go +++ b/common/dconfig/dconfig.go @@ -4,7 +4,7 @@ import ( "fmt" "sync" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" DConfigManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" "github.com/linuxdeepin/go-lib/dbusutil" ) diff --git a/common/dsync/dsync.go b/common/dsync/dsync.go index 68eb82f8f..bdccbc09e 100644 --- a/common/dsync/dsync.go +++ b/common/dsync/dsync.go @@ -7,8 +7,8 @@ package dsync import ( "encoding/json" - dbus "github.com/godbus/dbus" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" + dbus "github.com/godbus/dbus/v5" + ofdbus "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.dbus" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/proxy" "github.com/linuxdeepin/go-lib/log" diff --git a/common/sessionmsg/sessionmsg.go b/common/sessionmsg/sessionmsg.go index ca5e92671..0df6b1ea8 100644 --- a/common/sessionmsg/sessionmsg.go +++ b/common/sessionmsg/sessionmsg.go @@ -13,7 +13,7 @@ import ( "errors" "fmt" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/gettext" "github.com/linuxdeepin/go-lib/multierr" ) @@ -151,8 +151,8 @@ func (a *agent) sendMessage(msg *Message) error { // 这个 agent 实际在 dde-session-daemon 中的 service_trigger 模块中实现的 const ( - AgentPath = "/com/deepin/daemon/ServiceTrigger/Agent" - AgentIfc = "com.deepin.daemon.ServiceTrigger.Agent" + AgentPath = "/org/deepin/dde/ServiceTrigger1/Agent" + AgentIfc = "org.deepin.dde.ServiceTrigger1.Agent" MethodSendMessage = "SendMessage" ) diff --git a/dbus/accounts.go b/dbus/accounts.go index a72548135..22e1eb9a0 100644 --- a/dbus/accounts.go +++ b/dbus/accounts.go @@ -5,8 +5,8 @@ package dbus import ( - "github.com/godbus/dbus" - accounts "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.accounts" + "github.com/godbus/dbus/v5" + accounts "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.accounts1" ) func NewAccounts(systemConn *dbus.Conn) accounts.Accounts { diff --git a/dbus/dbus.go b/dbus/dbus.go index cf770777a..52c2b2931 100644 --- a/dbus/dbus.go +++ b/dbus/dbus.go @@ -5,7 +5,7 @@ package dbus import ( - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib" ) diff --git a/debian/changelog b/debian/changelog index 54a80902e..228514156 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,15 @@ +dde-daemon (6.1.1) unstable; urgency=medium + + * chore: cherry-pick paths from professional + + -- fuleyi Mon, 02 Sep 2024 15:18:43 +0800 + +dde-daemon (6.1.0) unstable; urgency=medium + + * 1070代码迁移,接口调整为v23风格 + + -- fuleyi Tue, 16 Jul 2024 09:47:14 +0800 + dde-daemon (5.15.13.1) unstable; urgency=medium [ Deepin Packages Builder ] diff --git a/debian/control b/debian/control index c25933e85..3b5fb2aac 100644 --- a/debian/control +++ b/debian/control @@ -70,7 +70,6 @@ Depends: deepin-installer-timezones, deepin-proxy, deepin-sound-theme, - deepin-wm | deepin-metacity | dde-kwin, dmidecode, dnsmasq-base, gnome-keyring, diff --git a/debian/rules b/debian/rules index a2745f5b5..b4f9bb9c3 100755 --- a/debian/rules +++ b/debian/rules @@ -4,6 +4,7 @@ include /usr/share/dpkg/architecture.mk export GOCACHE = /tmp/gocache export GOPATH = /usr/share/gocode +export GO111MODULE=off SYSTYPE=Desktop SYSTYPE=$(shell cat /etc/deepin-version | grep Type= | awk -F'=' '{print $$2}') @@ -13,10 +14,6 @@ override_dh_gencontrol: dh_gencontrol -- -Vdist:Depends="fprintd, libpam-fprintd" endif -ifneq ($(DEB_BUILD_ARCH), mips64el) - export GOBUILD_OPTIONS=-ldflags '-linkmode=external -extldflags "-pie"' -endif - %: dh $@ @@ -53,3 +50,7 @@ endif override_dh_installsystemd: dh_installsystemd --no-start + +override_dh_auto_clean: + dh_auto_clean -- + rm -fr obj-x86_64-linux-gnu diff --git a/debug/debug.go b/debug/debug.go index bc3cf1858..71df9ce9a 100644 --- a/debug/debug.go +++ b/debug/debug.go @@ -5,8 +5,8 @@ package debug import ( - "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/dde-daemon/loader" + "github.com/linuxdeepin/go-lib/log" ) var ( diff --git a/dock/app_entries.go b/dock/app_entries.go deleted file mode 100644 index 80b6717e4..000000000 --- a/dock/app_entries.go +++ /dev/null @@ -1,219 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "errors" - "fmt" - "reflect" - "sync" - - "github.com/godbus/dbus" - x "github.com/linuxdeepin/go-x11-client" -) - -type AppEntries struct { - items []*AppEntry - mu sync.RWMutex - - insertCb func(entry *AppEntry, index int) - removeCb func(entry *AppEntry) -} - -func (entries *AppEntries) GetValue() (val interface{}, err *dbus.Error) { - entries.mu.RLock() - result := make([]dbus.ObjectPath, len(entries.items)) - for idx, entry := range entries.items { - result[idx] = dbus.ObjectPath(entryDBusObjPathPrefix + entry.Id) - } - entries.mu.RUnlock() - return result, nil -} - -func (entries *AppEntries) SetNotifyChangedFunc(func(val interface{})) { -} - -func (entries *AppEntries) SetValue(val interface{}) (changed bool, err *dbus.Error) { - // readonly - return -} - -func (entries *AppEntries) GetType() reflect.Type { - return reflect.TypeOf([]dbus.ObjectPath{}) -} - -func (entries *AppEntries) GetByInnerId(id string) *AppEntry { - entries.mu.RLock() - for _, entry := range entries.items { - if entry.innerId == id { - entries.mu.RUnlock() - return entry - } - } - entries.mu.RUnlock() - return nil -} - -func (entries *AppEntries) Append(entry *AppEntry) { - entries.Insert(entry, -1) -} - -func (entries *AppEntries) Insert(entry *AppEntry, index int) { - entries.mu.Lock() - if index < 0 || index >= len(entries.items) { - // append - index = len(entries.items) - entries.items = append(entries.items, entry) - } else { - // insert - entries.items = append(entries.items[:index], - append([]*AppEntry{entry}, entries.items[index:]...)...) - } - - if entries.insertCb != nil { - entries.insertCb(entry, index) - } - entries.mu.Unlock() -} - -func (entries *AppEntries) Remove(entry *AppEntry) { - entries.mu.Lock() - index := entries.indexOf(entry) - if index != -1 { - entries.items = append(entries.items[:index], entries.items[index+1:]...) - entries.removeCb(entry) - } - entries.mu.Unlock() -} - -func (entries *AppEntries) indexOf(entry *AppEntry) int { - index := -1 - for i, v := range entries.items { - if v.Id == entry.Id { - index = i - } - } - return index -} - -func (entries *AppEntries) IndexOf(entry *AppEntry) int { - entries.mu.RLock() - idx := entries.indexOf(entry) - entries.mu.RUnlock() - return idx -} - -func (entries *AppEntries) Move(index, newIndex int) error { - if index == newIndex { - return errors.New("index == newIndex") - } - - entries.mu.Lock() - - entriesLength := len(entries.items) - if 0 <= index && index < entriesLength && - 0 <= newIndex && newIndex < entriesLength { - - entry := entries.items[index] - // remove entry at index - removed := append(entries.items[:index], entries.items[index+1:]...) - // insert entry at newIndex - entries.items = append(removed[:newIndex], - append([]*AppEntry{entry}, removed[newIndex:]...)...) - - entries.mu.Unlock() - return nil - } - entries.mu.Unlock() - return fmt.Errorf("index out of bounds, index: %v, newIndex: %v, len: %v", index, newIndex, entriesLength) -} - -func (entries *AppEntries) FilterDocked() (dockedEntries []*AppEntry) { - entries.mu.RLock() - - for _, entry := range entries.items { - entry.PropsMu.RLock() - if entry.appInfo != nil && entry.IsDocked { - dockedEntries = append(dockedEntries, entry) - } - entry.PropsMu.RUnlock() - } - - entries.mu.RUnlock() - return dockedEntries -} - -func (entries *AppEntries) GetByWindowPid(pid uint) *AppEntry { - entries.mu.RLock() - defer entries.mu.RUnlock() - - var foundPid bool - for _, entry := range entries.items { - entry.PropsMu.RLock() - for _, winInfo := range entry.windows { - if winInfo.getPid() == pid { - foundPid = true - break - } - } - entry.PropsMu.RUnlock() - if foundPid { - return entry - } - } - return nil -} - -func (entries *AppEntries) getByWindowId(winId x.Window) *AppEntry { - entries.mu.RLock() - defer entries.mu.RUnlock() - - for _, entry := range entries.items { - entry.PropsMu.RLock() - _, ok := entry.windows[winId] - entry.PropsMu.RUnlock() - if ok { - return entry - } - } - // not found - return nil -} - -func getByDesktopFilePath(entriesItems []*AppEntry, desktopFilePath string) (*AppEntry, error) { - // same file - for _, entry := range entriesItems { - if entry.appInfo == nil { - continue - } - file := entry.appInfo.GetFileName() - if file == desktopFilePath { - return entry, nil - } - } - - // hash equal - appInfo := NewAppInfoFromFile(desktopFilePath) - if appInfo == nil { - return nil, errors.New("invalid desktopFilePath") - } - hash := appInfo.innerId - for _, entry := range entriesItems { - if entry.appInfo == nil { - continue - } - if entry.appInfo.innerId == hash { - return entry, nil - } - } - return nil, nil -} - -func (entries *AppEntries) GetByDesktopFilePath(desktopFilePath string) (*AppEntry, error) { - entries.mu.RLock() - e, err := getByDesktopFilePath(entries.items, desktopFilePath) - entries.mu.RUnlock() - return e, err -} diff --git a/dock/app_entry.go b/dock/app_entry.go deleted file mode 100644 index 14aeb23b8..000000000 --- a/dock/app_entry.go +++ /dev/null @@ -1,330 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "sort" - "sync" - "unicode/utf8" - - "github.com/linuxdeepin/go-lib/dbusutil" - x "github.com/linuxdeepin/go-x11-client" -) - -const ( - entryDBusObjPathPrefix = dbusPath + "/entries/" - entryDBusInterface = dbusInterface + ".Entry" -) - -//go:generate dbusutil-gen -type AppEntry -import=github.com/linuxdeepin/go-x11-client=x app_entry.go -//go:generate dbusutil-gen em -type AppEntry,Manager - -type AppEntry struct { - PropsMu sync.RWMutex - Id string - IsActive bool - Name string - Icon string - // dbusutil-gen: ignore - Menu AppEntryMenu - DesktopFile string - CurrentWindow x.Window - IsDocked bool - // dbusutil-gen: equal=method:Equal - WindowInfos windowInfosType - - service *dbusutil.Service - manager *Manager - innerId string - windows map[x.Window]WindowInfoImp - current WindowInfoImp - appInfo *AppInfo - winIconPreferred bool -} - -func newAppEntry(dockManager *Manager, innerId string, appInfo *AppInfo) *AppEntry { - entry := &AppEntry{ - manager: dockManager, - service: dockManager.service, - Id: dockManager.allocEntryId(), - innerId: innerId, - windows: make(map[x.Window]WindowInfoImp), - } - entry.Menu.manager = dockManager - entry.setAppInfo(appInfo) - entry.Name = entry.getName() - entry.Icon = entry.getIcon() - return entry -} - -func (entry *AppEntry) setAppInfo(newAppInfo *AppInfo) { - if entry.appInfo == newAppInfo { - logger.Debug("setAppInfo failed: old == new") - return - } - entry.appInfo = newAppInfo - - if newAppInfo == nil { - entry.winIconPreferred = true - entry.setPropDesktopFile("") - } else { - entry.winIconPreferred = false - entry.setPropDesktopFile(newAppInfo.GetFileName()) - id := newAppInfo.GetId() - if strSliceContains(entry.manager.getWinIconPreferredApps(), id) { - entry.winIconPreferred = true - return - } - - icon := newAppInfo.GetIcon() - if icon == "" { - entry.winIconPreferred = true - } - } -} - -func (entry *AppEntry) hasWindow() bool { - return len(entry.windows) != 0 -} - -func (entry *AppEntry) hasAllowedCloseWindow() bool { - winInfos := entry.getAllowedCloseWindows() - return len(winInfos) > 0 -} - -func (entry *AppEntry) getAllowedCloseWindows() []WindowInfoImp { - ret := make([]WindowInfoImp, 0, len(entry.windows)) - for _, winInfo := range entry.windows { - if winInfo.allowClose() { - ret = append(ret, winInfo) - } - } - return ret -} - -func (entry *AppEntry) getWindowIds() []uint32 { - list := make([]uint32, 0, len(entry.windows)) - for _, winInfo := range entry.windows { - list = append(list, uint32(winInfo.getXid())) - } - return list -} - -func (entry *AppEntry) getWindowInfoSlice() []WindowInfoImp { - winInfoSlice := make([]WindowInfoImp, 0, len(entry.windows)) - for _, winInfo := range entry.windows { - winInfoSlice = append(winInfoSlice, winInfo) - } - return winInfoSlice -} - -func (entry *AppEntry) getExec(oneLine bool) string { - if entry.current == nil { - return "" - } - winProcess := entry.current.getProcess() - if winProcess != nil { - if oneLine { - return winProcess.GetOneCommandLine() - } else { - return winProcess.GetShellScriptLines() - } - } - return "" -} - -func (entry *AppEntry) setCurrentWindowInfo(winInfo WindowInfoImp) { - entry.current = winInfo - if winInfo == nil { - entry.setPropCurrentWindow(0) - } else { - entry.setPropCurrentWindow(winInfo.getXid()) - } -} - -func (entry *AppEntry) findNextLeader() WindowInfoImp { - winSlice := make(windowSlice, 0, len(entry.windows)) - for win := range entry.windows { - winSlice = append(winSlice, win) - } - sort.Sort(winSlice) - currentWin := entry.current.getXid() - logger.Debug("sorted window slice:", winSlice) - logger.Debug("current window:", currentWin) - currentIndex := -1 - for i, win := range winSlice { - if win == currentWin { - currentIndex = i - } - } - if currentIndex == -1 { - logger.Warning("findNextLeader unexpect, return 0") - return nil - } - // if current window is max, return min: winSlice[0] - // else return winSlice[currentIndex+1] - nextIndex := 0 - if currentIndex < len(winSlice)-1 { - nextIndex = currentIndex + 1 - } - logger.Debug("next window:", winSlice[nextIndex]) - for _, winInfo := range entry.windows { - if winInfo.getXid() == winSlice[nextIndex] { - return winInfo - } - } - return nil -} - -func (entry *AppEntry) attachWindow(winInfo WindowInfoImp) bool { - win := winInfo.getXid() - logger.Debugf("attach win %v to entry", win) - - winInfo.setEntry(entry) - - entry.PropsMu.Lock() - defer entry.PropsMu.Unlock() - - if _, ok := entry.windows[win]; ok { - logger.Infof("win %v is already attach to entry", win) - return false - } - - entry.windows[win] = winInfo - entry.updateWindowInfos() - entry.updateIsActive() - - if entry.current == nil { - // from no window to has window - entry.setCurrentWindowInfo(winInfo) - } - entry.updateIcon() - entry.updateMenu() - - // print window info - winInfo.print() - - return true -} - -// return need remove? -func (entry *AppEntry) detachWindow(winInfo WindowInfoImp) bool { - winInfo.setEntry(nil) - win := winInfo.getXid() - logger.Debug("detach window ", win) - - entry.PropsMu.Lock() - defer entry.PropsMu.Unlock() - - delete(entry.windows, win) - - if len(entry.windows) == 0 { - if !entry.IsDocked { - // no window and not docked - return true - } - entry.setCurrentWindowInfo(nil) - } else { - for _, winInfo := range entry.windows { - // select first - entry.setCurrentWindowInfo(winInfo) - break - } - } - - entry.updateWindowInfos() - entry.updateIcon() - entry.updateIsActive() - entry.updateMenu() - return false -} - -func (entry *AppEntry) getName() (name string) { - if entry.appInfo != nil { - name = entry.appInfo.name - if !utf8.ValidString(name) { - name = "" - } - } - - if name == "" && entry.current != nil { - name = entry.current.getDisplayName() - } - - return -} - -func (entry *AppEntry) updateName() { - name := entry.getName() - entry.setPropName(name) -} - -func (entry *AppEntry) updateIcon() { - icon := entry.getIcon() - entry.setPropIcon(icon) -} - -func (entry *AppEntry) forceUpdateIcon() { - icon := entry.getIcon() - entry.Icon = icon - err := entry.emitPropChangedIcon(icon) - if err != nil { - logger.Warning(err) - } -} - -func (entry *AppEntry) getIcon() string { - var icon string - appInfo := entry.appInfo - current := entry.current - - if entry.hasWindow() { - if current == nil { - logger.Warning("AppEntry.getIcon entry.hasWindow but entry.current is nil") - return "" - } - - // has window && current not nil - if entry.winIconPreferred { - // try current window icon first - icon = current.getIcon() - if icon != "" { - return icon - } - } - if appInfo != nil { - icon = appInfo.GetIcon() - if icon != "" { - return icon - } - } - return current.getIcon() - - } else if appInfo != nil { - // no window - return appInfo.GetIcon() - } - return "" -} - -func (e *AppEntry) updateWindowInfos() { - windowInfos := newWindowInfos() - for _, winInfo := range e.windows { - windowInfos[winInfo.getXid()] = ExportWindowInfo{ - Title: winInfo.getTitle(), - Flash: winInfo.isDemandingAttention(), - } - } - e.setPropWindowInfos(windowInfos) -} - -func (e *AppEntry) updateIsActive() { - isActive := false - activeWin := e.manager.getActiveWindow() - if activeWin != nil { - _, isActive = e.windows[activeWin.getXid()] - } - e.setPropIsActive(isActive) -} diff --git a/dock/app_entry_ifc.go b/dock/app_entry_ifc.go deleted file mode 100644 index 2bd3f623f..000000000 --- a/dock/app_entry_ifc.go +++ /dev/null @@ -1,276 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "errors" - "os" - "syscall" - "time" - - "github.com/godbus/dbus" - "github.com/linuxdeepin/go-lib/dbusutil" - "github.com/linuxdeepin/go-lib/procfs" - "github.com/linuxdeepin/go-x11-client/util/wm/ewmh" -) - -func (e *AppEntry) GetInterfaceName() string { - return entryDBusInterface -} - -func (entry *AppEntry) Activate(timestamp uint32) *dbus.Error { - logger.Debug("Activate timestamp:", timestamp) - var err error - - m := entry.manager - if HideModeType(m.HideMode.Get()) == HideModeSmartHide { - m.setPropHideState(HideStateShow) - m.updateHideState(true) - } - - entry.PropsMu.RLock() - hasWindow := entry.hasWindow() - entry.PropsMu.RUnlock() - - if !hasWindow { - entry.launchApp(timestamp) - return nil - } - - if entry.current == nil { - err = errors.New("entry.current is nil") - logger.Warning(err) - return dbusutil.ToError(err) - } - - winInfo := entry.current - if winInfo == nil { - err = errors.New("winInfo is nil") - logger.Warning(err) - return dbusutil.ToError(err) - } - if m.isWaylandSession { - if m.isActiveWindow(winInfo) { - showing, _ := m.waylandWM.IsShowingDesktop(0) - if winInfo.isMinimized() || showing { - err = winInfo.activate() - } else { - if len(entry.windows) == 1 { - err = winInfo.minimize() - } else { - nextWinInfo := entry.findNextLeader() - if nextWinInfo != nil { - err = nextWinInfo.activate() - } else { - err = errors.New("nextWinInfo is nil") - } - } - } - } else { - err = winInfo.activate() - } - } else { - win := winInfo.getXid() - state, err0 := ewmh.GetWMState(globalXConn, win).Reply(globalXConn) - if err0 != nil { - logger.Warningf("failed to get ewmh WMState for win %d: %v", win, err0) - return dbusutil.ToError(err0) - } - - activeWin := entry.manager.getActiveWindow() - if activeWin == nil { - err = errors.New("activeWin is nil") - logger.Warning(err) - return dbusutil.ToError(err) - } - if win == activeWin.getXid() { - if atomsContains(state, atomNetWmStateHidden) { - err = activateWindow(win) - } else { - if len(entry.windows) == 1 { - err = minimizeWindow(win) - } else if entry.manager.getActiveWindow().getXid() == win { - nextWin := entry.findNextLeader() - if nextWin == nil { - err = errors.New("nextWin is nil") - logger.Warning(err) - return dbusutil.ToError(err) - } - err = nextWin.activate() - } - } - } else { - err = activateWindow(win) - } - } - - if err != nil { - logger.Warning(err) - } - return dbusutil.ToError(err) -} - -func (e *AppEntry) HandleMenuItem(timestamp uint32, id string) *dbus.Error { - logger.Debugf("HandleMenuItem id: %q timestamp: %v", id, timestamp) - menu := e.Menu.getMenu() - if menu != nil { - err := menu.HandleAction(id, timestamp) - return dbusutil.ToError(err) - } - logger.Warning("HandleMenuItem failed: entry.coreMenu is nil") - return nil -} - -func (e *AppEntry) HandleDragDrop(timestamp uint32, files []string) *dbus.Error { - logger.Debugf("handle drag drop files: %v, timestamp: %v", files, timestamp) - - ai := e.appInfo - if ai != nil { - e.manager.launch(ai.GetFileName(), timestamp, files) - } else { - logger.Warning("not supported") - } - return nil -} - -// RequestDock 驻留 -func (entry *AppEntry) RequestDock() *dbus.Error { - docked, err := entry.manager.dockEntry(entry) - if err != nil { - return dbusutil.ToError(err) - } - if docked { - entry.manager.saveDockedApps() - } - return nil -} - -// RequestUndock 取消驻留 -func (entry *AppEntry) RequestUndock() *dbus.Error { - entry.manager.undockEntry(entry) - return nil -} - -func (entry *AppEntry) PresentWindows() *dbus.Error { - entry.PropsMu.RLock() - windowIds := entry.getWindowIds() - entry.PropsMu.RUnlock() - if len(windowIds) > 0 { - err := entry.manager.wm.PresentWindows(dbus.FlagNoAutoStart, windowIds) - if err != nil { - logger.Warning("PresentWindows error:", err) - } - } - return nil -} - -func (entry *AppEntry) showWorkspace() error { - err := entry.manager.wm.ShowWorkspace(0) - if err != nil { - return dbusutil.ToError(err) - } - return nil -} - -func (entry *AppEntry) NewInstance(timestamp uint32) *dbus.Error { - entry.launchApp(timestamp) - return nil -} - -func (entry *AppEntry) Check() *dbus.Error { - entry.PropsMu.RLock() - winInfoSlice := entry.getWindowInfoSlice() - entry.PropsMu.RUnlock() - - for _, winInfo := range winInfoSlice { - entry.manager.attachOrDetachWindow(winInfo) - } - return nil -} - -func (entry *AppEntry) ForceQuit() *dbus.Error { - entry.PropsMu.RLock() - winInfoSlice := entry.getWindowInfoSlice() - entry.PropsMu.RUnlock() - - pidWinInfosMap := make(map[uint][]WindowInfoImp) - for _, winInfo := range winInfoSlice { - pid := winInfo.getPid() - if pid != 0 && isProcessAlive(pid) { - pidWinInfosMap[pid] = append(pidWinInfosMap[pid], winInfo) - } else { - err := winInfo.killClient() - if err != nil { - logger.Warning(err) - } - } - } - - for pid, winInfoSlice := range pidWinInfosMap { - err := killProcess(pid) - if err != nil { - logger.Warning(err) - if os.IsPermission(err) { - for _, winInfo := range winInfoSlice { - err = winInfo.killClient() - if err != nil { - logger.Warning(err) - } - } - } - } - } - return nil -} - -func killProcess(pid uint) error { - p := procfs.Process(pid) - if p.Exist() { - logger.Debug("kill process", pid) - osP, err := os.FindProcess(int(pid)) - if err != nil { - return err - } - err = osP.Signal(syscall.SIGTERM) - if err != nil { - logger.Warningf("failed to send signal TERM to process %d: %v", - osP.Pid, err) - return err - } - time.AfterFunc(5*time.Second, func() { - if p.Exist() { - err := osP.Kill() - if err != nil { - logger.Warningf("failed to send signal KILL to process %d: %v", - osP.Pid, err) - } - } - }) - } - return nil -} - -func (entry *AppEntry) GetAllowedCloseWindows() (windows []uint32, busErr *dbus.Error) { - entry.PropsMu.RLock() - ret := make([]uint32, len(entry.windows)) - winInfos := entry.getAllowedCloseWindows() - for idx, winInfo := range winInfos { - ret[idx] = uint32(winInfo.getXid()) - } - entry.PropsMu.RUnlock() - return ret, nil -} - -func isProcessAlive(pid uint) bool { - p, err := os.FindProcess(int(pid)) - if err != nil { - return false - } - err = p.Signal(syscall.Signal(0)) - if err != nil { - return false - } - return true -} diff --git a/dock/app_entry_menu.go b/dock/app_entry_menu.go deleted file mode 100644 index e77781c60..000000000 --- a/dock/app_entry_menu.go +++ /dev/null @@ -1,247 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "reflect" - "sync" - - "github.com/godbus/dbus" - . "github.com/linuxdeepin/go-lib/gettext" - "github.com/linuxdeepin/go-lib/strv" - _ "github.com/linuxdeepin/go-x11-client" -) - -func (entry *AppEntry) updateMenu() { - logger.Debug("Update menu") - menu := NewMenu() - menu.AppendItem(entry.getMenuItemLaunch()) - - desktopActionMenuItems := entry.getMenuItemDesktopActions() - menu.AppendItem(desktopActionMenuItems...) - hasWin := entry.hasWindow() - if hasWin { - menu.AppendItem(entry.getMenuItemAllWindows()) - } - if !strv.Strv(entry.manager.hideRequestDockAndUndockByNameList).Contains(entry.getName()) { - // menu item dock or undock - logger.Debug(entry.Id, "Item docked?", entry.IsDocked) - if entry.IsDocked { - menu.AppendItem(entry.getMenuItemUndock()) - } else { - menu.AppendItem(entry.getMenuItemDock()) - } - } - - if hasWin { - if entry.manager.forceQuitAppStatus != forceQuitAppDisabled { - if entry.appInfo != nil && (entry.appInfo.identifyMethod == "Android" || entry.appInfo.identifyMethod == "DSGVirtualApp") { - menu.AppendItem(entry.getMenuItemForceQuitAndroid()) - } else { - menu.AppendItem(entry.getMenuItemForceQuit()) - } - } - - if entry.hasAllowedCloseWindow() { - menu.AppendItem(entry.getMenuItemCloseAll()) - } - } - entry.Menu.setMenu(menu) -} - -func (entry *AppEntry) getMenuItemDesktopActions() []*MenuItem { - ai := entry.appInfo - if ai == nil { - return nil - } - - var items []*MenuItem - launchAction := func(action desktopAction) func(timestamp uint32) { - return func(timestamp uint32) { - logger.Debugf("launch action %+v", action) - err := entry.manager.startManager.LaunchAppAction(dbus.FlagNoAutoStart, - ai.GetFileName(), action.Section, timestamp) - if err != nil { - logger.Warning("launchAppAction failed:", err) - } - } - } - - for _, action := range ai.GetActions() { - item := NewMenuItem(action.Name, launchAction(action), true) - items = append(items, item) - } - return items -} - -func (entry *AppEntry) launchApp(timestamp uint32) { - logger.Debug("launchApp timestamp:", timestamp) - if entry.appInfo != nil { - logger.Debug("Has AppInfo") - entry.manager.launch(entry.appInfo.GetFileName(), timestamp, nil) - } else { - // TODO - logger.Debug("not supported") - } -} - -func (entry *AppEntry) getMenuItemLaunch() *MenuItem { - var itemName string - if entry.hasWindow() { - itemName = entry.getName() - } else { - itemName = Tr("Open") - } - logger.Debugf("getMenuItemLaunch, itemName: %q", itemName) - return NewMenuItem(itemName, entry.launchApp, true) -} - -func (entry *AppEntry) getMenuItemCloseAll() *MenuItem { - return NewMenuItem(Tr("Close All"), func(timestamp uint32) { - logger.Debug("Close All") - entry.PropsMu.RLock() - winInfos := entry.getAllowedCloseWindows() - entry.PropsMu.RUnlock() - - for i := 0; i < len(winInfos)-1; i++ { - for j := i + 1; j < len(winInfos); j++ { - if winInfos[i].getCreatedTime() < winInfos[j].getCreatedTime() { - winInfos[i], winInfos[j] = winInfos[j], winInfos[i] - } - } - } - - for _, winInfo := range winInfos { - logger.Debug("to close win, xid:", winInfo.getXid(), ", created time:", winInfo.getCreatedTime()) - err := winInfo.close(timestamp) - if err != nil { - logger.Warningf("failed to close window %d: %v", winInfo.getXid(), err) - } - } - }, true) -} - -func (entry *AppEntry) getMenuItemForceQuit() *MenuItem { - active := entry.manager.forceQuitAppStatus != forceQuitAppDeactivated - - return NewMenuItem(Tr("Force Quit"), func(timestamp uint32) { - logger.Debug("Force Quit") - err := entry.ForceQuit() - if err != nil { - logger.Warning("ForceQuit error:", err) - } - }, active) -} - -//dock栏上Android程序的Force Quit功能 -func (entry *AppEntry) getMenuItemForceQuitAndroid() *MenuItem { - active := entry.manager.forceQuitAppStatus != forceQuitAppDeactivated - - if entry.hasAllowedCloseWindow() { - return NewMenuItem(Tr("Force Quit"), func(timestamp uint32) { - logger.Debug("Force Quit") - entry.PropsMu.RLock() - winInfos := entry.getAllowedCloseWindows() - entry.PropsMu.RUnlock() - - for _, winInfo := range winInfos { - err := winInfo.close(timestamp) - if err != nil { - logger.Warningf("failed to close window %d: %v", winInfo.getXid(), err) - } - } - }, active) - } - - return NewMenuItem(Tr("Force Quit"), func(timestamp uint32) {}, true) -} - -func (entry *AppEntry) getMenuItemDock() *MenuItem { - return NewMenuItem(Tr("Dock"), func(uint32) { - logger.Debug("menu action dock entry") - err := entry.RequestDock() - if err != nil { - logger.Warning("RequestDock error:", err) - } - }, true) -} - -func (entry *AppEntry) getMenuItemUndock() *MenuItem { - return NewMenuItem(Tr("Undock"), func(uint32) { - logger.Debug("menu action undock entry") - err := entry.RequestUndock() - if err != nil { - logger.Warning("RequestUndock error:", err) - } - }, true) -} - -func (entry *AppEntry) getMenuItemAllWindows() *MenuItem { - menuItem := NewMenuItem(Tr("All Windows"), func(uint32) { - logger.Debug("menu action all windows") - err := entry.showWorkspace() - if err != nil { - logger.Warning("ShowWorkspace error:", err) - } - }, true) - menuItem.hint = menuItemHintShowAllWindows - return menuItem -} - -type AppEntryMenu struct { - manager *Manager - cache string - is3DWM bool - dirty bool - menu *Menu - mu sync.Mutex -} - -func (m *AppEntryMenu) setMenu(menu *Menu) { - m.mu.Lock() - m.menu = menu - m.dirty = true - m.mu.Unlock() -} - -func (m *AppEntryMenu) getMenu() *Menu { - m.mu.Lock() - ret := m.menu - m.mu.Unlock() - return ret -} - -func (*AppEntryMenu) SetValue(val interface{}) (changed bool, err *dbus.Error) { - // read only - return -} - -func (m *AppEntryMenu) GetValue() (val interface{}, err *dbus.Error) { - is3DWM := m.manager.is3DWM() - m.mu.Lock() - if m.dirty || m.cache == "" || m.is3DWM != is3DWM { - items := make([]*MenuItem, 0, len(m.menu.Items)) - for _, item := range m.menu.Items { - if is3DWM || item.hint != menuItemHintShowAllWindows { - items = append(items, item) - } - } - menu := NewMenu() - menu.Items = items - m.cache = menu.GenerateJSON() - m.dirty = false - m.is3DWM = is3DWM - } - val = m.cache - m.mu.Unlock() - return -} - -func (*AppEntryMenu) SetNotifyChangedFunc(func(val interface{})) { -} - -func (*AppEntryMenu) GetType() reflect.Type { - return reflect.TypeOf("") -} diff --git a/dock/app_info.go b/dock/app_info.go deleted file mode 100644 index e3691d483..000000000 --- a/dock/app_info.go +++ /dev/null @@ -1,176 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "crypto/md5" - "encoding/hex" - "fmt" - "strings" - - "github.com/linuxdeepin/dde-daemon/common/dconfig" - "github.com/linuxdeepin/go-lib/appinfo/desktopappinfo" - "github.com/linuxdeepin/go-lib/gettext" -) - -const desktopHashPrefix = "d:" - -type AppInfo struct { - filename string - id string - icon string - identifyMethod string - innerId string - name string - actions []desktopAction - isInstalled bool -} - -type desktopAction struct { - Section string - Name string -} - -func newAppInfo(dai *desktopappinfo.DesktopAppInfo) *AppInfo { - if dai == nil { - return nil - } - ai := &AppInfo{} - xDeepinVendor, _ := dai.GetString(desktopappinfo.MainSection, "X-Deepin-Vendor") - if xDeepinVendor == "deepin" { - ai.name = dai.GetGenericName() - if ai.name == "" { - ai.name = dai.GetName() - } - } else { - ai.name = dai.GetName() - } - - enableLinglongSuffix := false - getEnableLinglongSuffix := func() { - dc, err := dconfig.NewDConfig("org.deepin.dde.daemon", "org.deepin.dde.daemon.application", "") - if err != nil { - logger.Warning("new dconfig error:", err) - return - } - if dc == nil { - logger.Warning("new dconfig error: dconfig is nil.") - return - } - result, err := dc.GetValueBool("LinglongAppNameSuffixEnable") - if err != nil { - logger.Warning("failed to get dconfig LinglongAppNameSuffixEnable:", err) - return - } - enableLinglongSuffix = result - } - getEnableLinglongSuffix() - - if strings.Contains(dai.GetId(), "Linglong") && enableLinglongSuffix { - ai.name = ai.name + gettext.Tr("(Linglong)") - } - ai.innerId = genInnerIdWithDesktopAppInfo(dai) - ai.filename = dai.GetFileName() - ai.id = dai.GetId() - ai.icon = dai.GetIcon() - ai.isInstalled = dai.IsInstalled() - actions := dai.GetActions() - for _, act := range actions { - ai.actions = append(ai.actions, desktopAction{ - Section: act.Section, - Name: act.Name, - }) - } - return ai -} - -func getDockedDesktopAppInfo(app string) *desktopappinfo.DesktopAppInfo { - if app[0] != '/' || len(app) <= 3 { - return desktopappinfo.NewDesktopAppInfo(app) - } - - absPath := unzipDesktopPath(app) - ai, err := desktopappinfo.NewDesktopAppInfoFromFile(absPath) - if err != nil { - logger.Warning(err) - return nil - } - return ai -} - -func NewDockedAppInfo(app string) *AppInfo { - if app == "" { - return nil - } - return newAppInfo(getDockedDesktopAppInfo(app)) -} - -func NewAppInfo(id string) *AppInfo { - if id == "" { - return nil - } - return newAppInfo(desktopappinfo.NewDesktopAppInfo(id)) -} - -func NewAppInfoFromFile(file string) *AppInfo { - if file == "" { - return nil - } - dai, _ := desktopappinfo.NewDesktopAppInfoFromFile(file) - if dai == nil { - return nil - } - - if !dai.IsInstalled() { - appId, _ := dai.GetString(desktopappinfo.MainSection, "X-Deepin-AppID") - if appId != "" { - dai1 := desktopappinfo.NewDesktopAppInfo(appId) - if dai1 != nil { - dai = dai1 - } - } - } - return newAppInfo(dai) -} - -func (ai *AppInfo) GetFileName() string { - return ai.filename -} - -func (ai *AppInfo) GetIcon() string { - return ai.icon -} - -func (ai *AppInfo) GetId() string { - return ai.id -} - -func (ai *AppInfo) GetActions() []desktopAction { - return ai.actions -} - -func (ai *AppInfo) IsInstalled() bool { - return ai.isInstalled -} - -func genInnerIdWithDesktopAppInfo(dai *desktopappinfo.DesktopAppInfo) string { - cmdline := dai.GetCommandline() - hasher := md5.New() - _, err := hasher.Write([]byte(cmdline)) - if err != nil { - logger.Warning("Write error:", err) - } - return desktopHashPrefix + hex.EncodeToString(hasher.Sum(nil)) -} - -func (ai *AppInfo) String() string { - if ai == nil { - return "" - } - desktopFile := ai.GetFileName() - icon := ai.GetIcon() - id := ai.GetId() - return fmt.Sprintf("", id, ai.innerId, icon, desktopFile) -} diff --git a/dock/bamf.go b/dock/bamf.go deleted file mode 100644 index 6dee15f7d..000000000 --- a/dock/bamf.go +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "github.com/godbus/dbus" - bamf "github.com/linuxdeepin/go-dbus-factory/org.ayatana.bamf" - x "github.com/linuxdeepin/go-x11-client" -) - -func getDesktopFromWindowByBamf(win x.Window) (string, error) { - bus, err := dbus.SessionBus() - if err != nil { - return "", err - } - matcher := bamf.NewMatcher(bus) - applicationObjPathStr, err := matcher.ApplicationForXid(0, uint32(win)) - if err != nil { - return "", err - } - applicationObjPath := dbus.ObjectPath(applicationObjPathStr) - if !applicationObjPath.IsValid() { - return "", nil - } - application, err := bamf.NewApplication(bus, applicationObjPath) - if err != nil { - return "", err - } - desktopFile, err := application.Application().DesktopFile(0) - if err != nil { - return "", err - } - return desktopFile, nil -} diff --git a/dock/daemon.go b/dock/daemon.go deleted file mode 100644 index ced8df175..000000000 --- a/dock/daemon.go +++ /dev/null @@ -1,102 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "github.com/linuxdeepin/go-lib/log" - "github.com/linuxdeepin/dde-daemon/loader" - - x "github.com/linuxdeepin/go-x11-client" -) - -type Daemon struct { - *loader.ModuleBase -} - -const moduleName = "dock" - -func NewDaemon(logger *log.Logger) *Daemon { - daemon := new(Daemon) - daemon.ModuleBase = loader.NewModuleBase(moduleName, daemon, logger) - return daemon -} - -func (d *Daemon) Stop() error { - if dockManager != nil { - dockManager.destroy() - dockManager = nil - } - - if globalXConn != nil { - globalXConn.Close() - globalXConn = nil - } - - return nil -} - -func (d *Daemon) startFailed() { - err := d.Stop() - if err != nil { - logger.Warning("Stop error:", err) - } -} - -func (d *Daemon) Start() error { - if dockManager != nil { - return nil - } - - var err error - - globalXConn, err = x.NewConn() - if err != nil { - d.startFailed() - return err - } - - initAtom() - initDir() - initPathDirCodeMap() - - service := loader.GetService() - - dockManager, err = newManager(service) - if err != nil { - d.startFailed() - return err - } - - err = dockManager.service.Export(dbusPath, dockManager, dockManager.syncConfig) - if err != nil { - d.startFailed() - return err - } - - err = service.RequestName(dbusServiceName) - if err != nil { - d.startFailed() - return err - } - - err = dockManager.syncConfig.Register() - if err != nil { - logger.Warning(err) - } - - err = service.Emit(dockManager, "ServiceRestarted") - if err != nil { - logger.Warning(err) - } - return nil -} - -func (d *Daemon) GetDependencies() []string { - return []string{} -} - -func (d *Daemon) Name() string { - return moduleName -} diff --git a/dock/desktop_file_path.go b/dock/desktop_file_path.go deleted file mode 100644 index 7adc9f55b..000000000 --- a/dock/desktop_file_path.go +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "path/filepath" - "strings" -) - -var pathDirCodeMap map[string]string -var pathCodeDirMap map[string]string - -const desktopExt = ".desktop" - -func initPathDirCodeMap() { - pathDirCodeMap = map[string]string{ - "/usr/share/applications/": "/S@", - "/usr/local/share/applications/": "/L@", - } - - dir := filepath.Join(homeDir, ".local/share/applications") - dir = addDirTrailingSlash(dir) - pathDirCodeMap[dir] = "/H@" - - dir = addDirTrailingSlash(scratchDir) - pathDirCodeMap[dir] = "/D@" - - logger.Debugf("pathDirCodeMap: %#v", pathDirCodeMap) - - pathCodeDirMap = make(map[string]string, len(pathDirCodeMap)) - for dir, code := range pathDirCodeMap { - pathCodeDirMap[code] = dir - } -} - -func getDesktopIdByFilePath(path string) string { - var desktopId string - for dir := range pathDirCodeMap { - if strings.HasPrefix(path, dir) { - desktopId = path[len(dir):] - desktopId = strings.Replace(desktopId, "/", "-", -1) - } - } - return desktopId -} - -func addDirTrailingSlash(dir string) string { - if len(dir) == 0 { - panic("length of dir is 0") - } - if dir[len(dir)-1] != '/' { - dir += "/" - } - return dir -} - -func addDesktopExt(str string) string { - if strings.HasSuffix(str, desktopExt) { - return str - } - return str + desktopExt -} - -func trimDesktopExt(str string) string { - if strings.HasSuffix(str, desktopExt) { - return str[:len(str)-len(desktopExt)] - } - return str -} - -func zipDesktopPath(path string) string { - for dir, code := range pathDirCodeMap { - if strings.HasPrefix(path, dir) { - path = code + path[len(dir):] - } - } - return trimDesktopExt(path) -} - -func unzipDesktopPath(path string) string { - head := path[:3] - for code, dir := range pathCodeDirMap { - if code == head { - path = dir + path[3:] - break - } - } - return addDesktopExt(path) -} diff --git a/dock/desktop_file_path_test.go b/dock/desktop_file_path_test.go deleted file mode 100644 index 147535745..000000000 --- a/dock/desktop_file_path_test.go +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -var deskotpFilePathTestMap = map[string]string{ - "/usr/share/applications/deepin-screenshot.desktop": "/S@deepin-screenshot", - "/usr/local/share/applications/wps-office-et.desktop": "/L@wps-office-et", - "/home/tp/.config/dock/scratch/docked:w:42f9e4a33162e38b2febbad0d9e39a3f.desktop": "/D@docked:w:42f9e4a33162e38b2febbad0d9e39a3f", - "/home/tp/.local/share/applications/webtorrent-desktop.desktop": "/H@webtorrent-desktop", -} - -func init() { - homeDir = "/home/tp/" - scratchDir = homeDir + ".config/dock/scratch/" - initPathDirCodeMap() -} - -func Test_addDesktopExt(t *testing.T) { - assert.Equal(t, addDesktopExt("0ad"), "0ad.desktop") - assert.Equal(t, addDesktopExt("0ad.desktop"), "0ad.desktop") - assert.Equal(t, addDesktopExt("0ad.desktop-x"), "0ad.desktop-x.desktop") -} - -func Test_trimDesktopExt(t *testing.T) { - assert.Equal(t, trimDesktopExt("deepin-movie"), "deepin-movie") - assert.Equal(t, trimDesktopExt("deepin-movie.desktop"), "deepin-movie") - assert.Equal(t, trimDesktopExt("deepin-movie.desktop-x"), "deepin-movie.desktop-x") -} - -func Test_zipDesktopPath(t *testing.T) { - for path, zipped := range deskotpFilePathTestMap { - assert.Equal(t, zipped, zipDesktopPath(path)) - } -} - -func Test_unzipDesktopPath(t *testing.T) { - for path, zipped := range deskotpFilePathTestMap { - assert.Equal(t, path, unzipDesktopPath(zipped)) - } -} - -func Test_getDesktopIdByFilePath(t *testing.T) { - path := "/usr/share/applications/deepin-screenshot.desktop" - desktopId := getDesktopIdByFilePath(path) - assert.Equal(t, desktopId, "deepin-screenshot.desktop") - - path = "/usr/share/applications/kde4/krita.desktop" - desktopId = getDesktopIdByFilePath(path) - assert.Equal(t, desktopId, "kde4-krita.desktop") - - path = "/home/tp/.local/share/applications/telegramdesktop.desktop" - desktopId = getDesktopIdByFilePath(path) - assert.Equal(t, desktopId, "telegramdesktop.desktop") - - path = "/home/tp/.local/share/applications/dirfortest/dir2/space test.desktop" - desktopId = getDesktopIdByFilePath(path) - assert.Equal(t, desktopId, "dirfortest-dir2-space test.desktop") -} - -func Test_addDirTrailingSlash(t *testing.T) { - dir := "/usr/shareapplication" - dir2 := addDirTrailingSlash(dir) - assert.Equal(t, dir2, dir+"/") - - dir3 := addDirTrailingSlash(dir2) - assert.Equal(t, dir3, dir2) -} diff --git a/dock/dock_dbusutil.go b/dock/dock_dbusutil.go deleted file mode 100644 index 6ac67bbe3..000000000 --- a/dock/dock_dbusutil.go +++ /dev/null @@ -1,111 +0,0 @@ -// Code generated by "dbusutil-gen -type AppEntry -import=github.com/linuxdeepin/go-x11-client=x app_entry.go"; DO NOT EDIT. - -package dock - -import ( - x "github.com/linuxdeepin/go-x11-client" -) - -func (v *AppEntry) setPropId(value string) (changed bool) { - if v.Id != value { - v.Id = value - v.emitPropChangedId(value) - return true - } - return false -} - -func (v *AppEntry) emitPropChangedId(value string) error { - return v.service.EmitPropertyChanged(v, "Id", value) -} - -func (v *AppEntry) setPropIsActive(value bool) (changed bool) { - if v.IsActive != value { - v.IsActive = value - v.emitPropChangedIsActive(value) - return true - } - return false -} - -func (v *AppEntry) emitPropChangedIsActive(value bool) error { - return v.service.EmitPropertyChanged(v, "IsActive", value) -} - -func (v *AppEntry) setPropName(value string) (changed bool) { - if v.Name != value { - v.Name = value - v.emitPropChangedName(value) - return true - } - return false -} - -func (v *AppEntry) emitPropChangedName(value string) error { - return v.service.EmitPropertyChanged(v, "Name", value) -} - -func (v *AppEntry) setPropIcon(value string) (changed bool) { - if v.Icon != value { - v.Icon = value - v.emitPropChangedIcon(value) - return true - } - return false -} - -func (v *AppEntry) emitPropChangedIcon(value string) error { - return v.service.EmitPropertyChanged(v, "Icon", value) -} - -func (v *AppEntry) setPropDesktopFile(value string) (changed bool) { - if v.DesktopFile != value { - v.DesktopFile = value - v.emitPropChangedDesktopFile(value) - return true - } - return false -} - -func (v *AppEntry) emitPropChangedDesktopFile(value string) error { - return v.service.EmitPropertyChanged(v, "DesktopFile", value) -} - -func (v *AppEntry) setPropCurrentWindow(value x.Window) (changed bool) { - if v.CurrentWindow != value { - v.CurrentWindow = value - v.emitPropChangedCurrentWindow(value) - return true - } - return false -} - -func (v *AppEntry) emitPropChangedCurrentWindow(value x.Window) error { - return v.service.EmitPropertyChanged(v, "CurrentWindow", value) -} - -func (v *AppEntry) setPropIsDocked(value bool) (changed bool) { - if v.IsDocked != value { - v.IsDocked = value - v.emitPropChangedIsDocked(value) - return true - } - return false -} - -func (v *AppEntry) emitPropChangedIsDocked(value bool) error { - return v.service.EmitPropertyChanged(v, "IsDocked", value) -} - -func (v *AppEntry) setPropWindowInfos(value windowInfosType) (changed bool) { - if !v.WindowInfos.Equal(value) { - v.WindowInfos = value - v.emitPropChangedWindowInfos(value) - return true - } - return false -} - -func (v *AppEntry) emitPropChangedWindowInfos(value windowInfosType) error { - return v.service.EmitPropertyChanged(v, "WindowInfos", value) -} diff --git a/dock/dock_manager.go b/dock/dock_manager.go deleted file mode 100644 index 54ab222cc..000000000 --- a/dock/dock_manager.go +++ /dev/null @@ -1,592 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "encoding/json" - "errors" - "fmt" - "os" - "strings" - "sync" - "time" - - "github.com/godbus/dbus" - libApps "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.apps" - kwayland "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.kwayland" - kwin "github.com/linuxdeepin/go-dbus-factory/org.kde.kwin" - launcher "github.com/linuxdeepin/go-dbus-factory/com.deepin.dde.daemon.launcher" - libDDELauncher "github.com/linuxdeepin/go-dbus-factory/com.deepin.dde.launcher" - sessionmanager "github.com/linuxdeepin/go-dbus-factory/com.deepin.sessionmanager" - wm "github.com/linuxdeepin/go-dbus-factory/com.deepin.wm" - wmswitcher "github.com/linuxdeepin/go-dbus-factory/com.deepin.wmswitcher" - configManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" - "github.com/linuxdeepin/go-gir/gio-2.0" - "github.com/linuxdeepin/go-lib/dbusutil" - "github.com/linuxdeepin/go-lib/dbusutil/gsprop" - "github.com/linuxdeepin/go-lib/dbusutil/proxy" - x "github.com/linuxdeepin/go-x11-client" - - "github.com/linuxdeepin/dde-daemon/common/dsync" -) - -type Manager struct { - PropsMu sync.RWMutex - Entries AppEntries - HideMode gsprop.Enum `prop:"access:rw"` - DisplayMode gsprop.Enum `prop:"access:rw"` - Position gsprop.Enum `prop:"access:rw"` - IconSize gsprop.Uint `prop:"access:rw"` - ShowTimeout gsprop.Uint `prop:"access:rw"` - HideTimeout gsprop.Uint `prop:"access:rw"` - WindowSizeEfficient gsprop.Uint `prop:"access:rw"` - WindowSizeFashion gsprop.Uint `prop:"access:rw"` - DockedApps gsprop.Strv - Opacity gsprop.Double - HideState HideStateType - FrontendWindowRect *Rect - - service *dbusutil.Service - sysService *dbusutil.Service - sessionSigLoop *dbusutil.SignalLoop - sysSigLoop *dbusutil.SignalLoop - syncConfig *dsync.Config - clientList windowSlice - clientListInitEnd bool - windowInfoMap map[x.Window]WindowInfoImp - windowInfoMapMutex sync.RWMutex - settings *gio.Settings - appearanceSettings *gio.Settings - pluginSettings *pluginSettingsStorage - - entryDealChan chan func() - rootWindow x.Window - activeWindow WindowInfoImp - activeWindowOld WindowInfoImp - activeWindowMu sync.Mutex - - waylandManager *WaylandManager - - ddeLauncherVisible bool - ddeLauncherVisibleMu sync.Mutex - - smartHideModeTimer *time.Timer - smartHideModeMutex sync.Mutex - - entryCount uint - identifyWindowFuns []*IdentifyWindowFunc - identifyKWindowFuns []*IdentifyKWindowFunc - windowPatterns WindowPatterns - - forceQuitAppStatus forceQuitAppType - windowActMu sync.Mutex - hideRequestDockAndUndockByNameList []string - - // dbus objects: - launcher launcher.Launcher - ddeLauncher libDDELauncher.Launcher - wm wm.Wm - appsObj libApps.Apps - startManager sessionmanager.StartManager - wmSwitcher wmswitcher.WMSwitcher - waylandWM kwayland.WindowManager - kwin kwin.KWin - wmName string - isWaylandSession bool - isMultiTaskViewShow bool - //nolint - signals *struct { - ServiceRestarted struct{} - EntryAdded struct { - path dbus.ObjectPath - index int32 - } - - EntryRemoved struct { - entryId string - } - - PluginSettingsSynced struct{} - DockAppSettingsSynced struct{} - } -} - -const ( - dockSchema = "com.deepin.dde.dock" - appearanceSchema = "com.deepin.dde.appearance" - settingKeyHideMode = "hide-mode" - settingKeyDisplayMode = "display-mode" - settingKeyPosition = "position" - settingKeyIconSize = "icon-size" - settingKeyDockedApps = "docked-apps" - settingKeyShowTimeout = "show-timeout" - settingKeyHideTimeout = "hide-timeout" - settingKeyWindowSizeFashion = "window-size-fashion" - settingKeyWindowSizeEfficient = "window-size-efficient" - settingKeyWinIconPreferredApps = "win-icon-preferred-apps" - settingKeyOpacity = "opacity" - settingKeyPluginSettings = "plugin-settings" - settingKeyForceQuitApp = "force-quit-app" - - frontendWindowWmClass = "dde-dock" - - dbusServiceName = "com.deepin.dde.daemon.Dock" - dbusPath = "/com/deepin/dde/daemon/Dock" - dbusInterface = dbusServiceName -) - -const ( - DSettingsAppID = "org.deepin.dde.daemon" - DSettingsDockName = "org.deepin.dde.daemon.dock" - DSettingsKeyHideRequestDockAndUndockByName = "hideRequestDockAndUndockByName" -) - -func newManager(service *dbusutil.Service) (*Manager, error) { - m := new(Manager) - m.service = service - var err error - m.sysService, err = dbusutil.NewSystemService() - if err != nil { - return nil, err - } - err = m.init() - if err != nil { - return nil, err - } - return m, nil -} - -func (m *Manager) GetInterfaceName() string { - return dbusInterface -} - -func (m *Manager) destroy() { - if m.smartHideModeTimer != nil { - m.smartHideModeTimer.Stop() - m.smartHideModeTimer = nil - } - - if m.settings != nil { - m.settings.Unref() - m.settings = nil - } - - m.launcher.RemoveHandler(proxy.RemoveAllHandlers) - m.ddeLauncher.RemoveHandler(proxy.RemoveAllHandlers) - m.sessionSigLoop.Stop() - m.sysSigLoop.Stop() - m.syncConfig.Destroy() - - err := m.service.StopExport(m) - if err != nil { - logger.Warning(err) - } -} - -func (m *Manager) launch(desktopFile string, timestamp uint32, files []string) { - err := m.startManager.LaunchApp(dbus.FlagNoAutoStart, desktopFile, timestamp, files) - if err != nil { - logger.Warningf("launch %q failed: %v", desktopFile, err) - } -} - -// ActivateWindow会激活给定id的窗口,被激活的窗口通常会成为焦点窗口。 -func (m *Manager) ActivateWindow(win uint32) *dbus.Error { - winInfo, err := m.getWindowInfo(x.Window(win)) - if err != nil { - return dbusutil.ToError(err) - } - - err = winInfo.activate() - - if err != nil { - logger.Warning("Activate window failed:", err) - return dbusutil.ToError(err) - } - return nil -} - -// CloseWindow会将传入id的窗口关闭。 -func (m *Manager) CloseWindow(win uint32) *dbus.Error { - winInfo, err := m.getWindowInfo(x.Window(win)) - if err != nil { - return dbusutil.ToError(err) - } - - err = winInfo.activate() - if err != nil { - logger.Warning("Activate window failed:", err) - return dbusutil.ToError(err) - } - - err = winInfo.close(0) - if err != nil { - logger.Warning("Close window failed:", err) - return dbusutil.ToError(err) - } - - return nil -} - -func (m *Manager) MaximizeWindow(win uint32) *dbus.Error { - winInfo, err := m.getWindowInfo(x.Window(win)) - if err != nil { - return dbusutil.ToError(err) - } - - err = winInfo.activate() - if err != nil { - logger.Warning("active window failed:", err) - return dbusutil.ToError(err) - } - - err = winInfo.maximize() - - if err != nil { - logger.Warning("maximize window failed:", err) - return dbusutil.ToError(err) - } - return nil -} - -func (m *Manager) MinimizeWindow(win uint32) *dbus.Error { - winInfo, err := m.getWindowInfo(x.Window(win)) - if err != nil { - return dbusutil.ToError(err) - } - - err = winInfo.minimize() - if err != nil { - logger.Warning("minimize window failed:", err) - return dbusutil.ToError(err) - } - return nil -} - -func (m *Manager) MakeWindowAbove(win uint32) *dbus.Error { - winInfo, err := m.getWindowInfo(x.Window(win)) - if err != nil { - return dbusutil.ToError(err) - } - - err = winInfo.activate() - if err != nil { - logger.Warning("active window failed:", err) - return dbusutil.ToError(err) - } - - err = winInfo.makeWindowAbove() - - if err != nil { - logger.Warning("make window above failed:", err) - return dbusutil.ToError(err) - } - return nil -} - -func (m *Manager) MoveWindow(win uint32) *dbus.Error { - err := m.ActivateWindow(win) - if err != nil { - return err - } - - err1 := moveWindow(x.Window(win)) - if err1 != nil { - logger.Warning("move window failed:", err) - return dbusutil.ToError(err1) - } - return nil -} - -func (m *Manager) PreviewWindow(win uint32) *dbus.Error { - err := m.wm.PreviewWindow(dbus.FlagNoAutoStart, win) - return dbusutil.ToError(err) -} - -func (m *Manager) CancelPreviewWindow() *dbus.Error { - err := m.wm.CancelPreviewWindow(dbus.FlagNoAutoStart) - return dbusutil.ToError(err) -} - -// for debug -func (m *Manager) GetEntryIDs() (list []string, busErr *dbus.Error) { - entries := &m.Entries - entries.mu.RLock() - list = make([]string, 0, len(entries.items)) - for _, entry := range entries.items { - var appId string - if entry.appInfo != nil { - appId = entry.appInfo.GetId() - } else { - appId = entry.innerId - } - list = append(list, appId) - } - entries.mu.RUnlock() - return list, nil -} - -func (m *Manager) SetFrontendWindowRect(x, y int32, width, height uint32) *dbus.Error { - if m.FrontendWindowRect.X == x && - m.FrontendWindowRect.Y == y && - m.FrontendWindowRect.Width == width && - m.FrontendWindowRect.Height == height { - logger.Debug("SetFrontendWindowRect no changed") - return nil - } - m.FrontendWindowRect.X = x - m.FrontendWindowRect.Y = y - m.FrontendWindowRect.Width = width - m.FrontendWindowRect.Height = height - err := m.service.EmitPropertyChanged(m, "FrontendWindowRect", m.FrontendWindowRect) - if err != nil { - logger.Warning("EmitPropertyChanged error:", err) - } - m.updateHideState(false) - return nil -} - -func (m *Manager) IsDocked(desktopFile string) (docked bool, busErr *dbus.Error) { - desktopFile = toLocalPath(desktopFile) - entry, err := m.getDockedAppEntryByDesktopFilePath(desktopFile) - if err != nil { - return false, dbusutil.ToError(err) - } - return entry != nil, nil -} - -func (m *Manager) requestDock(desktopFile string, index int32) (bool, error) { - logger.Debug("requestDock", desktopFile, index) - desktopFile = toLocalPath(desktopFile) - appInfo := NewAppInfoFromFile(desktopFile) - if appInfo == nil { - return false, errors.New("invalid desktopFilePath") - } - var newlyCreated bool - entry := m.Entries.GetByInnerId(appInfo.innerId) - if entry == nil { - entry = newAppEntry(m, appInfo.innerId, appInfo) - newlyCreated = true - } - - docked, err := m.dockEntry(entry) - if err != nil { - return false, err - } - - if newlyCreated { - err = m.exportAppEntry(entry) - if err != nil { - return false, err - } - m.Entries.Insert(entry, int(index)) - } - - if docked { - // need to save after insert - m.saveDockedApps() - } - return docked, nil -} - -func (m *Manager) RequestDock(desktopFile string, index int32) (docked bool, busErr *dbus.Error) { - docked, err := m.requestDock(desktopFile, index) - return docked, dbusutil.ToError(err) -} - -func (m *Manager) RequestUndock(desktopFile string) (undocked bool, busErr *dbus.Error) { - undocked, err := m.requestUndock(desktopFile) - return undocked, dbusutil.ToError(err) -} - -func (m *Manager) requestUndock(desktopFile string) (bool, error) { - desktopFile = toLocalPath(desktopFile) - entry, err := m.getDockedAppEntryByDesktopFilePath(desktopFile) - if err != nil { - return false, err - } - if entry == nil { - return false, nil - } - m.undockEntry(entry) - return true, nil -} - -func (m *Manager) MoveEntry(index, newIndex int32) *dbus.Error { - err := m.Entries.Move(int(index), int(newIndex)) - if err != nil { - logger.Warning("MoveEntry failed:", err) - return dbusutil.ToError(err) - } - logger.Debug("MoveEntry ok") - m.saveDockedApps() - return nil -} - -func (m *Manager) IsOnDock(desktopFile string) (onDock bool, busErr *dbus.Error) { - desktopFile = toLocalPath(desktopFile) - entry, err := m.Entries.GetByDesktopFilePath(desktopFile) - if err != nil { - return false, dbusutil.ToError(err) - } - return entry != nil, nil -} - -func (m *Manager) QueryWindowIdentifyMethod(wid uint32) (method string, busErr *dbus.Error) { - m.Entries.mu.RLock() - defer m.Entries.mu.RUnlock() - - for _, entry := range m.Entries.items { - winInfo, ok := entry.windows[x.Window(wid)] - if ok { - appInfo := winInfo.getAppInfo() - if appInfo != nil { - return appInfo.identifyMethod, nil - } else { - return "Failed", nil - } - } - } - return "", dbusutil.ToError(fmt.Errorf("window %d not found", wid)) -} - -func (m *Manager) GetDockedAppsDesktopFiles() (desktopFiles []string, busErr *dbus.Error) { - for _, entry := range m.Entries.FilterDocked() { - if entry.appInfo != nil { - desktopFiles = append(desktopFiles, entry.appInfo.GetFileName()) - } - } - return desktopFiles, nil -} - -func (m *Manager) GetPluginSettings() (jsonStr string, busErr *dbus.Error) { - jsonStr, err := m.pluginSettings.getJsonStr() - if err != nil { - return "", dbusutil.ToError(err) - } - return jsonStr, nil -} - -func (m *Manager) SetPluginSettings(jsonStr string) *dbus.Error { - var v pluginSettings - err := json.Unmarshal([]byte(jsonStr), &v) - if err != nil { - return dbusutil.ToError(err) - } - m.pluginSettings.set(v) - return nil -} - -func (m *Manager) MergePluginSettings(jsonStr string) *dbus.Error { - var v pluginSettings - err := json.Unmarshal([]byte(jsonStr), &v) - if err != nil { - return dbusutil.ToError(err) - } - - m.pluginSettings.merge(v) - return nil -} - -func (m *Manager) RemovePluginSettings(key1 string, key2List []string) *dbus.Error { - m.pluginSettings.remove(key1, key2List) - return nil -} - -// 在Dock添加上添加图标的时候,有时候windowInfo不完整 -// 会重复尝试10次,为了避免阻塞其他功能,放在goroutine里处理 -// 窗口的增加和减少是有顺序的,在这个单独的goroutine里处理 -func (m *Manager) accessEntries() { - for { - fun := <-m.entryDealChan - fun() - } -} - -func (m *Manager) findWindowByXidX(win x.Window) (winInfo WindowInfoImp) { - m.windowInfoMapMutex.RLock() - winInfo, ok := m.windowInfoMap[win] - m.windowInfoMapMutex.RUnlock() - if ok { - val, ret := (winInfo).(*WindowInfo) - if ret { - return val - } - } - return nil -} - -func (m *Manager) findWindowByXidK(win x.Window) (winInfo WindowInfoImp) { - m.waylandManager.mu.Lock() - for _, windowInfo := range m.waylandManager.windows { - if windowInfo.getXid() == win { - m.waylandManager.mu.Unlock() - return windowInfo - } - } - m.waylandManager.mu.Unlock() - return nil -} - -func (m *Manager) findWindowByXid(win x.Window) (winInfo WindowInfoImp) { - winInfo = m.findWindowByXidX(win) - if winInfo != nil { - return winInfo - } - - sessionType := os.Getenv("XDG_SESSION_TYPE") - if strings.Contains(sessionType, "wayland") { - return m.findWindowByXidK(win) - } - return -} - -func (m *Manager) findXWindowInfo(win x.Window) *WindowInfo { - m.windowInfoMapMutex.RLock() - winInfo := m.windowInfoMap[win] - m.windowInfoMapMutex.RUnlock() - val, ok := (winInfo).(*WindowInfo) - if ok { - return val - } - return nil -} - -func (m *Manager) initDSettings(conn *dbus.Conn) { - ds := configManager.NewConfigManager(conn) - dsPath, err := ds.AcquireManager(0, DSettingsAppID, DSettingsDockName, "") - if err != nil { - logger.Warning(err) - return - } - dockDS, err := configManager.NewManager(conn, dsPath) - if err != nil { - logger.Warning(err) - return - } - getHideRequestDockAndUndockByNameList := func() { - v, err := dockDS.Value(0, DSettingsKeyHideRequestDockAndUndockByName) - if err != nil { - logger.Warning(err) - return - } - itemList := v.Value().([]dbus.Variant) - for _, i := range itemList { - m.hideRequestDockAndUndockByNameList = append(m.hideRequestDockAndUndockByNameList, i.Value().(string)) - } - } - getHideRequestDockAndUndockByNameList() - dockDS.InitSignalExt(m.sysSigLoop, true) - // 监听dsg配置变化 - _, err = dockDS.ConnectValueChanged(func(key string) { - switch key { - case DSettingsKeyHideRequestDockAndUndockByName: - getHideRequestDockAndUndockByNameList() - } - }) - if err != nil { - logger.Warning(err) - } -} diff --git a/dock/dock_manager_dock_app.go b/dock/dock_manager_dock_app.go deleted file mode 100644 index ca5051059..000000000 --- a/dock/dock_manager_dock_app.go +++ /dev/null @@ -1,230 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "errors" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "strings" - - dutils "github.com/linuxdeepin/go-lib/utils" -) - -const dockedItemTemplate string = `[Desktop Entry] -Name=%s -Exec=%s -Icon=%s -Type=Application -Terminal=false -StartupNotify=false -` - -type dockedItemInfo struct { - Name, Icon, Exec string -} - -func createScratchDesktopFile(id, title, icon, cmd string) (string, error) { - logger.Debugf("create scratch file for %q", id) - filename := filepath.Join(scratchDir, addDesktopExt(id)) - dockedItem := dockedItemInfo{title, icon, cmd} - logger.Debugf("dockedItem: %#v", dockedItem) - content := fmt.Sprintf(dockedItemTemplate, dockedItem.Name, dockedItem.Exec, dockedItem.Icon) - // #nosec G306 - err := ioutil.WriteFile(filename, []byte(content), 0644) - if err != nil { - return "", err - } - return filename, nil -} - -func removeScratchFiles(desktopFile string) { - fileNoExt := trimDesktopExt(desktopFile) - logger.Debug("removeScratchFiles", fileNoExt) - extList := []string{".desktop", ".sh", ".png"} - for _, ext := range extList { - file := fileNoExt + ext - if dutils.IsFileExist(file) { - logger.Debugf("remove scratch file %q", file) - err := os.Remove(file) - if err != nil { - logger.Warningf("failed to remove scratch file %q: %v", file, err) - } - } - } -} - -func createScratchDesktopFileWithAppEntry(entry *AppEntry) (string, error) { - // #nosec G301 - err := os.MkdirAll(scratchDir, 0755) - if err != nil { - return "", err - } - - if entry.appInfo != nil { - desktopFile := entry.appInfo.GetFileName() - newDesktopFile := filepath.Join(scratchDir, entry.appInfo.innerId+".desktop") - err := copyFileContents(desktopFile, newDesktopFile) - if err != nil { - return "", err - } - return newDesktopFile, nil - } - - if entry.current == nil { - return "", errors.New("entry.current is nil") - } - appId := entry.current.getInnerId() - title := entry.current.getDisplayName() - // icon - icon := entry.current.getIcon() - if strings.HasPrefix(icon, "data:image") { - path, err := dataUriToFile(icon, filepath.Join(scratchDir, appId+".png")) - if err != nil { - logger.Warning(err) - icon = "" - } else { - icon = path - } - } - if icon == "" { - icon = "application-default-icon" - } - - // cmd - scriptContent := entry.getExec(false) - scriptFile := filepath.Join(scratchDir, appId+".sh") - // #nosec G306 - err = ioutil.WriteFile(scriptFile, []byte(scriptContent), 0744) - if err != nil { - return "", err - } - cmd := scriptFile + " %U" - - file, err := createScratchDesktopFile(appId, title, icon, cmd) - if err != nil { - return "", err - } - return file, nil -} - -func (m *Manager) getDockedAppEntryByDesktopFilePath(desktopFilePath string) (*AppEntry, error) { - return getByDesktopFilePath(m.Entries.FilterDocked(), desktopFilePath) -} - -func (m *Manager) saveDockedApps() { - var list []string - for _, entry := range m.Entries.FilterDocked() { - path := entry.appInfo.GetFileName() - list = append(list, zipDesktopPath(path)) - } - m.DockedApps.Set(list) -} - -func needScratchDesktop(appInfo *AppInfo) bool { - if appInfo == nil { - logger.Debug("needScratchDesktop: yes, appInfo is nil") - return true - } - if appInfo.IsInstalled() { - logger.Debug("needScratchDesktop: no, desktop is installed") - return false - } - file := appInfo.GetFileName() - if isFileInDir(file, scratchDir) { - logger.Debug("needScratchDesktop: no, desktop in scratchDir") - return false - } - logger.Debug("needScratchDesktop: yes") - return true -} - -func (m *Manager) dockEntry(entry *AppEntry) (bool, error) { - entry.PropsMu.Lock() - - if entry.IsDocked { - logger.Warningf("dockEntry failed: entry %v is docked", entry.Id) - entry.PropsMu.Unlock() - return false, nil - } - if needScratchDesktop(entry.appInfo) { - file, err := createScratchDesktopFileWithAppEntry(entry) - if err != nil { - logger.Warning("createScratchDesktopFileWithAppEntry failed", err) - entry.PropsMu.Unlock() - return false, err - } - logger.Debug("dockEntry: createScratchDesktopFile successfully", file) - appInfo := NewAppInfoFromFile(file) - entry.setAppInfo(appInfo) - entry.updateIcon() - entry.innerId = entry.appInfo.innerId - } - - entry.setPropIsDocked(true) - entry.updateMenu() - entry.PropsMu.Unlock() - return true, nil -} - -func isFileInDir(file, dir string) bool { - fileDir := filepath.Dir(file) - return fileDir == dir -} - -func (m *Manager) undockEntry(entry *AppEntry) { - entry.PropsMu.RLock() - if !entry.IsDocked { - logger.Warningf("undockEntry failed: entry %v is not docked", entry.Id) - entry.PropsMu.RUnlock() - return - } - - if entry.appInfo == nil { - logger.Warning("undockEntry failed: entry.appInfo is nil") - entry.PropsMu.RUnlock() - return - } - desktop := entry.appInfo.GetFileName() - logger.Debugf("undockEntry desktop: %q", desktop) - isDesktopInScratchDir := false - if isFileInDir(desktop, scratchDir) { - isDesktopInScratchDir = true - removeScratchFiles(entry.appInfo.GetFileName()) - } - - hasWin := entry.hasWindow() - entry.PropsMu.RUnlock() - - if !hasWin { - m.removeAppEntry(entry) - } else { - entry.PropsMu.Lock() - - if isDesktopInScratchDir && entry.current != nil { - if strings.HasPrefix(filepath.Base(desktop), windowHashPrefix) { - // desktop base starts with w: - // 由于有 Pid 识别方法在,在这里不能用 m.identifyWindow 再次识别 - entry.innerId = entry.current.getInnerId() - entry.setAppInfo(nil) - } else { - // desktop base starts with d: - var newAppInfo *AppInfo - logger.Debug("re-identify window", entry.current.getInnerId()) - entry.innerId, newAppInfo = m.identifyWindow(entry.current) - entry.setAppInfo(newAppInfo) - } - } - entry.updateIcon() - entry.setPropIsDocked(false) - entry.updateName() - entry.updateMenu() - - entry.PropsMu.Unlock() - } - m.saveDockedApps() -} diff --git a/dock/dock_manager_entries.go b/dock/dock_manager_entries.go deleted file mode 100644 index 79aa44423..000000000 --- a/dock/dock_manager_entries.go +++ /dev/null @@ -1,187 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "fmt" - "sort" - - dbus "github.com/godbus/dbus" - "github.com/linuxdeepin/go-x11-client/util/wm/ewmh" - "github.com/linuxdeepin/dde-daemon/session/common" -) - -func (m *Manager) allocEntryId() string { - m.PropsMu.Lock() - - num := m.entryCount - m.entryCount++ - - m.PropsMu.Unlock() - - return fmt.Sprintf("e%dT%x", num, getCurrentTimestamp()) -} - -func (m *Manager) markAppLaunched(appInfo *AppInfo) { - if !m.clientListInitEnd || appInfo == nil { - return - } - file := appInfo.GetFileName() - logger.Debug("markAppLaunched", file) - - go func() { - err := common.ActivateSysDaemonService(m.appsObj.ServiceName_()) - if err != nil { - logger.Warning(err) - } - - err = m.appsObj.LaunchedRecorder().MarkLaunched(0, file) - if err != nil { - logger.Debug(err) - } - }() -} - -func (m *Manager) shouldShowOnDock(winInfo WindowInfoImp) bool { - switch winInfo.(type) { - case *WindowInfo: - win := winInfo.getXid() - isReg := m.isWindowRegistered(win) - clientListContains := m.clientList.Contains(win) - shouldSkip := winInfo.shouldSkip() - isGood := isGoodWindow(win) - logger.Debugf("isReg: %v, client list contains: %v, shouldSkip: %v, isGood: %v", - isReg, clientListContains, shouldSkip, isGood) - - showOnDock := isReg && clientListContains && isGood && !shouldSkip - return showOnDock - - case *KWindowInfo: - return !winInfo.shouldSkip() - default: - return false - } -} - -func (m *Manager) attachOrDetachWindow(winInfo WindowInfoImp) { - win := winInfo.getXid() - showOnDock := m.shouldShowOnDock(winInfo) - logger.Debugf("win %v showOnDock? %v", win, showOnDock) - - // attach 或 detach 操作顺序执行 - m.windowActMu.Lock() - defer m.windowActMu.Unlock() - - entry := winInfo.getEntry() - if entry != nil { - if !showOnDock { - m.detachWindow(winInfo) - } else { - logger.Debugf("win %v nothing to do", win) - } - } else { - if winInfo.getEntryInnerId() == "" { - logger.Debugf("winInfo.entryInnerId is empty, call identifyWindow, win: %d", winInfo.getXid()) - entryInnerId, appInfo := m.identifyWindow(winInfo) - winInfo.setEntryInnerId(entryInnerId) - winInfo.setAppInfo(appInfo) - m.markAppLaunched(appInfo) - } else { - logger.Debugf("win %v identified", win) - } - - // winInfo初始化后影响判断是否在任务栏显示图标 - if m.shouldShowOnDock(winInfo) { - m.attachWindow(winInfo) - } - } -} - -func (m *Manager) initClientList() { - clientList, err := ewmh.GetClientList(globalXConn).Reply(globalXConn) - if err != nil { - logger.Warning("Get client list failed:", err) - return - } - winSlice := windowSlice(clientList) - sort.Sort(winSlice) - m.clientList = winSlice - for _, win := range winSlice { - winInfo := m.registerWindow(win) - m.attachOrDetachWindow(winInfo) - } -} - -func (m *Manager) initDockedApps() { - dockedApps := uniqStrSlice(m.DockedApps.Get()) - for _, app := range dockedApps { - m.appendDockedApp(app) - } - m.saveDockedApps() -} - -func (m *Manager) exportAppEntry(e *AppEntry) error { - err := m.service.Export(dbus.ObjectPath(entryDBusObjPathPrefix+e.Id), e) - if err != nil { - logger.Warning("failed to export AppEntry:", err) - return err - } - return nil -} - -func (m *Manager) appendDockedApp(app string) { - logger.Debugf("appendDockedApp %q", app) - appInfo := NewDockedAppInfo(app) - if appInfo == nil { - logger.Warning("appendDockedApp failed: appInfo is nil") - return - } - - entry := newAppEntry(m, appInfo.innerId, appInfo) - entry.setPropIsDocked(true) - entry.updateMenu() - err := m.exportAppEntry(entry) - if err == nil { - m.Entries.Append(entry) - } -} - -func (m *Manager) removeAppEntry(e *AppEntry) { - if e == nil { - return - } - logger.Info("removeAppEntry id:", e.Id) - m.Entries.Remove(e) -} - -func (m *Manager) attachWindow(winInfo WindowInfoImp) { - entry := m.Entries.GetByInnerId(winInfo.getEntryInnerId()) - - if entry != nil { - // existed - entry.attachWindow(winInfo) - } else { - entry = newAppEntry(m, winInfo.getEntryInnerId(), winInfo.getAppInfo()) - ok := entry.attachWindow(winInfo) - if ok { - err := m.exportAppEntry(entry) - if err == nil { - m.Entries.Append(entry) - } - } - } -} - -func (m *Manager) detachWindow(winInfo WindowInfoImp) { - entry := m.Entries.getByWindowId(winInfo.getXid()) - if entry == nil { - logger.Warningf("entry of window %d is nil", winInfo.getXid()) - return - } - needRemove := entry.detachWindow(winInfo) - if needRemove { - m.removeAppEntry(entry) - } -} diff --git a/dock/dock_manager_hide_state.go b/dock/dock_manager_hide_state.go deleted file mode 100644 index 0e505fb48..000000000 --- a/dock/dock_manager_hide_state.go +++ /dev/null @@ -1,387 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "errors" - "time" - - x "github.com/linuxdeepin/go-x11-client" - "github.com/linuxdeepin/go-x11-client/util/wm/ewmh" -) - -func max(a, b int) int { - if a < b { - return b - } - return a -} - -func min(a, b int) int { - if a < b { - return a - } - return b -} - -func hasIntersection(rectA, rectB *Rect) bool { - if rectA == nil || rectB == nil { - logger.Warning("hasIntersection rectA or rectB is nil") - return false - } - x, y, w, h := rectA.Pieces() - x1, y1, w1, h1 := rectB.Pieces() - ax := max(x, x1) - ay := max(y, y1) - bx := min(x+w, x1+w1) - by := min(y+h, y1+h1) - return ax < bx && ay < by -} - -func (m *Manager) hasIntersectionK(rectA, rectB *Rect) bool { - if rectA == nil || rectB == nil { - logger.Warning("hasIntersectionK rectA or rectB is nil") - return false - } - x, y, w, h := rectA.Pieces() - x1, y1, w1, h1 := rectB.Pieces() - ax := max(x, x1) - ay := max(y, y1) - bx := min(x+w, x1+w1) - by := min(y+h, y1+h1) - positionVal := m.Position.Get() - logger.Debug("positionVal=", positionVal) - if positionVal == int32(positionRight) || positionVal == int32(positionLeft) { - return ax <= bx && ay < by - } else if positionVal == int32(positionTop) || positionVal == int32(positionBottom) { - return ax < bx && ay <= by - } else { - return ax < bx && ay < by - } -} - -func (m *Manager) getActiveWinGroup(activeWin x.Window) (ret []x.Window) { - - ret = []x.Window{activeWin} - - list, err := ewmh.GetClientListStacking(globalXConn).Reply(globalXConn) - if err != nil { - logger.Warning(err) - return - } - - idx := -1 - for i, win := range list { - if win == activeWin { - idx = i - break - } - } - if idx == -1 { - logger.Warning("getActiveWinGroup: not found active window in clientListStacking") - return - } else if idx == 0 { - return - } - - aPid := getWmPid(activeWin) - aLeaderWin, _ := getWmClientLeader(activeWin) - - for i := idx - 1; i >= 0; i-- { - win := list[i] - pid := getWmPid(win) - if aPid != 0 && pid == aPid { - // ok - ret = append(ret, win) - continue - } - - wmClass, _ := getWmClass(win) - if wmClass != nil && wmClass.Class == frontendWindowWmClass { - // skip over frontend window - continue - } - - leaderWin, _ := getWmClientLeader(win) - if aLeaderWin != 0 && leaderWin == aLeaderWin { - // ok - ret = append(ret, win) - continue - } - - aboveWin := list[i+1] - aboveWinTransientFor, _ := getWmTransientFor(aboveWin) - if aboveWinTransientFor != 0 && aboveWinTransientFor == win { - // ok - ret = append(ret, win) - continue - } - - break - } - return -} - -func (m *Manager) isWindowDockOverlap(win x.Window) (bool, error) { - // overlap condition: - // window type is not desktop - // window opacity is not zero - // window showing and on current workspace, - // window dock rect has intersection - - windowType, err := ewmh.GetWMWindowType(globalXConn, win).Reply(globalXConn) - - if err == nil && atomsContains(windowType, atomNetWmWindowTypeDesktop) { - return false, nil - } - - opacity, err := getWmWindowOpacity(win) - if err == nil && opacity == 0 { - return false, nil - } - - if isHiddenPre(win) || (!onCurrentWorkspacePre(win)) { - logger.Debugf("window %v is hidden or not on current workspace", win) - return false, nil - } - - winRect, err := getWindowGeometry(globalXConn, win) - if err != nil { - logger.Warning("Get target window geometry failed", err) - return false, err - } - - // 与dock区域完全重合的情况认为就是dock本身 - if winRect.X == m.FrontendWindowRect.X && - winRect.Y == m.FrontendWindowRect.Y && - winRect.Height == m.FrontendWindowRect.Height && - winRect.Width == m.FrontendWindowRect.Width { - logger.Warning("FrontendWindowRect' geometry is the same as winRect' geometry") - return false, nil - } - logger.Debug("window rect:", winRect) - logger.Debug("dock rect:", m.FrontendWindowRect) - return hasIntersection(winRect, m.FrontendWindowRect), nil -} - -const ( - ddeLauncherWMClass = "dde-launcher" -) - -func isDDELauncher(win x.Window) (bool, error) { - winClass, err := getWmClass(win) - if err != nil { - return false, err - } - return winClass.Instance == ddeLauncherWMClass, nil -} - -func (m *Manager) getActiveWindow() (activeWin WindowInfoImp) { - m.activeWindowMu.Lock() - if m.activeWindow == nil { - activeWin = m.activeWindowOld - } else { - activeWin = m.activeWindow - } - m.activeWindowMu.Unlock() - return -} - -func (m *Manager) shouldHideOnSmartHideModeX(activeWin x.Window) (bool, error) { - isLauncher, err := isDDELauncher(activeWin) - if err != nil { - logger.Warning(err) - } - if isLauncher { - // dde launcher is invisible, but it is still active window - logger.Debug("shouldHideOnSmartHideMode: active window is dde launcher") - return false, nil - } - - isShowDesktop, err := ewmh.GetShowingDesktop(globalXConn).Reply(globalXConn) - if err != nil { - logger.Warning(err) - } - - // 当显示桌面时,不去隐藏任务栏 - if isShowDesktop { - return false, nil - } - - list, err := ewmh.GetClientListStacking(globalXConn).Reply(globalXConn) - if err != nil { - logger.Warning(err) - } - - logger.Debug("shouldHideOnSmartHideMode: current window stack list", list) - - // 当激活的窗口有变化时,去遍历当前的窗口栈中的窗口,而不只是激活的窗口,看是否有窗口和任务栏显示有重叠 - for _, win := range list { - over, err := m.isWindowDockOverlap(win) - if err != nil { - logger.Warning(err) - } - logger.Debugf("shouldHideOnSmartHideMode: win %d dock overlap %v", win, over) - if over { - return true, nil - } - } - return false, nil -} - -func (m *Manager) shouldHideOnSmartHideModeK(activeWin *KWindowInfo) (bool, error) { - // 向窗管小伙伴讨教了一下,这里的currentDesktop - 1 后才和wayland下通过kwayland拿到的virtualDesktop相等 - currentDesktop, _ := m.kwin.CurrentDesktop(0) - - isShowDesktop, err := m.wm.GetIsShowDesktop(0) - if err != nil { - logger.Warning(err) - } - if isShowDesktop { - return false, nil - } - - for _, winInfo := range m.waylandManager.windows { - // 最小化的窗口不用关心 - minimized, err := winInfo.winObj.IsMinimized(0) - - // 非当前工作区的窗口不用关心 - virtualDesktop, _ := winInfo.winObj.VirtualDesktop(0) - - // 一些置顶的窗口过滤掉,例如输入法的小窗口 - isKeepAbove, _ := winInfo.winObj.IsKeepAbove(0) - if err != nil { - logger.Warning(err) - continue - } - - if minimized || virtualDesktop != uint32(currentDesktop-1) || isKeepAbove { - logger.Debugf("window %v is hidden or keepAbove or not on current workspace", winInfo.appId) - continue - } - - hide, _ := m.isWindowDockOverlapK(winInfo) - if hide { - return true, nil - } - } - - return false, nil -} - -func (m *Manager) shouldHideOnSmartHideMode() (bool, error) { - if m.isMultiTaskViewShow { - logger.Debug("shouldHideOnSmartHideMode: multitaskview is visible") - return true, nil - } - - activeWinInfo := m.getActiveWindow() - if activeWinInfo == nil { - logger.Debug("shouldHideOnSmartHideMode: activeWinInfo is nil") - return false, errors.New("activeWinInfo is nil") - } - if m.isDDELauncherVisible() { - logger.Debug("shouldHideOnSmartHideMode: dde launcher is visible") - return false, nil - } - - switch winInfo := activeWinInfo.(type) { - case *WindowInfo: - activeWin := winInfo.getXid() - return m.shouldHideOnSmartHideModeX(activeWin) - case *KWindowInfo: - return m.shouldHideOnSmartHideModeK(winInfo) - default: - return false, errors.New("invalid type WindowInfo") - } -} - -func (m *Manager) smartHideModeTimerExpired() { - logger.Debug("smartHideModeTimer expired!") - shouldHide, err := m.shouldHideOnSmartHideMode() - if err != nil { - logger.Warning(err) - m.setPropHideState(HideStateUnknown) - return - } - - if shouldHide { - m.setPropHideState(HideStateHide) - } else { - m.setPropHideState(HideStateShow) - } -} - -func (m *Manager) resetSmartHideModeTimer(delay time.Duration) { - m.smartHideModeMutex.Lock() - defer m.smartHideModeMutex.Unlock() - - m.smartHideModeTimer.Reset(delay) - logger.Debug("reset smart hide mode timer ", delay) -} - -func (m *Manager) updateHideState(delay bool) { - if m.isDDELauncherVisible() { - logger.Debug("updateHideState: dde launcher is visible, show dock") - m.setPropHideState(HideStateShow) - return - } - - hideMode := HideModeType(m.HideMode.Get()) - logger.Debug("updateHideState: mode is", hideMode) - switch hideMode { - case HideModeKeepShowing: - m.setPropHideState(HideStateShow) - - case HideModeKeepHidden: - m.setPropHideState(HideStateHide) - - case HideModeSmartHide: - if delay { - m.resetSmartHideModeTimer(time.Millisecond * 400) - } else { - m.resetSmartHideModeTimer(0) - } - } -} - -func (m *Manager) setPropHideState(hideState HideStateType) { - logger.Debug("setPropHideState", hideState) - if hideState == HideStateUnknown { - logger.Warning("try setPropHideState to Unknown") - return - } - - m.PropsMu.Lock() - if m.HideState != hideState { - logger.Debugf("HideState %v => %v", m.HideState, hideState) - m.HideState = hideState - _ = m.service.EmitPropertyChanged(m, "HideState", m.HideState) - } - m.PropsMu.Unlock() -} - -func (m *Manager) isWindowDockOverlapK(winInfo *KWindowInfo) (bool, error) { - geo := winInfo.geometry - winRect := &Rect{ - X: geo.X, - Y: geo.Y, - Width: uint32(geo.Width), - Height: uint32(geo.Height), - } - logger.Debugf("window [%s] rect: %v", winInfo.appId, winRect) - logger.Debug("dock rect:", m.FrontendWindowRect) - - if winInfo.appId == "dde-desktop" || - winInfo.appId == "dde-lock" || - winInfo.appId == "dde-shutdown" || - winInfo.appId == "reset-password-dialog" || - winInfo.appId == "deepin-screen-recorder" { - logger.Debug("Active Window is dde-desktop/dde-lock/dde-shutdowm/deepin-screen-recorder && return isWindowDockOverlapK false") - return false, nil - } - - return m.hasIntersectionK(winRect, m.FrontendWindowRect), nil -} diff --git a/dock/dock_manager_hide_state_test.go b/dock/dock_manager_hide_state_test.go deleted file mode 100644 index 7aaff05c4..000000000 --- a/dock/dock_manager_hide_state_test.go +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_hasIntersection(t *testing.T) { - rect1 := Rect{0, 0, 100, 100} - rect2 := Rect{0, 0, 50, 50} - rect3 := Rect{1, 1, 30, 30} - rect4 := Rect{32, 1, 15, 20} - rect5 := Rect{32, 22, 15, 15} - - assert.True(t, hasIntersection(&rect2, &rect1)) - assert.True(t, hasIntersection(&rect3, &rect1)) - assert.True(t, hasIntersection(&rect3, &rect2)) - assert.True(t, hasIntersection(&rect4, &rect1)) - assert.True(t, hasIntersection(&rect4, &rect2)) - assert.False(t, hasIntersection(&rect4, &rect3)) - assert.True(t, hasIntersection(&rect5, &rect1)) - assert.True(t, hasIntersection(&rect5, &rect2)) - assert.False(t, hasIntersection(&rect5, &rect3)) - assert.False(t, hasIntersection(&rect5, &rect4)) -} diff --git a/dock/dock_manager_init.go b/dock/dock_manager_init.go deleted file mode 100644 index 5664c9fc3..000000000 --- a/dock/dock_manager_init.go +++ /dev/null @@ -1,361 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "os" - "strings" - "time" - - "github.com/godbus/dbus" - libApps "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.apps" - kwayland "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.kwayland" - kwin "github.com/linuxdeepin/go-dbus-factory/org.kde.kwin" - launcher "github.com/linuxdeepin/go-dbus-factory/com.deepin.dde.daemon.launcher" - libDDELauncher "github.com/linuxdeepin/go-dbus-factory/com.deepin.dde.launcher" - sessionmanager "github.com/linuxdeepin/go-dbus-factory/com.deepin.sessionmanager" - wm "github.com/linuxdeepin/go-dbus-factory/com.deepin.wm" - wmswitcher "github.com/linuxdeepin/go-dbus-factory/com.deepin.wmswitcher" - gio "github.com/linuxdeepin/go-gir/gio-2.0" - "github.com/linuxdeepin/go-lib/dbusutil" - "github.com/linuxdeepin/go-lib/gsettings" - x "github.com/linuxdeepin/go-x11-client" - - "github.com/linuxdeepin/dde-daemon/common/dsync" -) - -const ( - ddeDataDir = "/usr/share/dde/data" - windowPatternsFile = ddeDataDir + "/window_patterns.json" -) - -func (m *Manager) initEntries() { - m.initDockedApps() - m.Entries.insertCb = func(entry *AppEntry, index int) { - entryObjPath := dbus.ObjectPath(entryDBusObjPathPrefix + entry.Id) - logger.Debug("entry added", entry.Id, index) - _ = m.service.Emit(m, "EntryAdded", entryObjPath, int32(index)) - } - m.Entries.removeCb = func(entry *AppEntry) { - _ = m.service.Emit(m, "EntryRemoved", entry.Id) - go func() { - time.Sleep(time.Second) - err := m.service.StopExport(entry) - if err != nil { - logger.Warning("StopExport error:", err) - } - }() - } - - if m.isWaylandSession { - m.initWaylandWindows() - } else { - m.initClientList() - } - - m.clientListInitEnd = true -} - -func (m *Manager) connectSettingKeyChanged(key string, handler func(key string)) { - gsettings.ConnectChanged(dockSchema, key, handler) -} - -func (m *Manager) listenSettingsChanged() { - // listen hide mode change - m.connectSettingKeyChanged(settingKeyHideMode, func(key string) { - mode := HideModeType(m.settings.GetEnum(key)) - logger.Debug(key, "changed to", mode) - m.updateHideState(false) - }) - - // listen display mode change - m.connectSettingKeyChanged(settingKeyDisplayMode, func(key string) { - mode := DisplayModeType(m.settings.GetEnum(key)) - logger.Debug(key, "changed to", mode) - }) - - // listen position change - m.connectSettingKeyChanged(settingKeyPosition, func(key string) { - position := positionType(m.settings.GetEnum(key)) - logger.Debug(key, "changed to", position) - }) - - // listen force quit - m.connectSettingKeyChanged(settingKeyForceQuitApp, func(key string) { - m.forceQuitAppStatus = forceQuitAppType(m.settings.GetEnum(key)) - logger.Debug(key, "changed to", m.forceQuitAppStatus) - - m.Entries.mu.Lock() - for _, entry := range m.Entries.items { - entry.updateMenu() - } - m.Entries.mu.Unlock() - }) -} - -func (m *Manager) listenWMSwitcherSignal() { - m.wmSwitcher.InitSignalExt(m.sessionSigLoop, true) - _, err := m.wmSwitcher.ConnectWMChanged(func(wmName string) { - m.PropsMu.Lock() - m.wmName = wmName - m.PropsMu.Unlock() - logger.Debugf("wm changed %q", wmName) - }) - if err != nil { - logger.Warning(err) - } -} - -const ( - wmName3D = "deepin wm" - wmName2D = "deepin metacity" -) - -func (m *Manager) listenKWinSignal() { - m.kwin.InitSignalExt(m.sessionSigLoop, true) - _, err := m.kwin.ConnectMultitaskStateChanged(func(state bool) { - m.isMultiTaskViewShow = state - m.updateHideState(false) - }) - if err != nil { - logger.Warning(err) - } -} - -func (m *Manager) listenWMSignal() { - m.wm.InitSignalExt(m.sessionSigLoop, true) - _, err := m.wm.ConnectCompositingEnabledChanged(func(enabled bool) { - m.PropsMu.Lock() - defer m.PropsMu.Unlock() - if enabled { - m.wmName = wmName3D - } else { - m.wmName = wmName2D - } - }) - if err != nil { - logger.Warning(err) - } -} - -// 代码逻辑源自startdde wm_kwin.go -func (m *Manager) currentWM() string { - enabled, err := m.wm.CompositingEnabled().Get(0) - if err != nil { - logger.Warning(err) - return "" - } - - wmName := wmName2D - if enabled { - wmName = wmName3D - } - return wmName -} - -func (m *Manager) is3DWM() bool { - m.PropsMu.Lock() - defer m.PropsMu.Unlock() - if m.wmName == "" { - m.wmName = m.currentWM() - } - return m.wmName == wmName3D -} - -func (m *Manager) handleLauncherItemDeleted(itemInfo launcher.ItemInfo) { - dockedEntries := m.Entries.FilterDocked() - for _, entry := range dockedEntries { - file := entry.appInfo.GetFileName() - if file == itemInfo.Path { - m.undockEntry(entry) - return - } - } -} - -func (m *Manager) handleLauncherItemCreated(itemInfo launcher.ItemInfo) { - -} - -// 在收到 launcher item 更新的信号后,需要更新相关信息,包括 appInfo、innerId、名称、图标、菜单。 -func (m *Manager) handleLauncherItemUpdated(itemInfo launcher.ItemInfo) { - desktopFile := toLocalPath(itemInfo.Path) - entry, err := m.Entries.GetByDesktopFilePath(desktopFile) - if err != nil { - logger.Warning(err) - return - } - if entry == nil { - return - } - - appInfo := NewAppInfoFromFile(desktopFile) - if appInfo == nil { - logger.Warningf("failed to new app info from file %q: %v", desktopFile, err) - return - } - entry.setAppInfo(appInfo) - entry.innerId = appInfo.innerId - entry.updateName() - entry.updateMenu() - entry.forceUpdateIcon() // 可能存在Icon图片改变,但Icon名称未改变的情况,因此强制发Icon的属性改变信号 -} - -func (m *Manager) listenLauncherSignal() { - m.launcher.InitSignalExt(m.sessionSigLoop, true) - _, err := m.launcher.ConnectItemChanged(func(status string, itemInfo launcher.ItemInfo, - categoryID int64) { - logger.Debugf("launcher item changed status: %s, itemInfo: %#v", - status, itemInfo) - switch status { - case "deleted": - m.handleLauncherItemDeleted(itemInfo) - case "created": - m.handleLauncherItemCreated(itemInfo) - case "updated": - m.handleLauncherItemUpdated(itemInfo) - } - }) - if err != nil { - logger.Warning(err) - } - - m.ddeLauncher.InitSignalExt(m.sessionSigLoop, true) - _, err = m.ddeLauncher.ConnectVisibleChanged(func(visible bool) { - logger.Debug("dde-launcher visible changed", visible) - m.ddeLauncherVisibleMu.Lock() - m.ddeLauncherVisible = visible - m.ddeLauncherVisibleMu.Unlock() - - m.updateHideState(false) - }) - if err != nil { - logger.Warning(err) - } -} - -func (m *Manager) isDDELauncherVisible() bool { - m.ddeLauncherVisibleMu.Lock() - result := m.ddeLauncherVisible - m.ddeLauncherVisibleMu.Unlock() - return result -} - -func (m *Manager) getWinIconPreferredApps() []string { - return m.settings.GetStrv(settingKeyWinIconPreferredApps) -} - -func (m *Manager) init() error { - m.rootWindow = globalXConn.GetDefaultScreen().Root - - var err error - m.settings = gio.NewSettings(dockSchema) - m.HideMode.Bind(m.settings, settingKeyHideMode) - m.DisplayMode.Bind(m.settings, settingKeyDisplayMode) - m.Position.Bind(m.settings, settingKeyPosition) - m.IconSize.Bind(m.settings, settingKeyIconSize) - m.ShowTimeout.Bind(m.settings, settingKeyShowTimeout) - m.HideTimeout.Bind(m.settings, settingKeyHideTimeout) - m.WindowSizeEfficient.Bind(m.settings, settingKeyWindowSizeEfficient) - m.WindowSizeFashion.Bind(m.settings, settingKeyWindowSizeFashion) - m.DockedApps.Bind(m.settings, settingKeyDockedApps) - m.appearanceSettings = gio.NewSettings(appearanceSchema) - m.Opacity.Bind(m.appearanceSettings, settingKeyOpacity) - - m.forceQuitAppStatus = forceQuitAppType(m.settings.GetEnum(settingKeyForceQuitApp)) - - m.FrontendWindowRect = NewRect() - m.smartHideModeTimer = time.AfterFunc(10*time.Second, m.smartHideModeTimerExpired) - m.smartHideModeTimer.Stop() - - m.listenSettingsChanged() - - m.windowInfoMap = make(map[x.Window]WindowInfoImp) - m.windowPatterns, err = loadWindowPatterns(windowPatternsFile) - if err != nil { - logger.Warning("loadWindowPatterns failed:", err) - } - - sessionBus := m.service.Conn() - m.wm = wm.NewWm(sessionBus) - - systemBus, err := dbus.SystemBus() - if err != nil { - return err - } - m.appsObj = libApps.NewApps(systemBus) - m.launcher = launcher.NewLauncher(sessionBus) - m.ddeLauncher = libDDELauncher.NewLauncher(sessionBus) - m.startManager = sessionmanager.NewStartManager(sessionBus) - m.wmSwitcher = wmswitcher.NewWMSwitcher(sessionBus) - m.kwin = kwin.NewKWin(sessionBus) - - sessionType := os.Getenv("XDG_SESSION_TYPE") - if strings.Contains(sessionType, "wayland") { - m.isWaylandSession = true - } - - if m.isWaylandSession { - m.waylandWM = kwayland.NewWindowManager(sessionBus) - m.waylandManager = newWaylandManager() - } - - m.sessionSigLoop = dbusutil.NewSignalLoop(m.service.Conn(), 10) - m.sessionSigLoop.Start() - m.sysSigLoop = dbusutil.NewSignalLoop(m.sysService.Conn(), 10) - m.sysSigLoop.Start() - m.listenLauncherSignal() - m.listenWMSwitcherSignal() - m.listenWMSignal() - m.listenKWinSignal() - - if strings.Contains(sessionType, "wayland") { - m.listenWaylandWMSignals() - } - m.initDSettings(m.sysService.Conn()) - //systemd拉起bamfdaemon可能会失败,导致阻塞,手动拉一遍 - err = m.startBAMFDaemon(sessionBus) - if err != nil { - logger.Warning("startBAMFDaemon failed") - } - - if m.isWaylandSession { - m.registerIdentifyKWindowFuncs() - } else { - m.registerIdentifyWindowFuncs() - } - - m.initEntries() - m.pluginSettings = newPluginSettingsStorage(m) - - m.syncConfig = dsync.NewConfig("dock", &syncConfig{m: m}, m.sessionSigLoop, - dbusPath, logger) - - // 强制将 ClassicMode 转为 EfficientMode - if m.DisplayMode.Get() == int32(DisplayModeClassicMode) { - m.DisplayMode.Set(int32(DisplayModeEfficientMode)) - } - - m.entryDealChan = make(chan func(), 64) - go m.accessEntries() - - if strings.Contains(sessionType, "x11") { - go m.eventHandleLoop() - m.listenRootWindowXEvent() - } - return nil -} - -func (m *Manager) startBAMFDaemon(bus *dbus.Conn) error { - systemdUser := bus.Object("org.freedesktop.systemd1", "/org/freedesktop/systemd1") - var jobPath dbus.ObjectPath - err := systemdUser.Call("org.freedesktop.systemd1.Manager.StartUnit", - dbus.FlagNoAutoStart, "bamfdaemon.service", "replace").Store(&jobPath) - if err != nil { - logger.Warning("failed to start bamfdaemon.service:", err) - return err - } - return nil -} diff --git a/dock/dock_manager_xevent.go b/dock/dock_manager_xevent.go deleted file mode 100644 index 695b0a3ef..000000000 --- a/dock/dock_manager_xevent.go +++ /dev/null @@ -1,436 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "fmt" - "sort" - "strings" - "time" - - x "github.com/linuxdeepin/go-x11-client" - "github.com/linuxdeepin/go-x11-client/util/wm/ewmh" -) - -func (m *Manager) registerWindow(win x.Window) WindowInfoImp { - logger.Debug("register window", win) - - m.windowInfoMapMutex.RLock() - winInfo, ok := m.windowInfoMap[win] - m.windowInfoMapMutex.RUnlock() - if ok { - logger.Debugf("register window %v failed, window existed", win) - return winInfo - } - - xwinInfo := NewWindowInfo(win) - m.listenWindowXEvent(xwinInfo) - - m.windowInfoMapMutex.Lock() - m.windowInfoMap[win] = xwinInfo - m.windowInfoMapMutex.Unlock() - return xwinInfo -} - -func (m *Manager) isWindowRegistered(win x.Window) bool { - m.windowInfoMapMutex.RLock() - _, ok := m.windowInfoMap[win] - m.windowInfoMapMutex.RUnlock() - return ok -} - -func (m *Manager) unregisterWindow(win x.Window) { - logger.Debugf("unregister window %v", win) - m.windowInfoMapMutex.Lock() - delete(m.windowInfoMap, win) - m.windowInfoMapMutex.Unlock() -} - -func (m *Manager) handleClientListChanged() { - clientList, err := ewmh.GetClientList(globalXConn).Reply(globalXConn) - if err != nil { - logger.Warning("Get client list failed:", err) - return - } - newClientList := windowSlice(clientList) - sort.Sort(newClientList) - add, remove := diffSortedWindowSlice(m.clientList, newClientList) - m.clientList = newClientList - - if len(add) > 0 { - for _, win := range add { - window0 := win - addFunc := func() { - logger.Debugf("client list add: %d", window0) - winInfo := m.registerWindow(window0) - repeatCount := 0 - for { - if repeatCount > 10 { - logger.Debugf("give up identify window %d", window0) - return - } - good := isGoodWindow(window0) - if !good { - return - } - pid := getWmPid(window0) - wmClass, _ := getWmClass(window0) - wmName := getWmName(window0) - wmCmd, _ := getWmCommand(window0) - if pid != 0 || wmClass != nil || wmName != "" || strings.Join(wmCmd, "") != "" { - m.attachOrDetachWindow(winInfo) - return - } - repeatCount++ - time.Sleep(100 * time.Millisecond) - } - } - m.entryDealChan <- addFunc - } - } - - if len(remove) > 0 { - for _, win := range remove { - window0 := win - removeFunc := func() { - logger.Debugf("client list remove: %d", window0) - m.windowInfoMapMutex.RLock() - winInfo := m.windowInfoMap[window0] - m.windowInfoMapMutex.RUnlock() - if winInfo != nil { - m.detachWindow(winInfo) - winInfo.setEntryInnerId("") - } else { - logger.Warningf("window info of %d is nil", window0) - entry := m.Entries.getByWindowId(window0) - if entry != nil { - entry.PropsMu.RLock() - if !entry.IsDocked { - m.removeAppEntry(entry) - } - entry.PropsMu.RUnlock() - } - } - } - m.entryDealChan <- removeFunc - } - } -} - -func (m *Manager) handleActiveWindowChangedX() { - activeWindow, err := ewmh.GetActiveWindow(globalXConn).Reply(globalXConn) - if err != nil { - logger.Warning(err) - return - } - winInfo := m.findWindowByXid(activeWindow) - - logger.Debug("Active window changed X", activeWindow) - m.handleActiveWindowChanged(winInfo) -} - -func (m *Manager) handleActiveWindowChanged(activeWindow WindowInfoImp) { - m.activeWindowMu.Lock() - if activeWindow == nil { - m.activeWindowOld = m.activeWindow - m.activeWindow = nil - m.activeWindowMu.Unlock() - return - } - - m.activeWindow = activeWindow - m.activeWindowMu.Unlock() - - activeWinXid := activeWindow.getXid() - - m.Entries.mu.RLock() - for _, entry := range m.Entries.items { - entry.PropsMu.Lock() - - winInfo, ok := entry.windows[activeWinXid] - if ok { - entry.setPropIsActive(true) - entry.setCurrentWindowInfo(winInfo) - entry.updateName() - entry.updateIcon() - } else { - entry.setPropIsActive(false) - } - - entry.PropsMu.Unlock() - } - m.Entries.mu.RUnlock() - - isShowDesktop := false - var err error - - switch activeWindow.(type) { - case *WindowInfo: - isShowDesktop, err = ewmh.GetShowingDesktop(globalXConn).Reply(globalXConn) - case *KWindowInfo: - isShowDesktop, err = m.wm.GetIsShowDesktop(0) - default: - logger.Warning("invalid type WindowInfo") - } - - if err != nil { - logger.Warning(err) - } - - m.updateHideState(!isShowDesktop) -} - -func (m *Manager) listenRootWindowXEvent() { - const eventMask = x.EventMaskPropertyChange | x.EventMaskSubstructureNotify - err := x.ChangeWindowAttributesChecked(globalXConn, m.rootWindow, x.CWEventMask, - []uint32{eventMask}).Check(globalXConn) - if err != nil { - logger.Warning(err) - } - m.handleActiveWindowChangedX() - m.handleClientListChanged() -} - -func (m *Manager) listenWindowXEvent(winInfo *WindowInfo) { - const eventMask = x.EventMaskPropertyChange | x.EventMaskStructureNotify | x.EventMaskVisibilityChange - err := x.ChangeWindowAttributesChecked(globalXConn, winInfo.xid, x.CWEventMask, - []uint32{eventMask}).Check(globalXConn) - if err != nil { - logger.Warning(err) - } -} - -func (m *Manager) handleDestroyNotifyEvent(ev *x.DestroyNotifyEvent) { - logger.Debug("DestroyNotifyEvent window:", ev.Window) - winInfo, err := m.getWindowInfo(ev.Window) - if err == nil { - m.detachWindow(winInfo) - } - - m.unregisterWindow(ev.Window) -} - -func (m *Manager) handleMapNotifyEvent(ev *x.MapNotifyEvent) { - logger.Debug("MapNotifyEvent window:", ev.Window) - winInfo := m.registerWindow(ev.Window) - time.AfterFunc(2*time.Second, func() { - logger.Warningf("mapNotifyEvent after 2s, call identifyWindow, win: %d", winInfo.getXid()) - _, appInfo := m.identifyWindow(winInfo) - m.markAppLaunched(appInfo) - }) -} - -func (m *Manager) getWindowInfo(win x.Window) (WindowInfoImp, error) { - m.windowInfoMapMutex.RLock() - v, ok := m.windowInfoMap[win] - if !ok { - err := fmt.Errorf("can not get %d window info", win) - m.windowInfoMapMutex.RUnlock() - return nil, err - } - - m.windowInfoMapMutex.RUnlock() - return v, nil -} - -func (m *Manager) handleConfigureNotifyEvent(ev *x.ConfigureNotifyEvent) { - winInfo := m.findXWindowInfo(ev.Window) - if winInfo == nil { - return - } - - if HideModeType(m.HideMode.Get()) != HideModeSmartHide { - return - } - if winInfo.wmClass != nil && winInfo.wmClass.Class == frontendWindowWmClass { - // ignore frontend window ConfigureNotify event - return - } - - winInfo.mu.Lock() - winInfo.lastConfigureNotifyEvent = ev - winInfo.mu.Unlock() - - const configureNotifyDelay = 100 * time.Millisecond - if winInfo.updateConfigureTimer != nil { - winInfo.updateConfigureTimer.Reset(configureNotifyDelay) - } else { - winInfo.updateConfigureTimer = time.AfterFunc(configureNotifyDelay, func() { - logger.Debug("ConfigureNotify: updateConfigureTimer expired") - - winInfo.mu.Lock() - ev := winInfo.lastConfigureNotifyEvent - winInfo.mu.Unlock() - - logger.Debugf("in closure: configure notify ev: %#v", ev) - isXYWHChange := false - if winInfo.x != ev.X { - winInfo.x = ev.X - isXYWHChange = true - } - - if winInfo.y != ev.Y { - winInfo.y = ev.Y - isXYWHChange = true - } - - if winInfo.width != ev.Width { - winInfo.width = ev.Width - isXYWHChange = true - } - - if winInfo.height != ev.Height { - winInfo.height = ev.Height - isXYWHChange = true - } - logger.Debug("isXYWHChange", isXYWHChange) - // if xywh changed ,update hide state without delay - m.updateHideState(!isXYWHChange) - }) - } - -} - -func (m *Manager) handleRootWindowPropertyNotifyEvent(ev *x.PropertyNotifyEvent) { - switch ev.Atom { - case atomNetClientList: - m.handleClientListChanged() - case atomNetActiveWindow: - m.handleActiveWindowChangedX() - case atomNetShowingDesktop: - m.updateHideState(false) - } -} - -func (m *Manager) handlePropertyNotifyEvent(ev *x.PropertyNotifyEvent) { - if ev.Window == m.rootWindow { - m.handleRootWindowPropertyNotifyEvent(ev) - return - } - - winInfo := m.findXWindowInfo(ev.Window) - if winInfo == nil { - return - } - - var newInnerId string - var needAttachOrDetach bool - - switch ev.Atom { - case atomNetWMState: - winInfo.updateWmState() - needAttachOrDetach = true - - case atomGtkApplicationId: - winInfo.gtkAppId = getWindowGtkApplicationId(winInfo.xid) - newInnerId = genInnerId(winInfo) - - case atomNetWmPid: - winInfo.updateProcessInfo() - newInnerId = genInnerId(winInfo) - - case atomNetWMName: - winInfo.updateWmName() - newInnerId = genInnerId(winInfo) - - case atomNetWMIcon: - winInfo.updateIcon() - - case atomNetWmAllowedActions: - winInfo.updateWmAllowedActions() - - case atomMotifWmHints: - winInfo.updateMotifWmHints() - - case x.AtomWMClass: - winInfo.updateWmClass() - newInnerId = genInnerId(winInfo) - needAttachOrDetach = true - - case atomXEmbedInfo: - winInfo.updateHasXEmbedInfo() - needAttachOrDetach = true - - case atomNetWMWindowType: - winInfo.updateWmWindowType() - needAttachOrDetach = true - - case x.AtomWMTransientFor: - winInfo.updateHasWmTransientFor() - needAttachOrDetach = true - } - - if winInfo.updateCalled && newInnerId != "" && winInfo.innerId != newInnerId { - // winInfo.innerId changed - logger.Debugf("window %v innerId changed to %s", winInfo.xid, newInnerId) - m.detachWindow(winInfo) - winInfo.innerId = newInnerId - winInfo.entryInnerId = "" - needAttachOrDetach = true - } - - if needAttachOrDetach { - m.attachOrDetachWindow(winInfo) - } - - entry := m.Entries.getByWindowId(ev.Window) - if entry == nil { - return - } - - entry.PropsMu.Lock() - defer entry.PropsMu.Unlock() - - switch ev.Atom { - case atomNetWMState: - entry.updateWindowInfos() - - case atomNetWMIcon: - if entry.current == winInfo { - entry.updateIcon() - } - - case atomNetWMName: - if entry.current == winInfo { - entry.updateName() - } - entry.updateWindowInfos() - - case atomNetWmAllowedActions, atomMotifWmHints: - entry.updateMenu() - } -} - -func (m *Manager) eventHandleLoop() { - eventChan := make(chan x.GenericEvent, 500) - globalXConn.AddEventChan(eventChan) - - for ev := range eventChan { - switch ev.GetEventCode() { - case x.MapNotifyEventCode: - event, _ := x.NewMapNotifyEvent(ev) - m.handleMapNotifyEvent(event) - - case x.DestroyNotifyEventCode: - event, _ := x.NewDestroyNotifyEvent(ev) - m.handleDestroyNotifyEvent(event) - - case x.ConfigureNotifyEventCode: - event, _ := x.NewConfigureNotifyEvent(ev) - m.handleConfigureNotifyEvent(event) - - case x.PropertyNotifyEventCode: - event, _ := x.NewPropertyNotifyEvent(ev) - m.handlePropertyNotifyEvent(event) - } - } -} - -func (m *Manager) isActiveWindow(winInfo WindowInfoImp) bool { - if winInfo == nil { - return false - } - return winInfo == m.getActiveWindow() -} diff --git a/dock/exported_methods_auto.go b/dock/exported_methods_auto.go deleted file mode 100644 index 33cb94bc3..000000000 --- a/dock/exported_methods_auto.go +++ /dev/null @@ -1,170 +0,0 @@ -// Code generated by "dbusutil-gen em -type AppEntry,Manager"; DO NOT EDIT. - -package dock - -import ( - "github.com/linuxdeepin/go-lib/dbusutil" -) - -func (v *AppEntry) GetExportedMethods() dbusutil.ExportedMethods { - return dbusutil.ExportedMethods{ - { - Name: "Activate", - Fn: v.Activate, - InArgs: []string{"timestamp"}, - }, - { - Name: "Check", - Fn: v.Check, - }, - { - Name: "ForceQuit", - Fn: v.ForceQuit, - }, - { - Name: "GetAllowedCloseWindows", - Fn: v.GetAllowedCloseWindows, - OutArgs: []string{"windows"}, - }, - { - Name: "HandleDragDrop", - Fn: v.HandleDragDrop, - InArgs: []string{"timestamp", "files"}, - }, - { - Name: "HandleMenuItem", - Fn: v.HandleMenuItem, - InArgs: []string{"timestamp", "id"}, - }, - { - Name: "NewInstance", - Fn: v.NewInstance, - InArgs: []string{"timestamp"}, - }, - { - Name: "PresentWindows", - Fn: v.PresentWindows, - }, - { - Name: "RequestDock", - Fn: v.RequestDock, - }, - { - Name: "RequestUndock", - Fn: v.RequestUndock, - }, - } -} -func (v *Manager) GetExportedMethods() dbusutil.ExportedMethods { - return dbusutil.ExportedMethods{ - { - Name: "ActivateWindow", - Fn: v.ActivateWindow, - InArgs: []string{"win"}, - }, - { - Name: "CancelPreviewWindow", - Fn: v.CancelPreviewWindow, - }, - { - Name: "CloseWindow", - Fn: v.CloseWindow, - InArgs: []string{"win"}, - }, - { - Name: "GetDockedAppsDesktopFiles", - Fn: v.GetDockedAppsDesktopFiles, - OutArgs: []string{"desktopFiles"}, - }, - { - Name: "GetEntryIDs", - Fn: v.GetEntryIDs, - OutArgs: []string{"list"}, - }, - { - Name: "GetPluginSettings", - Fn: v.GetPluginSettings, - OutArgs: []string{"jsonStr"}, - }, - { - Name: "IsDocked", - Fn: v.IsDocked, - InArgs: []string{"desktopFile"}, - OutArgs: []string{"docked"}, - }, - { - Name: "IsOnDock", - Fn: v.IsOnDock, - InArgs: []string{"desktopFile"}, - OutArgs: []string{"onDock"}, - }, - { - Name: "MakeWindowAbove", - Fn: v.MakeWindowAbove, - InArgs: []string{"win"}, - }, - { - Name: "MaximizeWindow", - Fn: v.MaximizeWindow, - InArgs: []string{"win"}, - }, - { - Name: "MergePluginSettings", - Fn: v.MergePluginSettings, - InArgs: []string{"jsonStr"}, - }, - { - Name: "MinimizeWindow", - Fn: v.MinimizeWindow, - InArgs: []string{"win"}, - }, - { - Name: "MoveEntry", - Fn: v.MoveEntry, - InArgs: []string{"index", "newIndex"}, - }, - { - Name: "MoveWindow", - Fn: v.MoveWindow, - InArgs: []string{"win"}, - }, - { - Name: "PreviewWindow", - Fn: v.PreviewWindow, - InArgs: []string{"win"}, - }, - { - Name: "QueryWindowIdentifyMethod", - Fn: v.QueryWindowIdentifyMethod, - InArgs: []string{"wid"}, - OutArgs: []string{"method"}, - }, - { - Name: "RemovePluginSettings", - Fn: v.RemovePluginSettings, - InArgs: []string{"key1", "key2List"}, - }, - { - Name: "RequestDock", - Fn: v.RequestDock, - InArgs: []string{"desktopFile", "index"}, - OutArgs: []string{"docked"}, - }, - { - Name: "RequestUndock", - Fn: v.RequestUndock, - InArgs: []string{"desktopFile"}, - OutArgs: []string{"undocked"}, - }, - { - Name: "SetFrontendWindowRect", - Fn: v.SetFrontendWindowRect, - InArgs: []string{"x", "y", "width", "height"}, - }, - { - Name: "SetPluginSettings", - Fn: v.SetPluginSettings, - InArgs: []string{"jsonStr"}, - }, - } -} diff --git a/dock/identify_window.go b/dock/identify_window.go deleted file mode 100644 index 8ede55e54..000000000 --- a/dock/identify_window.go +++ /dev/null @@ -1,638 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "fmt" - "path/filepath" - "strconv" - "strings" - "time" - - "github.com/linuxdeepin/go-lib/appinfo/desktopappinfo" - - "github.com/linuxdeepin/go-lib/procfs" -) - -type IdentifyWindowFunc struct { - Name string - Fn _IdentifyWindowFunc -} - -type _IdentifyWindowFunc func(*Manager, *WindowInfo) (string, *AppInfo) - -func (m *Manager) registerIdentifyWindowFuncs() { - m.registerIdentifyWindowFunc("DSGVirtualApp", identifyWindowDSGVirtualApp) - m.registerIdentifyWindowFunc("Android", identifyWindowAndroid) - m.registerIdentifyWindowFunc("PidEnv", func(m *Manager, winInfo *WindowInfo) (string, *AppInfo) { - return identifyWindowByPidEnv(m, &winInfo.baseWindowInfo) - }) - m.registerIdentifyWindowFunc("CmdlineTurboBooster", identifyWindowByCmdlineTurboBooster) - m.registerIdentifyWindowFunc("Cmdline-XWalk", identifyWindowByCmdlineXWalk) - m.registerIdentifyWindowFunc("FlatpakAppID", identifyWindowByFlatpakAppID) - m.registerIdentifyWindowFunc("CrxId", identifyWindowByCrxId) - m.registerIdentifyWindowFunc("Rule", identifyWindowByRule) - m.registerIdentifyWindowFunc("Pid", identifyWindowByPid) - m.registerIdentifyWindowFunc("Scratch", identifyWindowByScratch) - m.registerIdentifyWindowFunc("GtkAppId", identifyWindowByGtkAppId) - m.registerIdentifyWindowFunc("WmClass", identifyWindowByWmClass) - m.registerIdentifyWindowFunc("Bamf", func(m *Manager, winInfo *WindowInfo) (string, *AppInfo) { - return identifyWindowByBamf(m, &winInfo.baseWindowInfo) - }) -} - -func (m *Manager) registerIdentifyWindowFunc(name string, fn _IdentifyWindowFunc) { - m.identifyWindowFuns = append(m.identifyWindowFuns, &IdentifyWindowFunc{ - Name: name, - Fn: fn, - }) -} - -type IdentifyKWindowFunc struct { - Name string - Fn _IdentifyKWindowFunc -} - -type _IdentifyKWindowFunc func(*Manager, *KWindowInfo) (string, *AppInfo) - -func (m *Manager) registerIdentifyKWindowFuncs() { - m.registerIdentifyKWindowFunc("DSGVirtualApp", identifyKWindowDSGVirtualApp) - m.registerIdentifyKWindowFunc("PidEnv", func(m *Manager, winInfo *KWindowInfo) (string, *AppInfo) { - return identifyWindowByPidEnv(m, &winInfo.baseWindowInfo) - }) - m.registerIdentifyKWindowFunc("Bamf", func(m *Manager, winInfo *KWindowInfo) (string, *AppInfo) { - return identifyWindowByBamf(m, &winInfo.baseWindowInfo) - }) - m.registerIdentifyKWindowFunc("ExeEnv", identifyKwindowByExeEnv) - m.registerIdentifyKWindowFunc("WmClass", identifyKWindowByWMClass) -} - -func (m *Manager) registerIdentifyKWindowFunc(name string, fn _IdentifyKWindowFunc) { - m.identifyKWindowFuns = append(m.identifyKWindowFuns, &IdentifyKWindowFunc{ - Name: name, - Fn: fn, - }) -} - -func (m *Manager) identifyWindow(winInfo WindowInfoImp) (innerId string, appInfo *AppInfo) { - switch winType := winInfo.(type) { - case *WindowInfo: - return m.identifyWindowX(winType) - case *KWindowInfo: - return m.identifyWindowK(winType) - default: - return "", nil - } -} - -func identifyKWindowByWMClass(m *Manager, winInfo *KWindowInfo) (innerId string, appInfo *AppInfo) { - wmClass, _ := getWmClass(winInfo.xid) - if wmClass != nil { - instance := wmClass.Instance - if instance != "" { - appInfo = NewAppInfo("org.deepin.flatdeb." + strings.ToLower(instance)) - if appInfo != nil { - innerId = appInfo.innerId - return - } - - appInfo = NewAppInfo(instance) - if appInfo != nil { - innerId = appInfo.innerId - return - } - } - - class := wmClass.Class - if class != "" { - appInfo = NewAppInfo(class) - if appInfo != nil { - innerId = appInfo.innerId - return - } - } - } - - return -} - -func (m *Manager) identifyWindowK(winInfo *KWindowInfo) (innerId string, appInfo *AppInfo) { - // TODO: 对桌面调起的文管应用做规避处理,需要在此处添加,因为初始化时appId和title为空 - if winInfo.appId == "dde-desktop" && m.shouldShowOnDock(winInfo) { - winInfo.appId = "dde-file-manager" - } - appId := winInfo.appId - // TODO: 对于appId为空的情况,使用title过滤,此项修改针对浏览器下载窗口 - title := winInfo.getTitle() - if title == "下载" { - appId = "uos-browser" - } - - // wayland环境下,如果是Wine应用(微信,企业微信等),appId为wine,根据进程环境变量去需要获取具体应用的appId - if appId == "wine" { - if winInfo.process != nil { - launchedDesktopFile := winInfo.process.environ.Get("GIO_LAUNCHED_DESKTOP_FILE") - logger.Debugf("%s launchedDesktopFile: %s", appId, launchedDesktopFile) - - parts := strings.Split(launchedDesktopFile, "/") - partsLen := len(parts) - if partsLen >= 1 { - appId = parts[partsLen-1] - logger.Debugf("identifyWindowK: actual wine application appid: %s", appId) - } - } - } - - // 先使用appId获取appInfo,如果不能成功再通过定义的识别窗口机制去识别 - appInfo = NewAppInfo(appId) - if appInfo == nil { - for idx, item := range m.identifyKWindowFuns { - name := item.Name - logger.Debugf("identifyWindowK: try %s:%d", name, idx) - innerId, appInfo = item.Fn(m, winInfo) - if innerId != "" { - // success - logger.Debugf("identifyWindowK by %s success, innerId: %q", - name, innerId) - - // NOTE: if name == "Pid", appInfo may be nil - if appInfo != nil { - fixedAppInfo := fixAutostartAppInfo(appInfo) - if fixedAppInfo != nil { - appInfo = fixedAppInfo - appInfo.identifyMethod = name + "+FixAutostart" - innerId = fixedAppInfo.innerId - } else { - appInfo.identifyMethod = name - } - } - return - } - } - } else { - innerId = appInfo.innerId - fixedAppInfo := fixAutostartAppInfo(appInfo) - if fixedAppInfo != nil { - appInfo = fixedAppInfo - appInfo.identifyMethod = "FixAutostart" - innerId = fixedAppInfo.innerId - } - - logger.Debugf("identifyWindowK by %s success, innerId: %q, appInfo: %v", - "AppId", innerId, appInfo) - return - } - - // fail - logger.Debugf("identifyWindowK: failed") - return winInfo.appId, nil -} - -func (m *Manager) identifyWindowX(winInfo *WindowInfo) (innerId string, appInfo *AppInfo) { - logger.Debugf("identifyWindow: window id: %v, window innerId: %q", - winInfo.xid, winInfo.innerId) - if winInfo.innerId == "" { - logger.Debug("identifyWindow: winInfo.innerId is empty") - return - } - - for idx, item := range m.identifyWindowFuns { - name := item.Name - logger.Debugf("identifyWindow: try %s:%d", name, idx) - innerId, appInfo = item.Fn(m, winInfo) - if innerId != "" { - // success - logger.Debugf("identifyWindow by %s success, innerId: %q, appInfo: %v", - name, innerId, appInfo) - // NOTE: if name == "Pid", appInfo may be nil - if appInfo != nil { - fixedAppInfo := fixAutostartAppInfo(appInfo) - if fixedAppInfo != nil { - appInfo = fixedAppInfo - appInfo.identifyMethod = name + "+FixAutostart" - innerId = fixedAppInfo.innerId - } else { - appInfo.identifyMethod = name - } - } - return - } - } - // fail - logger.Debugf("identifyWindow: failed") - return winInfo.innerId, nil -} - -func fixAutostartAppInfo(appInfo *AppInfo) *AppInfo { - file := appInfo.GetFileName() - if isInAutostartDir(file) { - logger.Debug("file is in autostart dir") - base := filepath.Base(file) - return NewAppInfo(base) - } - return nil -} - -func identifyWindowByScratch(m *Manager, winInfo *WindowInfo) (string, *AppInfo) { - msgPrefix := fmt.Sprintf("identifyWindowByScratch win: %d ", winInfo.xid) - desktopFile := filepath.Join(scratchDir, addDesktopExt(winInfo.innerId)) - logger.Debugf("%s try scratch desktop file: %q", msgPrefix, desktopFile) - appInfo := NewAppInfoFromFile(desktopFile) - if appInfo != nil { - // success - return appInfo.innerId, appInfo - } - // fail - return "", nil -} - -func identifyWindowByPid(m *Manager, winInfo *WindowInfo) (string, *AppInfo) { - msgPrefix := fmt.Sprintf("identifyWindowByPid win: %d ", winInfo.xid) - if winInfo.pid > 10 { - logger.Debugf("%s pid: %d", msgPrefix, winInfo.pid) - entry := m.Entries.GetByWindowPid(winInfo.pid) - if entry != nil { - // success - return entry.innerId, entry.appInfo - } - } - // fail - return "", nil -} - -func identifyWindowByGtkAppId(m *Manager, winInfo *WindowInfo) (string, *AppInfo) { - msgPrefix := fmt.Sprintf("identifyWindowByGtkAppId win: %d ", winInfo.xid) - gtkAppId := winInfo.gtkAppId - logger.Debugf("%s gtkAppId: %q", msgPrefix, gtkAppId) - if gtkAppId != "" { - appInfo := NewAppInfo(gtkAppId) - if appInfo != nil { - // success - return appInfo.innerId, appInfo - } - } - // fail - return "", nil -} - -func identifyWindowByFlatpakAppID(m *Manager, winInfo *WindowInfo) (string, *AppInfo) { - msgPrefix := fmt.Sprintf("identifyWindowByFlatpakAppID win: %d ", winInfo.xid) - flatpakRef := winInfo.flatpakAppID - logger.Debugf("%s flatpak ref is %q", msgPrefix, flatpakRef) - if strings.HasPrefix(flatpakRef, "app/") { - parts := strings.Split(flatpakRef, "/") - if len(parts) > 1 { - appID := parts[1] - appInfo := NewAppInfo(appID) - if appInfo != nil { - // success - return appInfo.innerId, appInfo - } - } - } - // fail - return "", nil -} - -var crxAppIdMap = map[string]string{ - "crx_onfalgmmmaighfmjgegnamdjmhpjpgpi": "apps.com.aiqiyi", - "crx_gfhkopakpiiaeocgofdpcpjpdiglpkjl": "apps.cn.kugou.hd", - "crx_gaoopbnflngfkoobibfgbhobdeiipcgh": "apps.cn.kuwo.kwmusic", - "crx_jajaphleehpmpblokgighfjneejapnok": "apps.com.evernote", - "crx_ebhffdbfjilfhahiinoijchmlceailfn": "apps.com.letv", - "crx_almpoflgiciaanepplakjdkiaijmklld": "apps.com.tongyong.xxbox", - "crx_heaphplipeblmpflpdcedfllmbehonfo": "apps.com.peashooter", - "crx_dbngidmdhcooejaggjiochbafiaefndn": "apps.com.rovio.angrybirdsseasons", - "crx_chfeacahlaknlmjhiagghobhkollfhip": "apps.com.sina.weibo", - "crx_cpbmecbkmjjfemjiekledmejoakfkpec": "apps.com.openapp", - "crx_lalomppgkdieklbppclocckjpibnlpjc": "apps.com.baidutieba", - "crx_gejbkhjjmicgnhcdpgpggboldigfhgli": "apps.com.zhuishushenqi", - "crx_gglenfcpioacendmikabbkecnfpanegk": "apps.com.duokan", - "crx_nkmmgdfgabhefacpfdabadjfnpffhpio": "apps.com.zhihu.daily", - "crx_ajkogonhhcighbinfgcgnjiadodpdicb": "apps.com.netease.newsreader", - "crx_hgggjnaaklhemplabjhgpodlcnndhppo": "apps.com.baidu.music.pad", - "crx_ebmgfebnlgilhandilnbmgadajhkkmob": "apps.cn.ibuka", - "crx_nolebplcbgieabkblgiaacdpgehlopag": "apps.com.tianqitong", - "crx_maghncnmccfbmkekccpmkjjfcmdnnlip": "apps.com.youjoy.strugglelandlord", - "crx_heliimhfjgfabpgfecgdhackhelmocic": "apps.cn.emoney", - "crx_jkgmneeafmgjillhgmjbaipnakfiidpm": "apps.com.instagram", - "crx_cdbkhmfmikobpndfhiphdbkjklbmnakg": "apps.com.easymindmap", - "crx_djflcciklfljleibeinjmjdnmenkciab": "apps.com.lgj.thunderbattle", - "crx_ffdgbolnndgeflkapnmoefhjhkeilfff": "apps.com.qianlong", - "crx_fmpniepgiofckbfgahajldgoelogdoap": "apps.com.windhd", - "crx_dokjmallmkihbgefmladclcdcinjlnpj": "apps.com.youdao.hanyu", - "crx_dicimeimfmbfcklbjdpnlmjgegcfilhm": "apps.com.ibookstar", - "crx_cokkcjnpjfffianjbpjbcgjefningkjm": "apps.com.yidianzixun", - "crx_ehflkacdpmeehailmcknlnkmjalehdah": "apps.com.xplane", - "crx_iedokjbbjejfinokgifgecmboncmkbhb": "apps.com.wedevote", - "crx_eaefcagiihjpndconigdpdmcbpcamaok": "apps.com.tongwei.blockbreaker", - "crx_mkjjfibpccammnliaalefmlekiiikikj": "apps.com.dayima", - "crx_gflkpppiigdigkemnjlonilmglokliol": "apps.com.cookpad", - "crx_jfhpkchgedddadekfeganigbenbfaohe": "apps.com.issuu", - "crx_ggkmfnbkldhmkehabgcbnmlccfbnoldo": "apps.bible.cbol", - "crx_phlhkholfcljapmcidanddmhpcphlfng": "apps.com.kanjian.radio", - "crx_bjgfcighhaahojkibojkdmpdihhcehfm": "apps.de.danoeh.antennapod", - "crx_kldipknjommdfkifomkmcpbcnpmcnbfi": "apps.com.asoftmurmur", - "crx_jfhlegimcipljdcionjbipealofoncmd": "apps.com.tencentnews", - "crx_aikgmfkpmmclmpooohngmcdimgcocoaj": "apps.com.tonghuashun", - "crx_ifimglalpdeoaffjmmihoofapmpflkad": "apps.com.letv.lecloud.disk", - "crx_pllcekmbablpiogkinogefpdjkmgicbp": "apps.com.hwadzanebook", - "crx_ohcknkkbjmgdfcejpbmhjbohnepcagkc": "apps.com.douban.radio", -} - -func identifyWindowByCrxId(m *Manager, winInfo *WindowInfo) (string, *AppInfo) { - msgPrefix := fmt.Sprintf("identifyWindowByCrxId win: %d ", winInfo.xid) - if winInfo.wmClass != nil && - strings.EqualFold(winInfo.wmClass.Class, "chromium-browser") && - strings.HasPrefix(winInfo.wmClass.Instance, "crx_") { - - appId, ok := crxAppIdMap[winInfo.wmClass.Instance] - logger.Debug(msgPrefix, "appId:", appId) - if ok { - appInfo := NewAppInfo(appId) - if appInfo != nil { - // success - return appInfo.innerId, appInfo - } - } - } - // fail - return "", nil -} - -func identifyWindowByCmdlineTurboBooster(m *Manager, winInfo *WindowInfo) (string, *AppInfo) { - msgPrefix := fmt.Sprintf("identifyWindowByCmdlineTurboBooster win: %d ", winInfo.xid) - pid := winInfo.pid - process := winInfo.process - if process != nil && pid != 0 { - if len(process.cmdline) >= 0 { - var desktopFile string - if strings.HasSuffix(process.cmdline[0], desktopExt) { - desktopFile = process.cmdline[0] - } else if strings.Contains(process.cmdline[0], "/applications/") { - matches, err := filepath.Glob(process.cmdline[0] + "*") - if err != nil { - logger.Warning(msgPrefix, "filepath.Glob err:", err) - return "", nil - } - if len(matches) > 0 && strings.HasSuffix(matches[0], desktopExt) { - desktopFile = matches[0] - } - } - - if desktopFile != "" { - logger.Debugf("%s desktopFile: %s", msgPrefix, desktopFile) - appInfo := NewAppInfoFromFile(desktopFile) - if appInfo != nil { - // success - return appInfo.innerId, appInfo - } - } - } - } - - // fail - return "", nil -} - -func identifyWindowDSGVirtualApp(m *Manager, winInfo *WindowInfo) (string, *AppInfo) { - desktop := getDSGVirtualAppDesktop(winInfo.xid) - if "" != desktop { - deskappInfo, _ := desktopappinfo.NewDesktopAppInfoFromFile(desktop) - if deskappInfo == nil { - logger.Info("Not Exist DesktopFile") - return "", nil - } - - appInfo := newAppInfo(deskappInfo) - appInfo.identifyMethod = "DSGVirtualApp" - - return appInfo.innerId, appInfo - } - - return "", nil -} - -func identifyKWindowDSGVirtualApp(m *Manager, winInfo *KWindowInfo) (string, *AppInfo) { - desktop := getDSGVirtualAppDesktop(winInfo.xid) - if "" != desktop { - deskappInfo, _ := desktopappinfo.NewDesktopAppInfoFromFile(desktop) - if deskappInfo == nil { - logger.Info("Not Exist DesktopFile") - return "", nil - } - - appInfo := newAppInfo(deskappInfo) - appInfo.identifyMethod = "DSGVirtualApp" - - return appInfo.innerId, appInfo - } - - return "", nil -} - -func identifyWindowAndroid(m *Manager, winInfo *WindowInfo) (string, *AppInfo) { - androidId := getAndroidUengineId(winInfo.xid) - androidName := getAndroidUengineName(winInfo.xid) - if -1 != androidId && "" != androidName { - desktopPath := "/usr/share/applications/" + "uengine." + androidName + ".desktop" - deskappInfo, _ := desktopappinfo.NewDesktopAppInfoFromFile(desktopPath) - if deskappInfo == nil { - logger.Info("Not Exist DesktopFile") - return "", nil - } - - appInfo := newAppInfo(deskappInfo) - appInfo.identifyMethod = "Android" - - return appInfo.innerId, appInfo - } - - return "", nil -} - -func identifyWindowByPidEnv(m *Manager, winInfo *baseWindowInfo) (string, *AppInfo) { - msgPrefix := fmt.Sprintf("identifyWindowByPidEnv win: %d ", winInfo.xid) - pid := winInfo.pid - process := winInfo.process - if process != nil && pid != 0 { - launchedDesktopFile := process.environ.Get("GIO_LAUNCHED_DESKTOP_FILE") - launchedDesktopFilePid, _ := strconv.ParseUint( - process.environ.Get("GIO_LAUNCHED_DESKTOP_FILE_PID"), 10, 32) - - logger.Debugf("%s launchedDesktopFile: %q, pid: %d", - msgPrefix, launchedDesktopFile, launchedDesktopFilePid) - - // 以下 2 种情况下,才能信任环境变量 GIO_LAUNCHED_DESKTOP_FILE。 - // 1. 当窗口 pid 和 launchedDesktopFilePid 相同时; - // 2. 当窗口的进程的父进程 id(即 ppid)和 launchedDesktopFilePid 相同, - // 并且该父进程是 sh 或 bash 时。 - var try bool - if uint(launchedDesktopFilePid) == pid { - try = true - } else if uint(launchedDesktopFilePid) == process.ppid && process.ppid != 0 { - logger.Debug(msgPrefix, "ppid equal") - parentProcess := procfs.Process(process.ppid) - cmdline, err := parentProcess.Cmdline() - if err == nil && len(cmdline) > 0 { - logger.Debugf("%s parent process cmdline: %#v", msgPrefix, cmdline) - base := filepath.Base(cmdline[0]) - if base == "sh" || base == "bash" { - try = true - } - } - } - - if try { - appInfo := NewAppInfoFromFile(launchedDesktopFile) - if appInfo != nil { - // success - return appInfo.innerId, appInfo - } - } - } - // fail - return "", nil -} - -func identifyKwindowByExeEnv(m *Manager, winInfo *KWindowInfo) (string, *AppInfo) { - appId := winInfo.appId - msgPrefix := fmt.Sprintf("identifyKwindowByExeEnv appId: %s ", appId) - if winInfo.process == nil { - logger.Warning("identify kwindow error: process is not inited.") - return "", nil - } - process := winInfo.process - customExecName := filepath.Base(process.exe) - - // 对于一个应用对应多个pid的情况,根据process中的可执行文件名和该应用的appId去识别窗口 - if strings.Contains(customExecName, appId) { - launchedDesktopFile := process.environ.Get("GIO_LAUNCHED_DESKTOP_FILE") - logger.Debug(msgPrefix, "launchedDesktopFile: ", launchedDesktopFile) - appInfo := NewAppInfoFromFile(launchedDesktopFile) - if appInfo != nil { - // success - return appInfo.innerId, appInfo - } - } - - return "", nil -} - -func identifyWindowByRule(m *Manager, winInfo *WindowInfo) (string, *AppInfo) { - msgPrefix := fmt.Sprintf("identifyWindowByRule win: %d ", winInfo.xid) - ret := m.windowPatterns.Match(winInfo) - if ret == "" { - return "", nil - } - logger.Debug(msgPrefix, "patterns match result:", ret) - // parse ret - // id=$appId or env - var appInfo *AppInfo - if len(ret) > 4 && strings.HasPrefix(ret, "id=") { - appInfo = NewAppInfo(ret[3:]) - } else if ret == "env" { - process := winInfo.process - if process != nil { - launchedDesktopFile := process.environ.Get("GIO_LAUNCHED_DESKTOP_FILE") - if launchedDesktopFile != "" { - appInfo = NewAppInfoFromFile(launchedDesktopFile) - } - } - } else { - logger.Warningf("bad ret: %q", ret) - } - - if appInfo != nil { - return appInfo.innerId, appInfo - } - return "", nil -} - -func identifyWindowByWmClass(m *Manager, winInfo *WindowInfo) (string, *AppInfo) { - if winInfo.wmClass != nil { - instance := winInfo.wmClass.Instance - if instance != "" { - // example: - // WM_CLASS(STRING) = "Brackets", "Brackets" - // wm class instance is Brackets - // try app id org.deepin.flatdeb.brackets - appInfo := NewAppInfo("org.deepin.flatdeb." + strings.ToLower(instance)) - if appInfo != nil { - return appInfo.innerId, appInfo - } - - appInfo = NewAppInfo(instance) - if appInfo != nil { - return appInfo.innerId, appInfo - } - } - - class := winInfo.wmClass.Class - if class != "" { - appInfo := NewAppInfo(class) - if appInfo != nil { - return appInfo.innerId, appInfo - } - } - } - // fail - return "", nil -} - -func identifyWindowByBamf(m *Manager, winInfo *baseWindowInfo) (string, *AppInfo) { - msgPrefix := fmt.Sprintf("identifyWindowByBamf win: %d ", winInfo.xid) - win := winInfo.xid - desktop := "" - // 重试 bamf 识别,yozo office 的窗口经常要第二次时才能识别到。 - for i := 0; i < 3; i++ { - var err error - desktop, err = getDesktopFromWindowByBamf(win) - logger.Debugf("%s get desktop i: %d, desktop: %q", msgPrefix, i, desktop) - if err != nil { - logger.Warning(msgPrefix, "get desktop failed:", err) - } - if desktop != "" { - break - } - time.Sleep(100 * time.Millisecond) - } - - if desktop != "" { - appInfo := NewAppInfoFromFile(desktop) - if appInfo != nil { - // success - return appInfo.innerId, appInfo - } - } - return "", nil -} - -func identifyWindowByCmdlineXWalk(m *Manager, winInfo *WindowInfo) (string, *AppInfo) { - msgPrefix := fmt.Sprintf("identifyWindowByCmdlineXWalk win: %d ", winInfo.xid) - process := winInfo.process - if process == nil || winInfo.pid == 0 { - return "", nil - } - - exeBase := filepath.Base(process.exe) - args := process.args - if exeBase != "xwalk" || len(args) == 0 { - return "", nil - } - lastArg := args[len(args)-1] - logger.Debugf("%s lastArg: %q", msgPrefix, lastArg) - - if filepath.Base(lastArg) == "manifest.json" { - appId := filepath.Base(filepath.Dir(lastArg)) - appInfo := NewAppInfo(appId) - if appInfo != nil { - // success - return appInfo.innerId, appInfo - } - } - // failed - return "", nil -} diff --git a/dock/identify_window_pattern.go b/dock/identify_window_pattern.go deleted file mode 100644 index 4dc7327cc..000000000 --- a/dock/identify_window_pattern.go +++ /dev/null @@ -1,311 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "path/filepath" - "regexp" - "strings" - "sync" -) - -type WindowPatterns []WindowPattern - -type WindowPattern struct { - Rules []WindowRule `json:"rules"` - Result string `json:"ret"` - ParsedRules []*WindowRuleParsed -} - -type WindowRule [2]string -type WindowRuleParsed struct { - Key string - ValueParsed *RuleValueParsed -} - -func (rule *WindowRule) Parse() *WindowRuleParsed { - key, value := rule[0], rule[1] - return &WindowRuleParsed{ - Key: key, - ValueParsed: parseRuleValue(value), - } -} - -func loadWindowPatterns(file string) (WindowPatterns, error) { - content, err := ioutil.ReadFile(file) - if err != nil { - return nil, err - } - var patterns WindowPatterns - err = json.Unmarshal(content, &patterns) - if err != nil { - return nil, err - } - logger.Debugf("loadWindowPatterns: ok count %d", len(patterns)) - - // parse pattterns - for i := range patterns { - pattern := &patterns[i] - rules := pattern.Rules - // parse rules in pattern - pattern.ParsedRules = make([]*WindowRuleParsed, len(rules)) - for j := range rules { - rule := &rules[j] - pattern.ParsedRules[j] = rule.Parse() - } - } - - return patterns, nil -} - -func (patterns WindowPatterns) Match(winInfo *WindowInfo) string { - for i := range patterns { - pattern := &patterns[i] - rules := pattern.ParsedRules - patternOk := true - - logger.Debugf("try pattern %d", i) - for j := range rules { - rule := rules[j] - ok := rule.Match(winInfo) - if !ok { - // pattern match fail - patternOk = false - break - } - } - - if patternOk { - // pattern match success - logger.Debugf("pattern match success") - return pattern.Result - } - } - // fail - return "" -} - -func parseRuleKey(winInfo *WindowInfo, key string) string { - switch key { - case "hasPid": - if winInfo.process != nil && winInfo.process.hasPid { - return "t" - } - return "f" - case "exec": - // executable file base name - if winInfo.process != nil { - return filepath.Base(winInfo.process.exe) - } - case "arg": - // command line arguments - if winInfo.process != nil { - return strings.Join(winInfo.process.args, " ") - } - // xprop example: - // WM_CLASS(STRING) = "dman", "DManual" - // wmClass.Instance is dman - // wmClass.Class is DManual - case "wmi": - // wmClass.Instance - if winInfo.wmClass != nil { - return winInfo.wmClass.Instance - } - case "wmc": - // wmClass.Class - if winInfo.wmClass != nil { - return winInfo.wmClass.Class - } - case "wmn": - // WM_NAME - return winInfo.wmName - case "wmrole": - // WM_ROLE - return winInfo.wmRole - - default: - const envPrefix = "env." - if strings.HasPrefix(key, envPrefix) { - envName := key[len(envPrefix):] - if winInfo.process != nil { - return winInfo.process.environ.Get(envName) - } - } - } - return "" -} - -func (rule *WindowRuleParsed) Match(winInfo *WindowInfo) bool { - keyParsed := parseRuleKey(winInfo, rule.Key) - fn := rule.ValueParsed.Fn - if fn == nil { - logger.Warningf("WindowRule.Match: badRuleValue %q", rule.ValueParsed.Original) - return false - } - result := fn(keyParsed) - logger.Debugf("%s %q %v ? %v", rule.Key, keyParsed, rule.ValueParsed, result) - return result -} - -type RuleValueParsed struct { - Fn RuleMatchFunc - Type byte - Flags RuleValueParsedFlag - Original string - Value string -} -type RuleMatchFunc func(string) bool - -type RuleValueParsedFlag uint - -const ( - RuleValueParsedFlagNone RuleValueParsedFlag = 1 << iota - RuleValueParsedFlagNegative - RuleValueParsedFlagIgnoreCase -) - -func (p *RuleValueParsed) String() string { - var buf bytes.Buffer - if p.Fn == nil { - return "bad rule" - } - - if p.Flags&RuleValueParsedFlagNegative != 0 { - buf.WriteString("not ") - } - - var typeDesc string - switch p.Type { - case '=', 'e', 'E': - typeDesc = "equal" - case 'c', 'C': - typeDesc = "contains" - case 'r', 'R': - typeDesc = "match regexp " - default: - typeDesc = "" - } - buf.WriteString(typeDesc) - - if p.Flags&RuleValueParsedFlagIgnoreCase != 0 { - buf.WriteString(" (ignore case)") - } - // "$k not equal (ignore case) $p.value" - fmt.Fprintf(&buf, " %q", p.Value) - return buf.String() -} - -func negativeRule(fn RuleMatchFunc) RuleMatchFunc { - return func(k string) bool { - return !fn(k) - } -} - -var regexpCache map[string]*regexp.Regexp = make(map[string]*regexp.Regexp) -var regexpCacheMutex sync.Mutex - -func getRegexp(expr string) *regexp.Regexp { - regexpCacheMutex.Lock() - defer regexpCacheMutex.Unlock() - - reg, ok := regexpCache[expr] - if ok { - return reg - } - reg, err := regexp.Compile(expr) - if err != nil { - logger.Warning(err) - } - regexpCache[expr] = reg - return reg -} - -// "=:XXX" equal XXX -// "=!XXX" not equal XXX - -// "c:XXX" contains XXX -// "c!XXX" not contains XXX - -// "r:XXX" match regexp XXX -// "r!XXX" not match regexp XXX - -// e c r ignore case -// = E C R not ignore case -func parseRuleValue(val string) *RuleValueParsed { - var ret = &RuleValueParsed{ - Original: val, - } - if len(val) < 2 { - return ret - } - var negative bool - switch val[1] { - case ':': - case '!': - ret.Flags |= RuleValueParsedFlagNegative - negative = true - default: - return ret - } - // type - value := val[2:] - ret.Value = value - ret.Type = val[0] - - var fn RuleMatchFunc - switch val[0] { - case 'C': - fn = func(k string) bool { - return strings.Contains(k, value) - } - case 'c': - ret.Flags |= RuleValueParsedFlagIgnoreCase - fn = func(k string) bool { - return strings.Contains( - strings.ToLower(k), - strings.ToLower(value)) - } - case '=', 'E': - fn = func(k string) bool { - return k == value - } - case 'e': - ret.Flags |= RuleValueParsedFlagIgnoreCase - fn = func(k string) bool { - return strings.EqualFold(k, value) - } - - case 'R': - fn = func(k string) bool { - reg := getRegexp(value) - if reg == nil { - return false - } - return reg.MatchString(k) - } - case 'r': - ret.Flags |= RuleValueParsedFlagIgnoreCase - fn = func(k string) bool { - reg := getRegexp("(?i)" + value) - if reg == nil { - return false - } - return reg.MatchString(k) - } - - default: - return ret - } - if negative { - ret.Fn = negativeRule(fn) - } else { - ret.Fn = fn - } - return ret -} diff --git a/dock/init.go b/dock/init.go deleted file mode 100644 index 21530ca4c..000000000 --- a/dock/init.go +++ /dev/null @@ -1,113 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "path/filepath" - - "github.com/linuxdeepin/go-lib/log" - "github.com/linuxdeepin/go-lib/xdg/basedir" - "github.com/linuxdeepin/dde-daemon/loader" - - x "github.com/linuxdeepin/go-x11-client" -) - -func init() { - loader.Register(NewDaemon(logger)) -} - -var ( - logger = log.NewLogger("daemon/dock") - homeDir string - scratchDir string - dockManager *Manager - - globalXConn *x.Conn - - atomNetShowingDesktop x.Atom - atomNetClientList x.Atom - atomNetActiveWindow x.Atom - atomNetWMIcon x.Atom - atomNetWMName x.Atom - atomNetWMState x.Atom - atomNetWMWindowType x.Atom - atomXEmbedInfo x.Atom - atomNetFrameExtents x.Atom - atomGtkFrameExtents x.Atom - atomNetWmStateHidden x.Atom - atomWmWindowRole x.Atom - atomUTF8String x.Atom - atomString x.Atom - atomInteger x.Atom - atomFlatpakAppId x.Atom - atomGtkApplicationId x.Atom - atomNetWmWindowOpacity x.Atom - atomWmClientLeader x.Atom - atomWmCommand x.Atom - atomNetWmStateFocused x.Atom //nolint - atomNetWmWindowTypeDesktop x.Atom - atomNetWmActionMinimize x.Atom - atomWmStateDemandsAttention x.Atom - atomNetWmStateSkipTaskbar x.Atom - atomNetWmStateModal x.Atom - atomNetWmWindowTypeDialog x.Atom - atomNetWmStateMaximizedVert x.Atom - atomNetWmStateMaximizedHorz x.Atom - atomNetWmStateAbove x.Atom - atomNetWmActionClose x.Atom - atomNetWmAllowedActions x.Atom - atomNetWmPid x.Atom - atomMotifWmHints x.Atom - - atomAndroidUengineId x.Atom - atomAndroidUengineName x.Atom - atomDSGVirtualAppDesktop x.Atom -) - -func initDir() { - homeDir = basedir.GetUserHomeDir() - scratchDir = filepath.Join(basedir.GetUserConfigDir(), "dock/scratch") - logger.Debugf("scratch dir: %q", scratchDir) -} - -func initAtom() { - atomNetShowingDesktop, _ = getAtom("_NET_SHOWING_DESKTOP") - atomNetClientList, _ = getAtom("_NET_CLIENT_LIST") - atomNetActiveWindow, _ = getAtom("_NET_ACTIVE_WINDOW") - atomNetWMIcon, _ = getAtom("_NET_WM_ICON") - atomNetWMName, _ = getAtom("_NET_WM_NAME") - atomNetWMState, _ = getAtom("_NET_WM_STATE") - atomNetWMWindowType, _ = getAtom("_NET_WM_WINDOW_TYPE") - atomXEmbedInfo, _ = getAtom("_XEMBED_INFO") - atomNetFrameExtents, _ = getAtom("_NET_FRAME_EXTENTS") - atomGtkFrameExtents, _ = getAtom("_GTK_FRAME_EXTENTS") - atomNetWmStateHidden, _ = getAtom("_NET_WM_STATE_HIDDEN") - atomWmWindowRole, _ = getAtom("WM_WINDOW_ROLE") - atomUTF8String, _ = getAtom("UTF8_STRING") - atomString, _ = getAtom("STRING") - atomInteger, _ = getAtom("INTEGER") - atomFlatpakAppId, _ = getAtom("FLATPAK_APPID") - atomGtkApplicationId, _ = getAtom("_GTK_APPLICATION_ID") - atomNetWmWindowOpacity, _ = getAtom("_NET_WM_WINDOW_OPACITY") - atomWmClientLeader, _ = getAtom("WM_CLIENT_LEADER") - atomWmCommand, _ = getAtom("WM_COMMAND") - atomNetWmStateFocused, _ = getAtom("_NET_WM_STATE_FOCUSED") - atomNetWmWindowTypeDesktop, _ = getAtom("_NET_WM_WINDOW_TYPE_DESKTOP") - atomNetWmActionMinimize, _ = getAtom("_NET_WM_ACTION_MINIMIZE") - atomWmStateDemandsAttention, _ = getAtom("_NET_WM_STATE_DEMANDS_ATTENTION") - atomNetWmStateSkipTaskbar, _ = getAtom("_NET_WM_STATE_SKIP_TASKBAR") - atomNetWmStateModal, _ = getAtom("_NET_WM_STATE_MODAL") - atomNetWmWindowTypeDialog, _ = getAtom("_NET_WM_WINDOW_TYPE_DIALOG") - atomNetWmStateMaximizedVert, _ = getAtom("_NET_WM_STATE_MAXIMIZED_VERT") - atomNetWmStateMaximizedHorz, _ = getAtom("_NET_WM_STATE_MAXIMIZED_HORZ") - atomNetWmStateAbove, _ = getAtom("_NET_WM_STATE_ABOVE") - atomNetWmActionClose, _ = getAtom("_NET_WM_ACTION_CLOSE") - atomNetWmAllowedActions, _ = getAtom("_NET_WM_ALLOWED_ACTIONS") - atomNetWmPid, _ = getAtom("_NET_WM_PID") - atomMotifWmHints, _ = getAtom("_MOTIF_WM_HINTS") - atomAndroidUengineId, _ = getAtom("UENGINE_TASK_ID") - atomAndroidUengineName, _ = getAtom("UENGINE_TASK_NAME") - atomDSGVirtualAppDesktop, _ = getAtom("_DSG_NET_WM_LAUNCHED_DESKTOP_FILE") -} diff --git a/dock/kwindow_info.go b/dock/kwindow_info.go deleted file mode 100644 index 66c1baa04..000000000 --- a/dock/kwindow_info.go +++ /dev/null @@ -1,315 +0,0 @@ -// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "time" - - kwayland "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.kwayland" - x "github.com/linuxdeepin/go-x11-client" -) - -type WindowInfoImp interface { - getXid() x.Window - setEntry(*AppEntry) - getEntry() *AppEntry - shouldSkip() bool - getEntryInnerId() string - getInnerId() string - setEntryInnerId(string) - getAppInfo() *AppInfo - setAppInfo(*AppInfo) - print() - getDisplayName() string - getIcon() string - getTitle() string - isDemandingAttention() bool - allowClose() bool - close(timestamp uint32) error - getPid() uint - getProcess() *ProcessInfo - activate() error - minimize() error - maximize() error - makeWindowAbove() error - isMinimized() bool - killClient() error - changeXid(x.Window) bool - getCreatedTime() int64 -} - -type KWindowInfo struct { - baseWindowInfo - winObj kwayland.Window - updateCalled bool - - appId string - internalId uint32 - demandingAttention bool - closeable bool - minimized bool - geometry kwayland.Rect -} - -type baseWindowInfo struct { - xid x.Window - Title string - Icon string - pid uint - entryInnerId string - innerId string - entry *AppEntry - appInfo *AppInfo - process *ProcessInfo - createdTime int64 -} - -func (winInfo *KWindowInfo) print() { - // TODO - return -} - -func (winInfo *KWindowInfo) getDisplayName() string { - // TODO - return "" -} - -func (winInfo *KWindowInfo) shouldSkip() bool { - if !winInfo.updateCalled { - winInfo.update() - winInfo.updateCalled = true - } - - skip, err := winInfo.winObj.SkipTaskbar(0) - if err != nil { - logger.Warning(err) - return true - } - // + 添加窗口能否最小化判断,如果窗口不能最小化则隐藏任务栏图标 - canMinimize, _ := winInfo.winObj.IsMinimizeable(0) - if canMinimize == false { - skip = true - } - - if skip { - // + 白名单(临时方案,待窗口增加wayland下窗口规则后再修改): 修复类似欢迎应用没有最小化窗口,但是需要在任务栏显示图标 - for _, app := range []string{"dde-introduction"} { - if app == winInfo.appId { - skip = false - } - } - } - return skip -} - -// baseWindowInfo -func (winInfo *baseWindowInfo) getInnerId() string { - return winInfo.innerId -} - -func (winInfo *baseWindowInfo) getPid() uint { - return winInfo.pid -} - -func (winInfo *baseWindowInfo) getIcon() string { - return winInfo.Icon -} - -func (winInfo *baseWindowInfo) getTitle() string { - return winInfo.Title -} - -func (winInfo *baseWindowInfo) getProcess() *ProcessInfo { - return winInfo.process -} - -func (winInfo *baseWindowInfo) getEntry() *AppEntry { - return winInfo.entry -} - -func (winInfo *baseWindowInfo) setEntry(v *AppEntry) { - winInfo.entry = v -} - -func (winInfo *baseWindowInfo) getEntryInnerId() string { - return winInfo.entryInnerId -} - -func (winInfo *baseWindowInfo) setEntryInnerId(v string) { - winInfo.entryInnerId = v -} - -func (winInfo *baseWindowInfo) getAppInfo() *AppInfo { - return winInfo.appInfo -} - -func (winInfo *baseWindowInfo) setAppInfo(v *AppInfo) { - winInfo.appInfo = v -} - -func (winInfo *baseWindowInfo) getXid() x.Window { - return winInfo.xid -} - -func (winInfo *baseWindowInfo) getCreatedTime() int64 { - return winInfo.createdTime -} - -func newKWindowInfo(winObj kwayland.Window, xid uint32) *KWindowInfo { - winInfo := &KWindowInfo{ - winObj: winObj, - } - winInfo.xid = x.Window(xid) - winInfo.createdTime = time.Now().UnixNano() - return winInfo -} - -func (winInfo *KWindowInfo) fetchTitle() string { - title, err := winInfo.winObj.Title(0) - if err != nil { - logger.Warning(err) - return "" - } - return title -} - -func (winInfo *KWindowInfo) updateTitle() { - winInfo.Title = winInfo.fetchTitle() -} - -func (winInfo *KWindowInfo) fetchIcon() string { - icon, err := winInfo.winObj.Icon(0) - if err != nil { - logger.Warning(err) - return "" - } - return icon -} - -func (winInfo *KWindowInfo) updateIcon() { - winInfo.Icon = winInfo.fetchIcon() -} - -func (winInfo *KWindowInfo) updateGeometry() bool { - rect, err := winInfo.winObj.Geometry(0) - if err != nil { - logger.Warning(err) - return false - } - if winInfo.geometry == rect { - return false - } - winInfo.geometry = rect - return true -} - -func (winInfo *KWindowInfo) allowClose() bool { - return winInfo.closeable -} - -func (winInfo *KWindowInfo) isDemandingAttention() bool { - return winInfo.demandingAttention -} - -func (winInfo *KWindowInfo) updateAppId() { - appId, err := winInfo.winObj.AppId(0) - if err != nil { - logger.Warning(err) - } - winInfo.appId = appId -} - -func (winInfo *KWindowInfo) update() { - logger.Debug("update window info", winInfo.winObj.Path_()) - winInfo.updateInternalId() - winInfo.updateAppId() - winInfo.updateIcon() - winInfo.updateTitle() - winInfo.updateGeometry() - winInfo.updateDemandingAttention() - winInfo.updateCloseable() - winInfo.updateProcessInfo() -} - -func (winInfo *KWindowInfo) updateInternalId() { - id, err := winInfo.winObj.InternalId(0) - if err != nil { - logger.Warning(err) - } - winInfo.internalId = id -} - -func (winInfo *KWindowInfo) updateDemandingAttention() { - isDA, err := winInfo.winObj.IsDemandingAttention(0) - if err != nil { - logger.Warning(err) - } - winInfo.demandingAttention = isDA -} - -func (winInfo *KWindowInfo) updateCloseable() { - closeable, err := winInfo.winObj.IsCloseable(0) - if err != nil { - logger.Warning(err) - closeable = true - } - winInfo.closeable = closeable -} - -func (winInfo *KWindowInfo) updateMinimized() { - minimized, err := winInfo.winObj.IsMinimized(0) - if err != nil { - logger.Warning(err) - } - winInfo.minimized = minimized -} - -func (winInfo *KWindowInfo) isMinimized() bool { - return winInfo.minimized -} - -func (winInfo *KWindowInfo) updateProcessInfo() { - pid, err := winInfo.winObj.Pid(0) - if err != nil { - logger.Warning(err) - return - } - winInfo.pid = uint(pid) - winInfo.process, err = NewProcessInfo(winInfo.pid) - if err != nil { - logger.Warning(err) - return - } - logger.Debugf("process: %#v", winInfo.process) -} - -func (winInfo *KWindowInfo) activate() error { - return winInfo.winObj.RequestActivate(0) -} - -func (winInfo *KWindowInfo) minimize() error { - return winInfo.winObj.RequestToggleMinimized(0) -} - -func (winInfo *KWindowInfo) maximize() error { - return winInfo.winObj.RequestToggleMaximized(0) -} - -func (winInfo *KWindowInfo) makeWindowAbove() error { - return winInfo.winObj.RequestToggleKeepAbove(0) -} - -func (winInfo *KWindowInfo) close(timestamp uint32) error { - return winInfo.winObj.RequestClose(0) -} - -func (winInfo *KWindowInfo) killClient() error { - return winInfo.winObj.RequestClose(0) -} - -func (winInfo *KWindowInfo) changeXid(xid x.Window) bool { - winInfo.xid = xid - return true -} diff --git a/dock/menu.go b/dock/menu.go deleted file mode 100644 index 421980db6..000000000 --- a/dock/menu.go +++ /dev/null @@ -1,105 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "encoding/json" - "errors" - "strconv" -) - -/* -json sample -{ - "checkableMenu" : false, - "items" : [ - { - "itemText" : "item 1", - "isActive" : true, - "itemSubMenu" : nil, - "itemId" : "2", - "itemIconInactive" : "", - "checked" : false, - "itemIconHover" : "", - "itemIcon" : "", - "showCheckMark" : false, - "isCheckable" : false - }, - ], - "singleCheck" : false -} -*/ - -type MenuItem struct { - Id string `json:"itemId"` - Text string `json:"itemText"` - IsActive bool `json:"isActive"` - IsCheckable bool `json:"isCheckable"` - Checked bool `json:"checked"` - Icon string `json:"itemIcon"` - IconHover string `json:"itemIconHover"` - IconInactive string `json:"itemIconInactive"` - ShowCheckMark bool `json:"showCheckMark"` - SubMenu *Menu `json:"itemSubMenu"` - - hint int - action func(uint32) -} - -const menuItemHintShowAllWindows = 1 - -func NewMenuItem(name string, action func(uint32), enable bool) *MenuItem { - return &MenuItem{ - Text: name, - IsActive: enable, - action: action, - } -} - -type Menu struct { - Items []*MenuItem `json:"items"` - CheckableMenu bool `json:"checkableMenu"` - SingleCheck bool `json:"singleCheck"` - - itemCount int64 -} - -func NewMenu() *Menu { - return &Menu{} -} - -func (m *Menu) allocateId() string { - idStr := strconv.FormatInt(m.itemCount, 10) - m.itemCount++ - return idStr -} - -func (m *Menu) AppendItem(items ...*MenuItem) { - for _, item := range items { - if item.Text != "" { - item.Id = m.allocateId() - m.Items = append(m.Items, item) - } - } -} - -func (m *Menu) HandleAction(id string, timestamp uint32) error { - for _, item := range m.Items { - if id == item.Id { - item.action(timestamp) - return nil - } - } - return errors.New("invalid item id") -} - -func (m *Menu) GenerateJSON() string { - bytes, err := json.Marshal(m) - if err != nil { - logger.Warning(err) - return "" - } - return string(bytes) -} diff --git a/dock/menu_test.go b/dock/menu_test.go deleted file mode 100644 index e004321ec..000000000 --- a/dock/menu_test.go +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" -) - -func IsContainItem(items []*MenuItem, item *MenuItem) bool { - for _, i := range items { - if i.Text == item.Text && i.IsActive == item.IsActive && i.Id != "" { - return true - } - } - return false -} - -func Test_AppendItem(t *testing.T) { - menu := NewMenu() - item0 := NewMenuItem("item 0", nil, true) - item1 := NewMenuItem("item 1", nil, true) - item2 := NewMenuItem("item 2", nil, true) - item3 := NewMenuItem("item 3", nil, true) - menu.AppendItem(item0, item1, item2) - - assert.True(t, IsContainItem(menu.Items, item0)) - assert.True(t, IsContainItem(menu.Items, item1)) - assert.True(t, IsContainItem(menu.Items, item2)) - assert.False(t, IsContainItem(menu.Items, item3)) -} - -func Test_GenerateMenuJson(t *testing.T) { - menu := NewMenu() - item0 := NewMenuItem("item 0", nil, true) - item1 := NewMenuItem("item 1", nil, true) - item2 := NewMenuItem("item 2", nil, true) - menu.AppendItem(item0, item1, item2) - - menuJSON := menu.GenerateJSON() - assert.Equal(t, menuJSON, `{"items":[{"itemId":"0","itemText":"item 0","isActive":true,"isCheckable":false,"checked":false,"itemIcon":"","itemIconHover":"","itemIconInactive":"","showCheckMark":false,"itemSubMenu":null},{"itemId":"1","itemText":"item 1","isActive":true,"isCheckable":false,"checked":false,"itemIcon":"","itemIconHover":"","itemIconInactive":"","showCheckMark":false,"itemSubMenu":null},{"itemId":"2","itemText":"item 2","isActive":true,"isCheckable":false,"checked":false,"itemIcon":"","itemIconHover":"","itemIconInactive":"","showCheckMark":false,"itemSubMenu":null}],"checkableMenu":false,"singleCheck":false}`) - - var parseResult interface{} - err := json.Unmarshal([]byte(menuJSON), &parseResult) - assert.NoError(t, err) -} diff --git a/dock/plugin_settings.go b/dock/plugin_settings.go deleted file mode 100644 index bf7f27926..000000000 --- a/dock/plugin_settings.go +++ /dev/null @@ -1,136 +0,0 @@ -// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "encoding/json" - "reflect" - "sync" - "time" - - "github.com/linuxdeepin/go-lib/dbusutil" -) - -type pluginSettings map[string]map[string]interface{} - -type pluginSettingsStorage struct { - m *Manager - data pluginSettings - dataMu sync.Mutex - - timer *time.Timer - saving bool - saveStateMu sync.Mutex -} - -func newPluginSettingsStorage(m *Manager) *pluginSettingsStorage { - s := &pluginSettingsStorage{m: m} - - jsonStr := m.settings.GetString(settingKeyPluginSettings) - var v pluginSettings - err := json.Unmarshal([]byte(jsonStr), &v) - if err == nil { - s.data = v - } else { - logger.Warning("failed to load plugin settings:", err) - s.data = make(pluginSettings) - } - - s.timer = time.AfterFunc(3*time.Second, func() { - s.save() - s.saveStateMu.Lock() - s.saving = false - s.saveStateMu.Unlock() - }) - return s -} - -func (s *pluginSettingsStorage) requestSave() { - s.saveStateMu.Lock() - defer s.saveStateMu.Unlock() - - if s.saving { - return - } else { - s.timer.Reset(1 * time.Second) - s.saving = true - } -} - -func (s *pluginSettingsStorage) save() { - s.dataMu.Lock() - defer s.dataMu.Unlock() - - jsonData, err := json.Marshal(s.data) - if err != nil { - logger.Warning(err) - return - } - ok := s.m.settings.SetString(settingKeyPluginSettings, string(jsonData)) - if !ok { - logger.Warning("failed to save plugin settings") - } -} - -func (s *pluginSettingsStorage) getJsonStr() (string, error) { - s.dataMu.Lock() - defer s.dataMu.Unlock() - - jsonData, err := json.Marshal(s.data) - if err != nil { - return "", dbusutil.ToError(err) - } - return string(jsonData), nil -} - -func (s *pluginSettingsStorage) set(v pluginSettings) { - s.dataMu.Lock() - s.data = v - s.dataMu.Unlock() - s.requestSave() -} - -func (s *pluginSettingsStorage) merge(v pluginSettings) { - s.dataMu.Lock() - - for key1, value1 := range v { - if s.data[key1] == nil && len(value1) > 0 { - s.data[key1] = make(map[string]interface{}) - } - - for key2, value2 := range value1 { - s.data[key1][key2] = value2 - } - } - - s.dataMu.Unlock() - s.requestSave() -} - -func (s *pluginSettingsStorage) remove(key1 string, key2List []string) { - s.dataMu.Lock() - - if len(key2List) == 0 { - delete(s.data, key1) - } else { - if value1, ok := s.data[key1]; ok { - for _, key2 := range key2List { - delete(value1, key2) - } - if len(value1) == 0 { - delete(s.data, key1) - } - } - } - - s.dataMu.Unlock() - s.requestSave() -} - -func (s *pluginSettingsStorage) equal(v pluginSettings) bool { - s.dataMu.Lock() - defer s.dataMu.Unlock() - return reflect.DeepEqual(s.data, v) -} diff --git a/dock/process_info.go b/dock/process_info.go deleted file mode 100644 index 83c61d58d..000000000 --- a/dock/process_info.go +++ /dev/null @@ -1,142 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "errors" - "fmt" - "path/filepath" - "strconv" - "strings" - - "github.com/linuxdeepin/go-lib/procfs" -) - -type ProcessInfo struct { - process procfs.Process - cmdline []string - args []string - exe string - cwd string - environ procfs.EnvVars - hasPid bool - ppid uint -} - -func NewProcessInfoWithCmdline(cmd []string) *ProcessInfo { - if len(cmd) == 0 { - return nil - } - return &ProcessInfo{ - cmdline: cmd, - args: cmd[1:], - exe: cmd[0], - } -} - -func NewProcessInfo(pid uint) (*ProcessInfo, error) { - if pid == 0 { - return nil, errors.New("pid is 0") - } - - process := procfs.Process(pid) - pInfo := &ProcessInfo{ - process: process, - hasPid: true, - } - var err error - - // exe - pInfo.exe, err = process.Exe() - if err != nil { - return nil, err - } - - // cwd - pInfo.cwd, err = process.Cwd() - if err != nil { - return nil, err - } - - // cmdline - pInfo.cmdline, err = process.Cmdline() - if err != nil { - return nil, err - } - - // args - pInfo.args = getCmdlineArgs(pInfo.exe, pInfo.cwd, pInfo.cmdline) - if err != nil { - return nil, err - } - - // environ - pInfo.environ, _ = process.Environ() - - // ppid - if status, err := process.Status(); err == nil { - pInfo.ppid, _ = status.PPid() - } - - return pInfo, nil -} - -func getCmdlineArgs(exe, cwd string, cmdline []string) []string { - ok := verifyExe(exe, cwd, cmdline[0]) - if !ok { - logger.Debug("first arg is not exe file, contains arguments") - // try again - parts := strings.Split(cmdline[0], " ") - ok = verifyExe(exe, cwd, parts[0]) - if !ok { - logger.Warningf("failed to find right exe, exe: %q, cwd: %q, cmdline: %#v", exe, cwd, cmdline) - return nil - } else { - return append(parts[1:], cmdline[1:]...) - } - } else { - return cmdline[1:] - } -} - -func verifyExe(exe, cwd, firstArg string) bool { - if filepath.Base(firstArg) == firstArg { - logger.Debug("basename equal") - return true - } - - if !filepath.IsAbs(firstArg) { - firstArg = filepath.Join(cwd, firstArg) - } - // firstArg is abs path - logger.Debugf("firstArg: %q", firstArg) - firstArgPath, err := filepath.EvalSymlinks(firstArg) - if err != nil { - logger.Warning(err) - // first arg is not exe file, contains arguments - return false - } - logger.Debugf("firstArgPath: %q", firstArgPath) - return exe == firstArgPath -} - -func (p *ProcessInfo) getJoinedExeArgs() string { - var cmdline string - cmdline = strconv.Quote(p.exe) - for _, arg := range p.args { - cmdline += " " + strconv.Quote(arg) - } - return cmdline + " $@" -} - -func (p *ProcessInfo) GetShellScriptLines() string { - cmdline := p.getJoinedExeArgs() - return fmt.Sprintf("#!/bin/sh\ncd %q\nexec %s\n", p.cwd, cmdline) -} - -func (p *ProcessInfo) GetOneCommandLine() string { - cmdline := p.getJoinedExeArgs() - return fmt.Sprintf("sh -c 'cd %q;exec %s;'", p.cwd, cmdline) -} diff --git a/dock/sync_config.go b/dock/sync_config.go deleted file mode 100644 index c47a02df0..000000000 --- a/dock/sync_config.go +++ /dev/null @@ -1,123 +0,0 @@ -// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "encoding/json" - "github.com/linuxdeepin/go-lib/strv" - "os" -) - -type syncConfig struct { - m *Manager -} - -func (sc *syncConfig) Get() (interface{}, error) { - var v syncData - v.Version = syncConfigVersion - v.WindowSizeEfficient = sc.m.WindowSizeEfficient.Get() - v.WindowSizeFashion = sc.m.WindowSizeFashion.Get() - v.DisplayMode = sc.m.DisplayMode.GetString() - v.HideMode = sc.m.HideMode.GetString() - v.Position = sc.m.Position.GetString() - v.DockedApps = sc.m.DockedApps.Get() - - pluginSettingsJsonStr := sc.m.settings.GetString(settingKeyPluginSettings) - err := json.Unmarshal([]byte(pluginSettingsJsonStr), &v.Plugins) - if err != nil { - logger.Warning(err) - } - - return v, nil -} - -func (sc *syncConfig) setPluginSettings(settings pluginSettings) { - m := sc.m - if m.pluginSettings.equal(settings) { - return - } - m.pluginSettings.set(settings) - // emit signal - err := m.service.Emit(m, "PluginSettingsSynced") - if err != nil { - logger.Warning(err) - } -} - -func (sc *syncConfig) setDockedApps(dockedApps []string) { - m := sc.m - added := dockedApps - removed := m.DockedApps.Get() - for _, value := range removed { - desktopFile := unzipDesktopPath(value) - _, err := m.requestUndock(desktopFile) - if err != nil { - logger.Warning(err) - } - } - - var index = 0 - for _, value := range added { - desktopFile := unzipDesktopPath(value) - _, err := os.Stat(desktopFile) - if err == nil { - _, err = m.requestDock(desktopFile, int32(index)) - if err != nil { - logger.Warning(err) - } else { - index++ - } - } - } - - // emit signal - err := m.service.Emit(m, "DockAppSettingsSynced") - if err != nil { - logger.Warning(err) - } -} - -func (sc *syncConfig) Set(data []byte) error { - var v syncData - err := json.Unmarshal(data, &v) - if err != nil { - return err - } - m := sc.m - if v.WindowSizeEfficient > 0 { - m.WindowSizeEfficient.Set(v.WindowSizeEfficient) - } - if v.WindowSizeFashion > 0 { - m.WindowSizeFashion.Set(v.WindowSizeFashion) - } - m.DisplayMode.SetString(v.DisplayMode) - m.HideMode.SetString(v.HideMode) - m.Position.SetString(v.Position) - - if !strv.Strv(m.DockedApps.Get()).Equal(v.DockedApps) { - logger.Debugf("current entries is: %+v", m.DockedApps.Get()) - logger.Debugf("ucloud entries is: %+v", v.DockedApps) - - sc.setDockedApps(v.DockedApps) - } - - sc.setPluginSettings(v.Plugins) - return nil -} - -const ( - syncConfigVersion = "1.2" -) - -type syncData struct { - Version string `json:"version"` - WindowSizeEfficient uint32 `json:"window_size_efficient"` - WindowSizeFashion uint32 `json:"window_size_fashion"` - DisplayMode string `json:"display_mode"` - HideMode string `json:"hide_mode"` - Position string `json:"position"` - DockedApps []string `json:"docked_apps"` - Plugins pluginSettings `json:"plugins"` -} diff --git a/dock/testdata/firefox.desktop b/dock/testdata/firefox.desktop deleted file mode 100644 index 8d7ef4d7a..000000000 --- a/dock/testdata/firefox.desktop +++ /dev/null @@ -1,223 +0,0 @@ -[Desktop Entry] -Version=1.0 -Name=Firefox Web Browser -Name[ar]=متصفح الويب فَيَرفُكْس -Name[ast]=Restolador web Firefox -Name[bn]=ফায়ারফক্স ওয়েব ব্রাউজার -Name[ca]=Navegador web Firefox -Name[cs]=Firefox Webový prohlížeč -Name[da]=Firefox - internetbrowser -Name[el]=Περιηγητής Firefox -Name[es]=Navegador web Firefox -Name[et]=Firefoxi veebibrauser -Name[fa]=مرورگر اینترنتی Firefox -Name[fi]=Firefox-selain -Name[fr]=Navigateur Web Firefox -Name[gl]=Navegador web Firefox -Name[he]=דפדפן האינטרנט Firefox -Name[hr]=Firefox web preglednik -Name[hu]=Firefox webböngésző -Name[it]=Firefox Browser Web -Name[ja]=Firefox ウェブ・ブラウザ -Name[ko]=Firefox 웹 브라우저 -Name[ku]=Geroka torê Firefox -Name[lt]=Firefox interneto naršyklė -Name[nb]=Firefox Nettleser -Name[nl]=Firefox webbrowser -Name[nn]=Firefox Nettlesar -Name[no]=Firefox Nettleser -Name[pl]=Przeglądarka WWW Firefox -Name[pt]=Firefox Navegador Web -Name[pt_BR]=Navegador Web Firefox -Name[ro]=Firefox – Navigator Internet -Name[ru]=Веб-браузер Firefox -Name[sk]=Firefox - internetový prehliadač -Name[sl]=Firefox spletni brskalnik -Name[sv]=Firefox webbläsare -Name[tr]=Firefox Web Tarayıcısı -Name[ug]=Firefox توركۆرگۈ -Name[uk]=Веб-браузер Firefox -Name[vi]=Trình duyệt web Firefox -Name[zh_CN]=Firefox 网络浏览器 -Name[zh_TW]=Firefox 網路瀏覽器 -Comment=Browse the World Wide Web -Comment[ar]=تصفح الشبكة العنكبوتية العالمية -Comment[ast]=Restola pela Rede -Comment[bn]=ইন্টারনেট ব্রাউজ করুন -Comment[ca]=Navegueu per la web -Comment[cs]=Prohlížení stránek World Wide Webu -Comment[da]=Surf på internettet -Comment[de]=Im Internet surfen -Comment[el]=Μπορείτε να περιηγηθείτε στο διαδίκτυο (Web) -Comment[es]=Navegue por la web -Comment[et]=Lehitse veebi -Comment[fa]=صفحات شبکه جهانی اینترنت را مرور نمایید -Comment[fi]=Selaa Internetin WWW-sivuja -Comment[fr]=Naviguer sur le Web -Comment[gl]=Navegar pola rede -Comment[he]=גלישה ברחבי האינטרנט -Comment[hr]=Pretražite web -Comment[hu]=A világháló böngészése -Comment[it]=Esplora il web -Comment[ja]=ウェブを閲覧します -Comment[ko]=웹을 돌아 다닙니다 -Comment[ku]=Li torê bigere -Comment[lt]=Naršykite internete -Comment[nb]=Surf på nettet -Comment[nl]=Verken het internet -Comment[nn]=Surf på nettet -Comment[no]=Surf på nettet -Comment[pl]=Przeglądanie stron WWW -Comment[pt]=Navegue na Internet -Comment[pt_BR]=Navegue na Internet -Comment[ro]=Navigați pe Internet -Comment[ru]=Доступ в Интернет -Comment[sk]=Prehliadanie internetu -Comment[sl]=Brskajte po spletu -Comment[sv]=Surfa på webben -Comment[tr]=İnternet'te Gezinin -Comment[ug]=دۇنيادىكى توربەتلەرنى كۆرگىلى بولىدۇ -Comment[uk]=Перегляд сторінок Інтернету -Comment[vi]=Để duyệt các trang web -Comment[zh_CN]=浏览互联网 -Comment[zh_TW]=瀏覽網際網路 -GenericName=Web Browser -GenericName[ar]=متصفح ويب -GenericName[ast]=Restolador Web -GenericName[bn]=ওয়েব ব্রাউজার -GenericName[ca]=Navegador web -GenericName[cs]=Webový prohlížeč -GenericName[da]=Webbrowser -GenericName[el]=Περιηγητής διαδικτύου -GenericName[es]=Navegador web -GenericName[et]=Veebibrauser -GenericName[fa]=مرورگر اینترنتی -GenericName[fi]=WWW-selain -GenericName[fr]=Navigateur Web -GenericName[gl]=Navegador Web -GenericName[he]=דפדפן אינטרנט -GenericName[hr]=Web preglednik -GenericName[hu]=Webböngésző -GenericName[it]=Browser web -GenericName[ja]=ウェブ・ブラウザ -GenericName[ko]=웹 브라우저 -GenericName[ku]=Geroka torê -GenericName[lt]=Interneto naršyklė -GenericName[nb]=Nettleser -GenericName[nl]=Webbrowser -GenericName[nn]=Nettlesar -GenericName[no]=Nettleser -GenericName[pl]=Przeglądarka WWW -GenericName[pt]=Navegador Web -GenericName[pt_BR]=Navegador Web -GenericName[ro]=Navigator Internet -GenericName[ru]=Веб-браузер -GenericName[sk]=Internetový prehliadač -GenericName[sl]=Spletni brskalnik -GenericName[sv]=Webbläsare -GenericName[tr]=Web Tarayıcı -GenericName[ug]=توركۆرگۈ -GenericName[uk]=Веб-браузер -GenericName[vi]=Trình duyệt Web -GenericName[zh_CN]=网络浏览器 -GenericName[zh_TW]=網路瀏覽器 -Keywords=Internet;WWW;Browser;Web;Explorer -Keywords[ar]=انترنت;إنترنت;متصفح;ويب;وب -Keywords[ast]=Internet;WWW;Restolador;Web;Esplorador -Keywords[ca]=Internet;WWW;Navegador;Web;Explorador;Explorer -Keywords[cs]=Internet;WWW;Prohlížeč;Web;Explorer -Keywords[da]=Internet;Internettet;WWW;Browser;Browse;Web;Surf;Nettet -Keywords[de]=Internet;WWW;Browser;Web;Explorer;Webseite;Site;surfen;online;browsen -Keywords[el]=Internet;WWW;Browser;Web;Explorer;Διαδίκτυο;Περιηγητής;Firefox;Φιρεφοχ;Ιντερνετ -Keywords[es]=Explorador;Internet;WWW -Keywords[fi]=Internet;WWW;Browser;Web;Explorer;selain;Internet-selain;internetselain;verkkoselain;netti;surffaa -Keywords[fr]=Internet;WWW;Browser;Web;Explorer;Fureteur;Surfer;Navigateur -Keywords[he]=דפדפן;אינטרנט;רשת;אתרים;אתר;פיירפוקס;מוזילה; -Keywords[hr]=Internet;WWW;preglednik;Web -Keywords[hu]=Internet;WWW;Böngésző;Web;Háló;Net;Explorer -Keywords[it]=Internet;WWW;Browser;Web;Navigatore -Keywords[is]=Internet;WWW;Vafri;Vefur;Netvafri;Flakk -Keywords[ja]=Internet;WWW;Web;インターネット;ブラウザ;ウェブ;エクスプローラ -Keywords[nb]=Internett;WWW;Nettleser;Explorer;Web;Browser;Nettside -Keywords[nl]=Internet;WWW;Browser;Web;Explorer;Verkenner;Website;Surfen;Online -Keywords[pt]=Internet;WWW;Browser;Web;Explorador;Navegador -Keywords[pt_BR]=Internet;WWW;Browser;Web;Explorador;Navegador -Keywords[ru]=Internet;WWW;Browser;Web;Explorer;интернет;браузер;веб;файрфокс;огнелис -Keywords[sk]=Internet;WWW;Prehliadač;Web;Explorer -Keywords[sl]=Internet;WWW;Browser;Web;Explorer;Brskalnik;Splet -Keywords[tr]=İnternet;WWW;Tarayıcı;Web;Gezgin;Web sitesi;Site;sörf;çevrimiçi;tara -Keywords[uk]=Internet;WWW;Browser;Web;Explorer;Інтернет;мережа;переглядач;оглядач;браузер;веб;файрфокс;вогнелис;перегляд -Keywords[vi]=Internet;WWW;Browser;Web;Explorer;Trình duyệt;Trang web -Keywords[zh_CN]=Internet;WWW;Browser;Web;Explorer;网页;浏览;上网;火狐;Firefox;ff;互联网;网站; -Keywords[zh_TW]=Internet;WWW;Browser;Web;Explorer;網際網路;網路;瀏覽器;上網;網頁;火狐 -Exec=firefox %u -Terminal=false -X-MultipleArgs=false -Type=Application -Icon=firefox -Categories=GNOME;GTK;Network;WebBrowser; -MimeType=text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;image/gif;image/jpeg;image/png;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;x-scheme-handler/chrome;video/webm;application/x-xpinstall; -StartupNotify=true -Actions=NewWindow;NewPrivateWindow; - -[Desktop Action NewWindow] -Name=Open a New Window -Name[ar]=افتح نافذة جديدة -Name[ast]=Abrir una ventana nueva -Name[bn]=Abrir una ventana nueva -Name[ca]=Obre una finestra nova -Name[cs]=Otevřít nové okno -Name[da]=Åbn et nyt vindue -Name[de]=Ein neues Fenster öffnen -Name[el]=Άνοιγμα νέου παραθύρου -Name[es]=Abrir una ventana nueva -Name[fi]=Avaa uusi ikkuna -Name[fr]=Ouvrir une nouvelle fenêtre -Name[gl]=Abrir unha nova xanela -Name[he]=פתיחת חלון חדש -Name[hr]=Otvori novi prozor -Name[hu]=Új ablak nyitása -Name[it]=Apri una nuova finestra -Name[ja]=新しいウィンドウを開く -Name[ko]=새 창 열기 -Name[ku]=Paceyeke nû veke -Name[lt]=Atverti naują langą -Name[nb]=Åpne et nytt vindu -Name[nl]=Nieuw venster openen -Name[pt]=Abrir nova janela -Name[pt_BR]=Abrir nova janela -Name[ro]=Deschide o fereastră nouă -Name[ru]=Новое окно -Name[sk]=Otvoriť nové okno -Name[sl]=Odpri novo okno -Name[sv]=Öppna ett nytt fönster -Name[tr]=Yeni pencere aç -Name[ug]=يېڭى كۆزنەك ئېچىش -Name[uk]=Відкрити нове вікно -Name[vi]=Mở cửa sổ mới -Name[zh_CN]=新建窗口 -Name[zh_TW]=開啟新視窗 -Exec=firefox -new-window -OnlyShowIn=Unity; - -[Desktop Action NewPrivateWindow] -Name=Open a New Private Window -Name[ar]=افتح نافذة جديدة للتصفح الخاص -Name[ca]=Obre una finestra nova en mode d'incògnit -Name[de]=Ein neues privates Fenster öffnen -Name[es]=Abrir una ventana privada nueva -Name[fi]=Avaa uusi yksityinen ikkuna -Name[fr]=Ouvrir une nouvelle fenêtre de navigation privée -Name[he]=פתיחת חלון גלישה פרטית חדש -Name[hu]=Új privát ablak nyitása -Name[it]=Apri una nuova finestra anonima -Name[nb]=Åpne et nytt privat vindu -Name[ru]=Новое приватное окно -Name[sl]=Odpri novo okno zasebnega brskanja -Name[tr]=Yeni bir pencere aç -Name[uk]=Відкрити нове вікно у потайливому режимі -Name[zh_TW]=開啟新隱私瀏覽視窗 -Exec=firefox -private-window -OnlyShowIn=Unity; -Name[zh_CN]=新建隐私浏览窗口 - diff --git a/dock/types.go b/dock/types.go deleted file mode 100644 index 23fc15612..000000000 --- a/dock/types.go +++ /dev/null @@ -1,114 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -type HideModeType int32 - -const ( - HideModeKeepShowing HideModeType = iota - HideModeKeepHidden - HideModeAutoHide // invalid - HideModeSmartHide -) - -func (t HideModeType) String() string { - switch t { - case HideModeKeepShowing: - return "Keep showing mode" - case HideModeKeepHidden: - return "Keep hidden mode" - case HideModeAutoHide: - return "Auto hide mode" - case HideModeSmartHide: - return "Smart hide mode" - default: - return "Unknown mode" - } -} - -type HideStateType int32 - -const ( - HideStateUnknown HideStateType = iota - HideStateShow - HideStateHide -) - -func (s HideStateType) String() string { - switch s { - case HideStateShow: - return "Show" - case HideStateHide: - return "Hide" - default: - return "Unknown" - } -} - -type DisplayModeType int32 - -const ( - DisplayModeFashionMode DisplayModeType = iota - DisplayModeEfficientMode - DisplayModeClassicMode -) - -func (t DisplayModeType) String() string { - switch t { - case DisplayModeFashionMode: - return "Fashion mode" - case DisplayModeEfficientMode: - return "Efficient mode" - case DisplayModeClassicMode: - return "Classic mode" - default: - return "Unknown mode" - } -} - -type positionType int32 - -const ( - positionTop positionType = iota - positionRight - positionBottom - positionLeft -) - -func (p positionType) String() string { - switch p { - case positionTop: - return "Top" - case positionRight: - return "Right" - case positionBottom: - return "Bottom" - case positionLeft: - return "Left" - default: - return "Unknown" - } -} - -type Rect struct { - X, Y int32 - Width, Height uint32 -} - -func NewRect() *Rect { - return &Rect{} -} - -func (r *Rect) Pieces() (int, int, int, int) { - return int(r.X), int(r.Y), int(r.Width), int(r.Height) -} - -type forceQuitAppType uint8 - -const ( - forceQuitAppEnabled forceQuitAppType = iota // 开启 - forceQuitAppDisabled // 关闭 - forceQuitAppDeactivated // 置灰 -) diff --git a/dock/util.go b/dock/util.go deleted file mode 100644 index a730ebec8..000000000 --- a/dock/util.go +++ /dev/null @@ -1,123 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "encoding/base64" - "io" - "io/ioutil" - "net/url" - "os" - "path/filepath" - "strings" - "time" - - "github.com/linuxdeepin/go-lib/xdg/basedir" -) - -var xdgAutostartDirs []string - -func init() { - configDirs := make([]string, 0, 3) - configDirs = append(configDirs, basedir.GetUserConfigDir()) - sysConfigDirs := basedir.GetSystemConfigDirs() - configDirs = append(configDirs, sysConfigDirs...) - - for idx, configDir := range configDirs { - configDirs[idx] = filepath.Join(configDir, "autostart") - } - xdgAutostartDirs = configDirs -} - -func isInAutostartDir(file string) bool { - dir := filepath.Dir(file) - for _, adir := range xdgAutostartDirs { - if adir == dir { - return true - } - } - return false -} - -func dataUriToFile(dataUri, path string) (string, error) { - // dataUri starts with string "data:image/png;base64," - commaIndex := strings.Index(dataUri, ",") - img, err := base64.StdEncoding.DecodeString(dataUri[commaIndex+1:]) - if err != nil { - return path, err - } - - return path, ioutil.WriteFile(path, img, 0644) -} - -func strSliceEqual(sa, sb []string) bool { - if len(sa) != len(sb) { - return false - } - for i, va := range sa { - vb := sb[i] - if va != vb { - return false - } - } - return true -} - -func uniqStrSlice(slice []string) []string { - newSlice := make([]string, 0) - for _, e := range slice { - if !strSliceContains(newSlice, e) { - newSlice = append(newSlice, e) - } - } - return newSlice -} - -func strSliceContains(slice []string, v string) bool { - for _, e := range slice { - if e == v { - return true - } - } - return false -} - -func copyFileContents(src, dst string) (err error) { - in, err := os.Open(src) - if err != nil { - return - } - defer in.Close() - out, err := os.Create(dst) - if err != nil { - return - } - defer func() { - cerr := out.Close() - if err == nil { - err = cerr - } - }() - if _, err = io.Copy(out, in); err != nil { - return - } - err = out.Sync() - return -} - -func getCurrentTimestamp() uint32 { - return uint32(time.Now().Unix()) -} - -func toLocalPath(in string) string { - u, err := url.Parse(in) - if err != nil { - return "" - } - if u.Scheme == "file" { - return u.Path - } - return in -} diff --git a/dock/util_test.go b/dock/util_test.go deleted file mode 100644 index 124635a26..000000000 --- a/dock/util_test.go +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_uniqStrSlice(t *testing.T) { - slice := []string{"a", "b", "c", "c", "b", "a", "c"} - slice = uniqStrSlice(slice) - assert.Equal(t, len(slice), 3) - assert.Equal(t, slice[0], "a") - assert.Equal(t, slice[1], "b") - assert.Equal(t, slice[2], "c") -} - -func Test_strSliceEqual(t *testing.T) { - sa := []string{"a", "b", "c"} - sb := []string{"a", "b", "c", "d"} - sc := sa[:] - assert.False(t, strSliceEqual(sa, sb)) - assert.True(t, strSliceEqual(sa, sc)) -} - -func Test_strSliceContains(t *testing.T) { - slice := []string{"a", "b", "c"} - assert.True(t, strSliceContains(slice, "a")) - assert.True(t, strSliceContains(slice, "b")) - assert.True(t, strSliceContains(slice, "c")) - assert.False(t, strSliceContains(slice, "d")) - assert.False(t, strSliceContains(slice, "e")) - -} diff --git a/dock/window_info.go b/dock/window_info.go deleted file mode 100644 index a0cb5a8bd..000000000 --- a/dock/window_info.go +++ /dev/null @@ -1,451 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "crypto/md5" // #nosec G501 - "encoding/hex" - "fmt" - "path/filepath" - "strings" - "sync" - "time" - "unicode/utf8" - - x "github.com/linuxdeepin/go-x11-client" - "github.com/linuxdeepin/go-x11-client/util/wm/ewmh" - "github.com/linuxdeepin/go-x11-client/util/wm/icccm" -) - -const windowHashPrefix = "w:" - -type WindowInfo struct { - baseWindowInfo - - x int16 - y int16 - width uint16 - height uint16 - lastConfigureNotifyEvent *x.ConfigureNotifyEvent - mu sync.Mutex - updateConfigureTimer *time.Timer - - wmState []x.Atom - wmWindowType []x.Atom - wmAllowedActions []x.Atom - hasXEmbedInfo bool - hasWmTransientFor bool - wmClass *icccm.WMClass - wmName string - motifWmHints *MotifWmHints - - gtkAppId string - flatpakAppID string - wmRole string - - updateCalled bool - sync.Mutex -} - -func NewWindowInfo(win x.Window) *WindowInfo { - winInfo := &WindowInfo{} - winInfo.xid = win - winInfo.createdTime = time.Now().UnixNano() - return winInfo -} - -// window type -func (winInfo *WindowInfo) updateWmWindowType() { - var err error - winInfo.wmWindowType, err = ewmh.GetWMWindowType(globalXConn, winInfo.xid).Reply(globalXConn) - if err != nil { - logger.Debugf("failed to get WMWindowType for window %d: %v", winInfo.xid, err) - } -} - -// wm allowed actions -func (winInfo *WindowInfo) updateWmAllowedActions() { - var err error - winInfo.wmAllowedActions, err = ewmh.GetWMAllowedActions(globalXConn, - winInfo.xid).Reply(globalXConn) - if err != nil { - logger.Debugf("failed to get WMAllowedActions for window %d: %v", winInfo.xid, err) - } -} - -// wm state -func (winInfo *WindowInfo) updateWmState() { - var err error - winInfo.wmState, err = ewmh.GetWMState(globalXConn, winInfo.xid).Reply(globalXConn) - if err != nil { - logger.Debugf("failed to get WMState for window %d: %v", winInfo.xid, err) - } -} - -// wm class -func (winInfo *WindowInfo) updateWmClass() { - var err error - winInfo.wmClass, err = getWmClass(winInfo.xid) - if err != nil { - logger.Debugf("failed to get wmClass for window %d: %v", winInfo.xid, err) - } -} - -func (winInfo *WindowInfo) updateMotifWmHints() { - var err error - winInfo.motifWmHints, err = getMotifWmHints(globalXConn, winInfo.xid) - if err != nil { - logger.Debugf("failed to get Motif WM Hints for window %d: %v", - winInfo.xid, err) - } -} - -// wm name -func (winInfo *WindowInfo) updateWmName() { - winInfo.wmName = getWmName(winInfo.xid) - winInfo.Title = winInfo.getTitle() -} - -func (winInfo *WindowInfo) updateIcon() { - winInfo.Icon = getIconFromWindow(winInfo.xid) -} - -// XEmbed info -// 一般 tray icon 会带有 _XEMBED_INFO 属性 -func (winInfo *WindowInfo) updateHasXEmbedInfo() { - reply, err := x.GetProperty(globalXConn, false, winInfo.xid, atomXEmbedInfo, x.AtomAny, 0, 2).Reply(globalXConn) - if err != nil { - logger.Debug(err) - return - } - if reply.Format != 0 { - // has property - winInfo.hasXEmbedInfo = true - } -} - -// WM_TRANSIENT_FOR -func (winInfo *WindowInfo) updateHasWmTransientFor() { - _, err := icccm.GetWMTransientFor(globalXConn, winInfo.xid).Reply(globalXConn) - winInfo.hasWmTransientFor = err == nil -} - -func (winInfo *WindowInfo) isActionMinimizeAllowed() bool { - logger.Debugf("wmAllowedActions: %#v", winInfo.wmAllowedActions) - return atomsContains(winInfo.wmAllowedActions, atomNetWmActionMinimize) -} - -func (winInfo *WindowInfo) hasWmStateDemandsAttention() bool { - return atomsContains(winInfo.wmState, atomWmStateDemandsAttention) -} - -func (winInfo *WindowInfo) hasWmStateSkipTaskBar() bool { - return atomsContains(winInfo.wmState, atomNetWmStateSkipTaskbar) -} - -func (winInfo *WindowInfo) hasWmStateModal() bool { - return atomsContains(winInfo.wmState, atomNetWmStateModal) -} - -func (winInfo *WindowInfo) isValidModal() bool { - return winInfo.hasWmTransientFor && winInfo.hasWmStateModal() -} - -// 通过 wmClass 判断是否需要隐藏此窗口 -func (winInfo *WindowInfo) shouldSkipWithWMClass() bool { - wmClass := winInfo.wmClass - if wmClass == nil { - return false - } - if wmClass.Instance == "explorer.exe" && wmClass.Class == "Wine" { - return true - } else if wmClass.Class == "dde-launcher" || wmClass.Class == "dde-lock" || wmClass.Class == "dde-dock" { - return true - } else if wmClass.Class == "reset-password-dialog" || wmClass.Instance == "reset-password-dialog" { - return true - } else if wmClass.Instance == "onboard" && wmClass.Class == "Onboard" { - return true - } - - return false -} - -func (winInfo *WindowInfo) getDisplayName() (name string) { - name = winInfo.getDisplayName0() - nameTitle := strings.Title(name) - // NOTE: although name is valid, nameTitle is not necessarily valid. - if utf8.ValidString(nameTitle) { - name = nameTitle - } - return -} - -func (winInfo *WindowInfo) getDisplayName0() string { - win := winInfo.xid - role := winInfo.wmRole - if !utf8.ValidString(role) { - role = "" - } - - var class, instance string - if winInfo.wmClass != nil { - class = winInfo.wmClass.Class - if !utf8.ValidString(class) { - class = "" - } - - instance = filepath.Base(winInfo.wmClass.Instance) - if !utf8.ValidString(instance) { - instance = "" - } - } - logger.Debugf("getDisplayName class: %q, instance: %q", class, instance) - - if role != "" && class != "" { - return class + " " + role - } - - if class != "" { - return class - } - - if instance != "" { - return instance - } - - wmName := winInfo.wmName - if wmName != "" { - var shortWmName string - lastIndex := strings.LastIndex(wmName, "-") - if lastIndex > 0 { - shortWmName = wmName[lastIndex:] - if shortWmName != "" && utf8.ValidString(shortWmName) { - return shortWmName - } - } - } - - if winInfo.process != nil { - exeBasename := filepath.Base(winInfo.process.exe) - if utf8.ValidString(exeBasename) { - return exeBasename - } - } - - return fmt.Sprintf("window: %v", win) -} - -func (winInfo *WindowInfo) getTitle() string { - wmName := winInfo.wmName - if wmName == "" || !utf8.ValidString(wmName) { - return winInfo.getDisplayName() - } - return wmName -} - -func (winInfo *WindowInfo) getIcon() string { - if winInfo.Icon == "" { - logger.Debug("get icon from window", winInfo.xid) - winInfo.Icon = getIconFromWindow(winInfo.xid) - } - return winInfo.Icon -} - -var skipTaskBarWindowTypes = []string{ - "_NET_WM_WINDOW_TYPE_UTILITY", - "_NET_WM_WINDOW_TYPE_COMBO", - "_NET_WM_WINDOW_TYPE_DESKTOP", - "_NET_WM_WINDOW_TYPE_DND", - "_NET_WM_WINDOW_TYPE_DOCK", - "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU", - "_NET_WM_WINDOW_TYPE_MENU", - "_NET_WM_WINDOW_TYPE_NOTIFICATION", - "_NET_WM_WINDOW_TYPE_POPUP_MENU", - "_NET_WM_WINDOW_TYPE_SPLASH", - "_NET_WM_WINDOW_TYPE_TOOLBAR", - "_NET_WM_WINDOW_TYPE_TOOLTIP", -} - -func (winInfo *WindowInfo) shouldSkip() bool { - logger.Debugf("win %d shouldSkip?", winInfo.xid) - if !winInfo.updateCalled { - winInfo.update() - winInfo.updateCalled = true - } - - logger.Debugf("hasXEmbedInfo: %v", winInfo.hasXEmbedInfo) - logger.Debugf("wmWindowType: %#v", winInfo.wmWindowType) - logger.Debugf("wmState: %#v", winInfo.wmState) - logger.Debugf("wmClass: %#v", winInfo.wmClass) - - if winInfo.hasWmStateSkipTaskBar() || winInfo.isValidModal() || - winInfo.hasXEmbedInfo || winInfo.shouldSkipWithWMClass() { - return true - } - - for _, winType := range winInfo.wmWindowType { - winTypeStr, _ := getAtomName(winType) - if winType == atomNetWmWindowTypeDialog && - !winInfo.isActionMinimizeAllowed() { - return true - } else if strSliceContains(skipTaskBarWindowTypes, winTypeStr) { - return true - } - } - return false -} - -func (winInfo *WindowInfo) updateProcessInfo() { - win := winInfo.xid - winInfo.pid = getWmPid(win) - var err error - winInfo.process, err = NewProcessInfo(winInfo.pid) - if err != nil { - logger.Warning(err) - // Try WM_COMMAND - wmCommand, err := getWmCommand(win) - if err == nil { - winInfo.process = NewProcessInfoWithCmdline(wmCommand) - } else { - return - } - } - logger.Debugf("process: %#v", winInfo.process) -} - -func (winInfo *WindowInfo) update() { - win := winInfo.xid - logger.Debugf("update window %v info", win) - winInfo.updateWmClass() - winInfo.updateMotifWmHints() - winInfo.updateWmState() - winInfo.updateWmWindowType() - winInfo.updateWmAllowedActions() - if len(winInfo.wmWindowType) == 0 { - winInfo.updateHasXEmbedInfo() - } - winInfo.updateHasWmTransientFor() - winInfo.updateProcessInfo() - winInfo.wmRole = getWmWindowRole(win) - winInfo.gtkAppId = getWindowGtkApplicationId(win) - winInfo.flatpakAppID = getWindowFlatpakAppID(win) - winInfo.updateWmName() - winInfo.innerId = genInnerId(winInfo) -} - -func filterFilePath(args []string) string { - var filtered []string - for _, arg := range args { - if strings.Contains(arg, "/") || arg == "." || arg == ".." { - filtered = append(filtered, "%F") - } else { - filtered = append(filtered, arg) - } - } - return strings.Join(filtered, " ") -} - -func genInnerId(winInfo *WindowInfo) string { - win := winInfo.xid - var wmClass string - var wmInstance string - if winInfo.wmClass != nil { - wmClass = winInfo.wmClass.Class - wmInstance = filepath.Base(winInfo.wmClass.Instance) - } - var exe string - var args string - if winInfo.process != nil { - exe = winInfo.process.exe - args = filterFilePath(winInfo.process.args) - } - hasPid := winInfo.pid != 0 - - var str string - // NOTE: 不要使用 wmRole,有些程序总会改变这个值比如 GVim - if wmInstance == "" && wmClass == "" && exe == "" && winInfo.gtkAppId == "" { - if winInfo.wmName != "" { - str = fmt.Sprintf("wmName:%q", winInfo.wmName) - } else { - str = fmt.Sprintf("windowId:%v", winInfo.xid) - } - } else { - str = fmt.Sprintf("wmInstance:%q,wmClass:%q,exe:%q,args:%q,hasPid:%v,gtkAppId:%q", - wmInstance, wmClass, exe, args, hasPid, winInfo.gtkAppId) - } - // #nosec G401 - md5hash := md5.New() - _, err := md5hash.Write([]byte(str)) - if err != nil { - logger.Warning("Write error:", err) - } - innerId := windowHashPrefix + hex.EncodeToString(md5hash.Sum(nil)) - logger.Debugf("genInnerId win: %v str: %s, innerId: %s", win, str, innerId) - return innerId -} - -func (winInfo *WindowInfo) isDemandingAttention() bool { - return winInfo.hasWmStateDemandsAttention() -} - -func (winInfo *WindowInfo) isMinimized() bool { - return atomsContains(winInfo.wmState, atomNetWmStateHidden) -} - -func (winInfo *WindowInfo) activate() error { - return activateWindow(winInfo.xid) -} - -func (winInfo *WindowInfo) minimize() error { - return minimizeWindow(winInfo.xid) -} - -func (winInfo *WindowInfo) maximize() error { - return maximizeWindow(winInfo.xid) -} - -func (winInfo *WindowInfo) makeWindowAbove() error { - return makeWindowAbove(winInfo.xid) -} - -func (winInfo *WindowInfo) close(timestamp uint32) error { - return closeWindow(winInfo.xid, x.Timestamp(timestamp)) -} - -func (winInfo *WindowInfo) killClient() error { - return killClient(winInfo.xid) -} - -func (winInfo *WindowInfo) changeXid(xid x.Window) bool { - logger.Warning("XWindowInfo should not change xid!") - return false -} - -func (winInfo *WindowInfo) print() { - wmClassStr := "-" - if winInfo.wmClass != nil { - wmClassStr = fmt.Sprintf("%q %q", winInfo.wmClass.Class, winInfo.wmClass.Instance) - } - logger.Infof("id: %d, wmClass: %s, wmState: %v,"+ - " wmWindowType: %v, wmAllowedActions: %v, hasXEmbedInfo: %v, hasWmTransientFor: %v", - winInfo.xid, wmClassStr, - winInfo.wmState, winInfo.wmWindowType, winInfo.wmAllowedActions, winInfo.hasXEmbedInfo, - winInfo.hasWmTransientFor) -} - -func (winInfo *WindowInfo) allowClose() bool { - if winInfo.motifWmHints != nil { - if winInfo.motifWmHints.allowedClose() { - return true - } - } - - for _, action := range winInfo.wmAllowedActions { - if action == atomNetWmActionClose { - return true - } - } - return false -} diff --git a/dock/window_infos.go b/dock/window_infos.go deleted file mode 100644 index dc6172426..000000000 --- a/dock/window_infos.go +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - x "github.com/linuxdeepin/go-x11-client" -) - -type ExportWindowInfo struct { - Title string - Flash bool -} - -type windowInfosType map[x.Window]ExportWindowInfo - -func newWindowInfos() windowInfosType { - return make(windowInfosType) -} - -func (a windowInfosType) Equal(b windowInfosType) bool { - if len(a) != len(b) { - return false - } - for keyA, valA := range a { - valB, okB := b[keyA] - if okB { - if valA != valB { - return false - } - } else { - return false - } - } - return true -} diff --git a/dock/window_infos_test.go b/dock/window_infos_test.go deleted file mode 100644 index 9c1fb6e56..000000000 --- a/dock/window_infos_test.go +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_windowInfosTypeEqual(t *testing.T) { - wa := windowInfosType{ - 0: {"a", false}, - 1: {"b", false}, - 2: {"c", true}, - } - wb := windowInfosType{ - 2: {"c", true}, - 1: {"b", false}, - 0: {"a", false}, - } - assert.True(t, wa.Equal(wb)) - - wc := windowInfosType{ - 1: {"b", false}, - 2: {"c", false}, - } - assert.False(t, wc.Equal(wa)) - - wd := windowInfosType{ - 0: {"aa", false}, - 1: {"b", false}, - 2: {"c", false}, - } - assert.False(t, wd.Equal(wa)) - - we := windowInfosType{ - 0: {"a", false}, - 1: {"b", false}, - 3: {"c", false}, - } - assert.False(t, we.Equal(wa)) - - wf := windowInfosType{ - 0: {"a", false}, - 1: {"b", false}, - 2: {"c", false}, - } - assert.False(t, wf.Equal(wa)) -} diff --git a/dock/window_slice.go b/dock/window_slice.go deleted file mode 100644 index eb43fa3f4..000000000 --- a/dock/window_slice.go +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - x "github.com/linuxdeepin/go-x11-client" -) - -type windowSlice []x.Window - -func (a windowSlice) Len() int { return len(a) } -func (a windowSlice) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a windowSlice) Less(i, j int) bool { return uint32(a[i]) < uint32(a[j]) } - -func (winSlice windowSlice) Contains(win x.Window) bool { - for _, window := range winSlice { - if window == win { - return true - } - } - return false -} - -// from a to b -// return [add, remove] -func diffSortedWindowSlice(a, b windowSlice) (add, remove windowSlice) { - ia := 0 - ib := 0 - lenA := len(a) - lenB := len(b) - - for ia < lenA && ib < lenB { - va := uint32(a[ia]) - vb := uint32(b[ib]) - if va == vb { - ia++ - ib++ - } else if va < vb { - // remove - remove = append(remove, a[ia]) - ia++ - } else { - // va > vb - // add - add = append(add, b[ib]) - ib++ - } - } - - for ia < lenA { - remove = append(remove, a[ia]) - ia++ - } - - for ib < lenB { - add = append(add, b[ib]) - ib++ - } - return -} diff --git a/dock/window_slice_test.go b/dock/window_slice_test.go deleted file mode 100644 index c636665e9..000000000 --- a/dock/window_slice_test.go +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_diffSortedWindowSlice(t *testing.T) { - a := windowSlice{1, 2, 3, 4} - b := windowSlice{1, 3, 5, 6, 7} - add, remove := diffSortedWindowSlice(a, b) - - assert.Equal(t, len(add), 3) - assert.Equal(t, int(add[0]), 5) - assert.Equal(t, int(add[1]), 6) - assert.Equal(t, int(add[2]), 7) - - assert.Equal(t, len(remove), 2) - assert.Equal(t, int(remove[0]), 2) - assert.Equal(t, int(remove[1]), 4) -} diff --git a/dock/wl_manager.go b/dock/wl_manager.go deleted file mode 100644 index 7b8dbfe94..000000000 --- a/dock/wl_manager.go +++ /dev/null @@ -1,281 +0,0 @@ -// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "os" - "strconv" - "sync" - - dbus "github.com/godbus/dbus" - kwayland "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.kwayland" - x "github.com/linuxdeepin/go-x11-client" -) - -type WaylandManager struct { - mu sync.Mutex - windows map[dbus.ObjectPath]*KWindowInfo -} - -func (wm *WaylandManager) handleActiveWindowChangedK(activeWin uint32) WindowInfoImp { - wm.mu.Lock() - defer wm.mu.Unlock() - - logger.Debug("WaylandManager.handleActiveWindowChangedK", activeWin) - - for _, winInfo := range wm.windows { - if winInfo.internalId == activeWin { - return winInfo - } - } - return nil -} - -func newWaylandManager() *WaylandManager { - m := &WaylandManager{ - windows: make(map[dbus.ObjectPath]*KWindowInfo), - } - return m -} - -func (m *Manager) listenWaylandWMSignals() { - m.waylandWM.InitSignalExt(m.sessionSigLoop, true) - - _, err := m.waylandWM.ConnectActiveWindowChanged(func() { - activeWinInternalId, err := m.waylandWM.ActiveWindow(0) - if err != nil { - logger.Warning(err) - return - } - activeWinInfo := m.waylandManager.handleActiveWindowChangedK(activeWinInternalId) - if activeWinInfo != nil { - m.handleActiveWindowChanged(activeWinInfo) - } else { - m.updateHideState(false) - } - }) - if err != nil { - logger.Warning(err) - } - - _, err = m.waylandWM.ConnectWindowCreated(func(objPathStr string) { - objPath := dbus.ObjectPath(objPathStr) - logger.Debug("window created", objPath) - m.registerWindowWayland(objPath) - }) - if err != nil { - logger.Warning(err) - } - - _, err = m.waylandWM.ConnectWindowRemove(func(objPathStr string) { - objPath := dbus.ObjectPath(objPathStr) - logger.Debug("window removed", objPath) - m.unregisterWindowWayland(objPath) - }) - if err != nil { - logger.Warning(err) - } -} - -func (m *Manager) listenKWindowSignals(winInfo *KWindowInfo) { - winInfo.winObj.InitSignalExt(m.sessionSigLoop, true) - var err error - - // Title changed - _, err = winInfo.winObj.ConnectTitleChanged(func() { - winInfo.updateTitle() - entry := m.Entries.getByWindowId(winInfo.xid) - if entry == nil { - return - } - if entry.current == winInfo { - entry.updateName() - } - entry.updateWindowInfos() - }) - if err != nil { - logger.Warning(err) - } - - // Icon changed - _, err = winInfo.winObj.ConnectIconChanged(func() { - winInfo.updateIcon() - entry := m.Entries.getByWindowId(winInfo.xid) - if entry == nil { - return - } - entry.updateIcon() - }) - - // DemandingAttention changed - _, err = winInfo.winObj.ConnectDemandsAttentionChanged(func() { - winInfo.updateDemandingAttention() - entry := m.Entries.getByWindowId(winInfo.xid) - if entry == nil { - return - } - entry.updateWindowInfos() - }) - - // Geometry changed - _, err = winInfo.winObj.ConnectGeometryChanged(func() { - changed := winInfo.updateGeometry() - if !changed { - return - } - m.handleWindowGeometryChanged(winInfo) - }) -} - -func (m *Manager) handleWindowGeometryChanged(winInfo WindowInfoImp) { - if HideModeType(m.HideMode.Get()) != HideModeSmartHide { - return - } - - m.updateHideState(false) -} - -func (m *Manager) unregisterWindowWayland(objPath dbus.ObjectPath) { - logger.Debug("unregister window", objPath) - - m.waylandManager.mu.Lock() - winInfo, ok := m.waylandManager.windows[objPath] - m.waylandManager.mu.Unlock() - if !ok { - return - } - - winInfo.winObj.RemoveAllHandlers() - m.detachWindow(winInfo) - - err := globalXConn.FreeID(uint32(winInfo.xid)) - if err != nil { - logger.Warning(err) - } - - m.waylandManager.mu.Lock() - delete(m.waylandManager.windows, objPath) - m.waylandManager.mu.Unlock() - - // TODO 发现windowInfoMap中的内容没有被清除过 - // m.windowInfoMapMutex.Lock() - // delete(m.windowInfoMap, winInfo.getXid()) - // m.windowInfoMapMutex.Unlock() -} - -var globalRestrictWaylandWindow = true - -func init() { - if os.Getenv("DEEPIN_DOCK_RESTRICT_WAYLAND_WINDOW") == "0" { - globalRestrictWaylandWindow = false - } -} - -// TODO: remove it -func (m *Manager) DebugRegisterWW(id uint32) *dbus.Error { - objPath := dbus.ObjectPath("/com/deepin/daemon/KWayland/PlasmaWindow_" + strconv.Itoa(int(id))) - m.registerWindowWayland(objPath) - return nil -} - -// TODO: remove it -func (m *Manager) DebugSetActiveWindow(id uint32) *dbus.Error { - activeWinInfo := m.waylandManager.handleActiveWindowChangedK(id) - if activeWinInfo != nil { - m.handleActiveWindowChanged(activeWinInfo) - } - return nil -} - -func (m *Manager) registerWindowWayland(objPath dbus.ObjectPath) { - logger.Debug("register window", objPath) - - m.waylandManager.mu.Lock() - _, ok := m.waylandManager.windows[objPath] - m.waylandManager.mu.Unlock() - if ok { - return - } - - sessionBus := m.sessionSigLoop.Conn() - winObj, err := kwayland.NewWindow(sessionBus, objPath) - if err != nil { - logger.Warning(err) - return - } - appId, err := winObj.AppId(0) - if err != nil { - logger.Warning(err) - return - } - if appId == "dde-dock" || appId == "dde-launcher" || appId == "dde-clipboard" || - appId == "dde-osd" || appId == "dde-polkit-agent" || appId == "dde-simple-egl" || appId == "dmcs" { - return - } - - xid, err := globalXConn.AllocID() - if err != nil { - logger.Warning(err) - return - } - - realWid, err := winObj.WindowId(0) - if err != nil { - logger.Warning(err) - realWid = 0 - } - if realWid != 0 { - xid = realWid - } - - winInfo := newKWindowInfo(winObj, xid) - m.listenKWindowSignals(winInfo) - - m.waylandManager.mu.Lock() - m.waylandManager.windows[objPath] = winInfo - m.waylandManager.mu.Unlock() - - m.attachOrDetachWindow(winInfo) - - if realWid != 0 { - m.windowInfoMapMutex.Lock() - m.windowInfoMap[x.Window(realWid)] = winInfo - m.windowInfoMapMutex.Unlock() - } -} - -func (m *Manager) registerKWaylandInfo(winInfo WindowInfoImp) { - switch winInfo.(type) { - case *KWindowInfo: - break - default: - logger.Warningf("registerKWaylandInfo, not wayland, wid=%d", winInfo.getXid()) - return - } - - m.windowInfoMapMutex.RLock() - defer m.windowInfoMapMutex.RUnlock() - - winInfo, ok := m.windowInfoMap[winInfo.getXid()] - if ok { - logger.Warningf("registerKWaylandInfo, already registered, wid=%d", winInfo.getXid()) - return - } - m.windowInfoMap[winInfo.getXid()] = winInfo -} - -func (m *Manager) initWaylandWindows() { - windowPaths, err := m.waylandWM.Windows(0) - if err != nil { - logger.Warning(err) - } - for _, objPath := range windowPaths { - objPathStr, ok := objPath.Value().(string) - if !ok { - continue - } - m.registerWindowWayland(dbus.ObjectPath(objPathStr)) - } -} diff --git a/dock/xutils.go b/dock/xutils.go deleted file mode 100644 index 0b58e09dc..000000000 --- a/dock/xutils.go +++ /dev/null @@ -1,661 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package dock - -import ( - "bytes" - "encoding/base64" - "errors" - "image" - "image/png" - "math" - "strings" - "time" - - "github.com/nfnt/resize" - - x "github.com/linuxdeepin/go-x11-client" - "github.com/linuxdeepin/go-x11-client/util/wm/ewmh" - "github.com/linuxdeepin/go-x11-client/util/wm/icccm" -) - -func atomsContains(slice []x.Atom, atom x.Atom) bool { - for _, a := range slice { - if a == atom { - return true - } - } - return false -} - -func getWmClass(win x.Window) (*icccm.WMClass, error) { - wmClass, err := icccm.GetWMClass(globalXConn, win).Reply(globalXConn) - if err != nil { - return nil, err - } - return &wmClass, nil -} - -func getAtomName(atom x.Atom) (string, error) { - return globalXConn.GetAtomName(atom) -} - -func getAtom(name string) (x.Atom, error) { - return globalXConn.GetAtom(name) -} - -func maximizeWindow(win x.Window) error { - return ewmh.RequestChangeWMState(globalXConn, win, ewmh.WMStateAdd, atomNetWmStateMaximizedVert, atomNetWmStateMaximizedHorz, 2).Check(globalXConn) -} - -func minimizeWindow(win x.Window) error { - logger.Debug("minimizeWindow", win) - return icccm.RequestChangeWMState(globalXConn, win, icccm.StateIconic).Check(globalXConn) -} - -func makeWindowAbove(win x.Window) error { - return ewmh.RequestChangeWMState(globalXConn, win, ewmh.WMStateAdd, atomNetWmStateAbove, - 0, 2).Check(globalXConn) -} - -func moveWindow(win x.Window) error { - // TODO: - //return ewmh.WmMoveresize(xu, win, ewmh.MoveKeyboard) - //ewmh.RequestWMMoveResize(win, ) - return nil -} - -func closeWindow(win x.Window, ts x.Timestamp) error { - return ewmh.RequestCloseWindow(globalXConn, win, ts, 2).Check(globalXConn) -} - -type windowFrameExtents struct { - Left, Right, Top, Bottom uint -} - -func getWindowFrameExtents(xConn *x.Conn, win x.Window) (*windowFrameExtents, error) { - reply, err := x.GetProperty(xConn, false, win, atomNetFrameExtents, x.AtomCardinal, - 0, 4).Reply(xConn) - if err != nil || reply.Format == 0 { - // try _GTK_FRAME_EXTENTS - reply, err = x.GetProperty(xConn, false, win, atomGtkFrameExtents, x.AtomCardinal, - 0, 4).Reply(xConn) - if err != nil { - return nil, err - } - } - - return getFrameExtentsFromReply(reply) -} - -func getCardinalsFromReply(r *x.GetPropertyReply) ([]uint32, error) { - if r.Format != 32 { - return nil, errors.New("bad reply") - } - count := len(r.Value) / 4 - ret := make([]uint32, count) - rdr := x.NewReaderFromData(r.Value) - for i := 0; i < count; i++ { - ret[i] = uint32(rdr.Read4b()) - } - return ret, nil -} - -func getFrameExtentsFromReply(reply *x.GetPropertyReply) (*windowFrameExtents, error) { - list, err := getCardinalsFromReply(reply) - if err != nil { - return nil, err - } - - if len(list) != 4 { - return nil, errors.New("length of list is not 4") - } - return &windowFrameExtents{ - Left: uint(list[0]), - Right: uint(list[1]), - Top: uint(list[2]), - Bottom: uint(list[3]), - }, nil -} - -func getMotifWmHints(xConn *x.Conn, win x.Window) (*MotifWmHints, error) { - reply, err := x.GetProperty(xConn, false, win, atomMotifWmHints, - atomMotifWmHints, 0, 5).Reply(xConn) - if err != nil { - return nil, err - } - return getMotifWmHintsFromReply(reply) -} - -func getMotifWmHintsFromReply(reply *x.GetPropertyReply) (*MotifWmHints, error) { - list, err := getCardinalsFromReply(reply) - if err != nil { - return nil, err - } - if len(list) != 5 { - return nil, errors.New("length of list is not 5") - } - return &MotifWmHints{ - Flags: list[0], - Functions: list[1], - Decorations: list[2], - InputMode: int32(list[3]), - Status: list[4], - }, nil -} - -type MotifWmHints struct { - Flags uint32 - Functions uint32 - Decorations uint32 - InputMode int32 - Status uint32 -} - -const ( - MotifHintFunctions = 1 << iota - MotifHintDecorations - MotifHintInputMode - MotifHintStatus -) - -const ( - MotifFunctionAll = 1 << iota - MotifFunctionResize - MotifFunctionMove - MotifFunctionMinimize - MotifFunctionMaximize - MotifFunctionClose - MotifFunctionNone = 0 -) - -func (h *MotifWmHints) allowedClose() bool { - // 允许关闭的条件: - // 1. 不设置 Functions 字段,即 h.Flags 没有设置 MotifHintFunctions 标志位; - // 2. 或者设置了 Functions 字段并且 h.Functions 设置了 MotifFunctionAll 标志位; - // 3. 或者设置了 Functions 字段并且 h.Functions 设置了 MotifFunctionClose 标志位。 - // 相关定义在 motif-2.3.8/lib/Xm/MwmUtil.h 。 - return h.Flags&MotifHintFunctions == 0 || - h.Functions&MotifFunctionAll != 0 || - h.Functions&MotifFunctionClose != 0 -} - -func getWindowGeometry(xConn *x.Conn, win x.Window) (*Rect, error) { - rect, err := getGeometry(xConn, win) - if err != nil { - return nil, err - } - - root := xConn.GetDefaultScreen().Root - coord, err := x.TranslateCoordinates(xConn, win, root, 0, 0).Reply(xConn) - if err != nil { - return nil, err - } - rect.X = int32(coord.DstX) - rect.Y = int32(coord.DstY) - - dWin, err := getDecorativeWindow(xConn, win) - if err != nil { - return nil, err - } - - dRect, err := getGeometry(xConn, dWin) - if err != nil { - return nil, err - } - - if rect.X == dRect.X && rect.Y == dRect.Y { - // 无标题栏的窗口,比如 deepin-editor, dconf-editor - frameExtents, _ := getWindowFrameExtents(xConn, win) - if frameExtents != nil { - X := rect.X + int32(frameExtents.Left) - y := rect.Y + int32(frameExtents.Top) - w := rect.Width - uint32(frameExtents.Left+frameExtents.Right) - h := rect.Height - uint32(frameExtents.Top+frameExtents.Bottom) - return &Rect{X, y, w, h}, nil - } - return rect, nil - } - // else 普通的有标题栏的窗口,比如 xev, 返回装饰窗口的位置和大小。 - return dRect, nil -} - -func getDecorativeWindow(conn *x.Conn, win x.Window) (x.Window, error) { - count := 0 - for { - count++ - reply, err := x.QueryTree(conn, win).Reply(conn) - if err != nil { - return 0, err - } - - if reply.Root == reply.Parent { - return win, nil - } - if count > 10 { - return 0, errors.New("getDecorateWindow: exceeded the loop iteration limit") - } - win = reply.Parent - } -} - -func getGeometry(xConn *x.Conn, win x.Window) (*Rect, error) { - geo, err := x.GetGeometry(xConn, x.Drawable(win)).Reply(xConn) - if err != nil { - return nil, err - } - return &Rect{ - X: int32(geo.X), - Y: int32(geo.Y), - Width: uint32(geo.Width), - Height: uint32(geo.Height), - }, nil -} - -func getWmName(win x.Window) string { - // get _NET_WM_NAME - name, err := ewmh.GetWMName(globalXConn, win).Reply(globalXConn) - if err != nil || name == "" { - // get WM_NAME - nameTp, _ := icccm.GetWMName(globalXConn, win).Reply(globalXConn) - name, _ = nameTp.GetStr() - } - - return strings.Replace(name, "\x00", "", -1) -} - -func getWmPid(win x.Window) uint { - pid, _ := ewmh.GetWMPid(globalXConn, win).Reply(globalXConn) - return uint(pid) -} - -// WM_CLIENT_LEADER -func getWmClientLeader(win x.Window) (x.Window, error) { - reply, err := x.GetProperty(globalXConn, false, win, atomWmClientLeader, atomUTF8String, - 0, 1).Reply(globalXConn) - if err != nil { - return 0, err - } - leader, err := getWindowFromReply(reply) - if err != nil { - return 0, err - } - return leader, nil -} - -// WM_TRANSIENT_FOR -func getWmTransientFor(win x.Window) (x.Window, error) { - return icccm.GetWMTransientFor(globalXConn, win).Reply(globalXConn) -} - -// _NET_WM_WINDOW_OPACITY -func getWmWindowOpacity(win x.Window) (uint, error) { - reply, err := x.GetProperty(globalXConn, false, win, atomNetWmWindowOpacity, atomUTF8String, - 0, 1).Reply(globalXConn) - if err != nil { - return 0, err - } - - opacity, err := getCardinalFromReply(reply) - if err != nil { - return 0, err - } - - return uint(opacity), nil -} - -func getWmCommand(win x.Window) ([]string, error) { - reply, err := x.GetProperty(globalXConn, false, win, atomWmCommand, atomUTF8String, - 0, lengthMax).Reply(globalXConn) - if err != nil { - return nil, err - } - return getUTF8StrsFromReply(reply) -} - -func getWindowGtkApplicationId(win x.Window) string { - gtkAppId, _ := getWindowPropertyString(win, atomGtkApplicationId) - return gtkAppId -} - -func getWindowFlatpakAppID(win x.Window) string { - id, _ := getWindowPropertyString(win, atomFlatpakAppId) - return id -} - -func getAndroidUengineId(win x.Window) int32 { - atom := atomAndroidUengineId - - reply, err := x.GetProperty(globalXConn, false, win, - atom, atomInteger, 0, lengthMax).Reply(globalXConn) - - if err != nil || reply.ValueLen == 0 { - return -1 - } - - return int32(x.Get32(reply.Value)) -} - -func getAndroidUengineName(win x.Window) string { - reply, err := x.GetProperty(globalXConn, false, win, - atomAndroidUengineName, atomString, 0, lengthMax).Reply(globalXConn) - if err != nil { - return "" - } - - name := string(reply.Value) - return name -} - -func getDSGVirtualAppDesktop(win x.Window) string { - reply, err := x.GetProperty(globalXConn, false, win, - atomDSGVirtualAppDesktop, atomString, 0, lengthMax).Reply(globalXConn) - if err != nil { - return "" - } - - name := string(reply.Value) - return name -} - -const lengthMax = 0xffff - -func getWmWindowRole(win x.Window) string { - role, _ := getWindowPropertyString(win, atomWmWindowRole) - return role -} - -func getWindowPropertyString(win x.Window, atom x.Atom) (string, error) { - reply, err := x.GetProperty(globalXConn, false, win, atom, atomUTF8String, - 0, lengthMax).Reply(globalXConn) - if err != nil { - return "", err - } - return getUTF8StrFromReply(reply) -} - -func getCardinalFromReply(r *x.GetPropertyReply) (uint32, error) { - if r.Format != 32 || len(r.Value) != 4 { - return 0, errors.New("bad reply") - } - return uint32(x.Get32(r.Value)), nil -} - -func getWindowFromReply(r *x.GetPropertyReply) (x.Window, error) { - if r.Format != 32 || len(r.Value) != 4 { - return 0, errors.New("bad reply") - } - return x.Window(x.Get32(r.Value)), nil -} - -func getUTF8StrFromReply(reply *x.GetPropertyReply) (string, error) { - if reply.Format != 8 { - return "", errors.New("bad reply") - } - - return string(reply.Value), nil -} - -func getUTF8StrsFromReply(reply *x.GetPropertyReply) ([]string, error) { - if reply.Format != 8 { - return nil, errors.New("bad reply") - } - - data := reply.Value - var strs []string - sstart := 0 - for i, c := range data { - if c == 0 { - strs = append(strs, string(data[sstart:i])) - sstart = i + 1 - } - } - if sstart < len(data) { - strs = append(strs, string(data[sstart:])) - } - return strs, nil -} - -const bestIconSize = 48 - -func getIconFromWindow(win x.Window) string { - img, err := findIconEwmh(win) - if err != nil { - logger.Warning(err) - // try icccm - img, err = findIconIcccm(win) - if err != nil { - logger.Warning(err) - // get icon failed - return "" - } - } - - img = resize.Thumbnail(bestIconSize, bestIconSize, img, resize.NearestNeighbor) - - // encode image to png, then to base64 string - var buf bytes.Buffer - if err := png.Encode(&buf, img); err != nil { - logger.Warning(err) - return "" - } - return "data:image/png;base64," + base64.StdEncoding.EncodeToString(buf.Bytes()) -} - -func findIconEwmh(win x.Window) (image.Image, error) { - icon, err := getBestEwmhIcon(win) - if err != nil { - return nil, err - } - return NewNRGBAImageFromEwmhIcon(icon), nil -} - -// findIconIcccm helps FindIcon by trying to return an icccm-style icon. -func findIconIcccm(wid x.Window) (image.Image, error) { - // TODO - return nil, errors.New("todo") - //hints, err := icccm.WmHintsGet(xu, wid) - //if err != nil { - // return nil, err - //} - // - //// Only continue if the WM_HINTS flags say an icon is specified and - //// if at least one of icon pixmap or icon mask is non-zero. - //if hints.Flags&icccm.HintIconPixmap == 0 || - // (hints.IconPixmap == 0 && hints.IconMask == 0) { - // - // return nil, errors.New("No icon found in WM_HINTS.") - //} - // - //return xgraphics.NewIcccmIcon(xu, hints.IconPixmap, hints.IconMask) -} - -func getBestEwmhIcon(win x.Window) (*ewmh.WMIcon, error) { - icons, err := ewmh.GetWMIcon(globalXConn, win).Reply(globalXConn) - if err != nil { - return nil, err - } - - best := findBestEwmhIcon(bestIconSize, bestIconSize, icons) - if best == nil { - return nil, errors.New("ewmh icon not found") - } - return best, nil -} - -// findBestEwmhIcon takes width/height dimensions and a slice of *ewmh.WmIcon -// and finds the best matching icon of the bunch. We always prefer bigger. -// If no icons are bigger than the preferred dimensions, use the biggest -// available. Otherwise, use the smallest icon that is greater than or equal -// to the preferred dimensions. The preferred dimensions is essentially -// what you'll likely scale the resulting icon to. -// If width and height are 0, then the largest icon found will be returned. -func findBestEwmhIcon(width, height int, icons []ewmh.WMIcon) *ewmh.WMIcon { - // nada nada limonada - if len(icons) == 0 { - return nil - } - - parea := width * height // preferred size - best := -1 - - // If zero area, set it to the largest possible. - if parea == 0 { - parea = math.MaxInt32 - } - - var bestArea, iconArea int - - for i, icon := range icons { - // the first valid icon we've seen; use it! - if best == -1 { - best = i - continue - } - - // load areas for comparison - bestArea = int(icons[best].Width * icons[best].Height) - iconArea = int(icon.Width * icon.Height) - - // We don't always want to accept bigger icons if our best is - // already bigger. But we always want something bigger if our best - // is insufficient. - if (iconArea >= parea && iconArea <= bestArea) || - (bestArea < parea && iconArea > bestArea) { - best = i - } - } - - if best > -1 { - return &icons[best] - } - return nil -} - -func NewNRGBAImageFromEwmhIcon(icon *ewmh.WMIcon) *image.NRGBA { - img := image.NewNRGBA(image.Rect(0, 0, int(icon.Width), int(icon.Height))) - // icon.Data []uint8 BGRA - // img.Pix []uint8 RGBA - - for i := 0; i < len(icon.Data); i += 4 { - b := icon.Data[i] - g := icon.Data[i+1] - r := icon.Data[i+2] - a := icon.Data[i+3] - - img.Pix[i] = r - img.Pix[i+1] = g - img.Pix[i+2] = b - img.Pix[i+3] = a - } - return img -} - -func getWindowUserTime(win x.Window) (uint, error) { - timestamp, err := ewmh.GetWMUserTime(globalXConn, win).Reply(globalXConn) - if err != nil { - userTimeWindow, err := ewmh.GetWMUserTimeWindow(globalXConn, win).Reply(globalXConn) - if err != nil { - return 0, err - } - - timestamp, err = ewmh.GetWMUserTime(globalXConn, userTimeWindow).Reply(globalXConn) - if err != nil { - return 0, err - } - } - return uint(timestamp), nil -} - -func changeCurrentWorkspaceToWindowWorkspace(win x.Window) error { - winWorkspace, err := ewmh.GetWMDesktop(globalXConn, win).Reply(globalXConn) - if err != nil { - return err - } - - currentWorkspace, err := ewmh.GetCurrentDesktop(globalXConn).Reply(globalXConn) - if err != nil { - return err - } - - if currentWorkspace == winWorkspace { - logger.Debugf("No need to change workspace, the current desktop is already %v", currentWorkspace) - return nil - } - logger.Debug("Change workspace") - - winUserTime, err := getWindowUserTime(win) - logger.Debug("window user time:", winUserTime) - if err != nil { - // only warning not return - logger.Warning("getWindowUserTime failed:", err) - } - _ = ewmh.RequestChangeCurrentDesktop(globalXConn, winWorkspace, - x.Timestamp(winUserTime)).Check(globalXConn) - - return nil -} - -func activateWindow(win x.Window) error { - logger.Debug("activateWindow", win) - err := changeCurrentWorkspaceToWindowWorkspace(win) - if err != nil { - return err - } - err = ewmh.RequestChangeActiveWindow(globalXConn, win, - 2, 0, 0).Check(globalXConn) - if err != nil { - return err - } - - time.AfterFunc(50*time.Millisecond, func() { - err := ewmh.RequestRestackWindow(globalXConn, win, 0, - x.StackModeAbove).Check(globalXConn) - if err != nil { - logger.Warning(err) - } - }) - - return nil -} - -func isHiddenPre(win x.Window) bool { - state, _ := ewmh.GetWMState(globalXConn, win).Reply(globalXConn) - return atomsContains(state, atomNetWmStateHidden) -} - -// works for new deepin wm. -func isWindowOnCurrentWorkspace(win x.Window) (bool, error) { - winWorkspace, err := ewmh.GetWMDesktop(globalXConn, win).Reply(globalXConn) - if err != nil { - return false, err - } - - currentWorkspace, err := ewmh.GetCurrentDesktop(globalXConn).Reply(globalXConn) - if err != nil { - return false, err - } - - return winWorkspace == currentWorkspace, nil -} - -func onCurrentWorkspacePre(win x.Window) bool { - isOnCurrentWorkspace, err := isWindowOnCurrentWorkspace(win) - if err != nil { - logger.Warning(err) - // 也许是窗口跳过窗口管理器了,如 dde-control-center - return true - } - return isOnCurrentWorkspace -} - -func isGoodWindow(win x.Window) bool { - _, err := x.GetGeometry(globalXConn, x.Drawable(win)).Reply(globalXConn) - return err == nil -} - -func killClient(win x.Window) error { - return x.KillClientChecked(globalXConn, uint32(win)).Check(globalXConn) -} diff --git a/docs/aireplane-mode.md b/docs/aireplane-mode.md index 568b2e53f..aabb5c72a 100644 --- a/docs/aireplane-mode.md +++ b/docs/aireplane-mode.md @@ -1,8 +1,8 @@ # airplane mode 模块 -在 system bus 上提供服务,服务名 com.deepin.daemon.AirplaneMode, 只有一个对象 /com/deepin/daemon/AirplaneMode,这个对象只有一个接口 com.deepin.daemon.AirplaneMode。 +在 system bus 上提供服务,服务名 org.deepin.dde.AirplaneMode1, 只有一个对象 /org/deepin/dde/AirplaneMode1,这个对象只有一个接口 org.deepin.dde.AirplaneMode1。 -## 接口 com.deepin.daemon.AirplaneMode +## 接口 org.deepin.dde.AirplaneMode1 ### 属性 Enabled bool 飞行模式是否打开 diff --git a/docs/authority.md b/docs/authority.md index 9a781ad1b..23f52c200 100644 --- a/docs/authority.md +++ b/docs/authority.md @@ -1,4 +1,4 @@ -# com.deepin.daemon.Authority 服务 +# org.deepin.dde.Authority1 服务 这是个在 system bus 上的 DBus 服务,提供给 UI 界面统一的认证服务。可以支持 登录界面、锁屏界面和 policykit 权限认证框的认证。 @@ -8,9 +8,9 @@ ## Authority 入口对象 -对象路径:/com/deepin/daemon/Authority +对象路径:/org/deepin/dde/Authority1 -### com.deepin.daemon.Authority 接口 +### org.deepin.dde.Authority1 接口 #### 方法 @@ -38,9 +38,9 @@ CheckCookie(String user, String cookie) -> (Bool result) ## 认证事务 -对象路径:/com/deepin/daemon/Authority/TranscationN +对象路径:/org/deepin/dde/Authority1/TranscationN -### com.deepin.daemon.Authority.Transcation 接口 +### org.deepin.dde.Authority1.Transcation 接口 #### 方法 @@ -69,9 +69,9 @@ Authenticating Bool 表示是否正在进行认证 ## Agent 对象 -UI 程序在 system bus 上导出一个对象,这个对象实现 com.deepin.daemon.Authority.Agent 接口,把对象的路径作为 com.deepin.daemon.Authority.Start 方法的 agentObj 参数。 +UI 程序在 system bus 上导出一个对象,这个对象实现 org.deepin.dde.Authority1.Agent 接口,把对象的路径作为 org.deepin.dde.Authority1.Start 方法的 agentObj 参数。 -### com.deepin.daemon.Authority.Agent 接口 +### org.deepin.dde.Authority1.Agent 接口 #### 方法 diff --git a/docs/calendar/ifc.md b/docs/calendar/ifc.md index 5e5fc0867..48ccbc6ed 100644 --- a/docs/calendar/ifc.md +++ b/docs/calendar/ifc.md @@ -1,10 +1,10 @@ Bus 类型:session bus -服务名称:com.deepin.daemon.Calendar +服务名称:org.deepin.dde.Calendar1 -对象路径:/com/deepin/daemon/Calendar/Scheduler +对象路径:/org/deepin/dde/Calendar1/Scheduler -接口名称:com.deepin.daemon.Calendar.Scheduler +接口名称:org.deepin.dde.Calendar1.Scheduler # 方法 diff --git a/docs/service_trigger.md b/docs/service_trigger.md index 9465c6434..7ef915e32 100644 --- a/docs/service_trigger.md +++ b/docs/service_trigger.md @@ -27,9 +27,9 @@ "Type": "DBus", "DBus": { "BusType": "System", - "Sender": "com.deepin.daemon.Apps", - "Interface": "com.deepin.daemon.Apps.LaunchedRecorder", - "Path": "/com/deepin/daemon/Apps", + "Sender": "org.deepin.dde.Apps1", + "Interface": "org.deepin.dde.Apps1.LaunchedRecorder", + "Path": "/org/deepin/dde/Apps1", "Signal": "StatusSaved" } }, @@ -40,7 +40,7 @@ } ``` -这样会让 service_trigger 监听 system bus 的 com.deepin.daemon.Apps 服务的 /com/deepin/daemon/Apps 对象的 com.deepin.daemon.Apps.LaunchedRecorder 接口的 StatusSaved 信号,如果收到将执行 echo 命令输出信号参数。 +这样会让 service_trigger 监听 system bus 的 org.deepin.dde.Apps 服务的 /org/deepin/dde/Apps1 对象的 org.deepin.dde.Apps1.LaunchedRecorder 接口的 StatusSaved 信号,如果收到将执行 echo 命令输出信号参数。 ### 详述 Name 名称,字符串,必填; diff --git a/docs/session-power.md b/docs/session-power.md index 795bf10be..8f026bc72 100644 --- a/docs/session-power.md +++ b/docs/session-power.md @@ -1,10 +1,10 @@ -# com.deepin.daemon.Power 服务 +# org.deepin.dde.Power1 服务 这是个在 Session Bus 上的服务 ## Power 入口对象 -对象路径:/com/deepin/daemon/Power +对象路径:/org/deepin/dde/Power1 ## 属性: diff --git a/fprintd/common/common.go b/fprintd1/common/common.go similarity index 87% rename from fprintd/common/common.go rename to fprintd1/common/common.go index 6781f21be..3f81184a2 100644 --- a/fprintd/common/common.go +++ b/fprintd1/common/common.go @@ -10,9 +10,9 @@ import ( "os" "path/filepath" - dbus "github.com/godbus/dbus" - huawei_fprint "github.com/linuxdeepin/go-dbus-factory/com.huawei.fingerprint" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" + dbus "github.com/godbus/dbus/v5" + huawei_fprint "github.com/linuxdeepin/go-dbus-factory/system/com.huawei.fingerprint" + ofdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.dbus" ) const ( diff --git a/fprintd/device.go b/fprintd1/device.go similarity index 95% rename from fprintd/device.go rename to fprintd1/device.go index 04f3a5bff..73746a3ed 100644 --- a/fprintd/device.go +++ b/fprintd1/device.go @@ -2,22 +2,22 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package fprintd +package fprintd1 import ( "errors" "path" "strings" - "github.com/godbus/dbus" - fprint "github.com/linuxdeepin/go-dbus-factory/net.reactivated.fprint" + "github.com/godbus/dbus/v5" + fprint "github.com/linuxdeepin/go-dbus-factory/system/net.reactivated.fprint" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/proxy" ) const ( - actionIdEnroll = "com.deepin.daemon.fprintd.enroll" - actionIdDelete = "com.deepin.daemon.fprintd.delete-enrolled-fingers" + actionIdEnroll = "org.deepin.dde.fprintd1.enroll" + actionIdDelete = "org.deepin.dde.fprintd1.delete-enrolled-fingers" ) type IDevice interface { diff --git a/fprintd/exported_methods_auto.go b/fprintd1/exported_methods_auto.go similarity index 99% rename from fprintd/exported_methods_auto.go rename to fprintd1/exported_methods_auto.go index e38594cb3..67012f1dc 100644 --- a/fprintd/exported_methods_auto.go +++ b/fprintd1/exported_methods_auto.go @@ -1,6 +1,6 @@ // Code generated by "dbusutil-gen em -type Manager,HuaweiDevice,Device"; DO NOT EDIT. -package fprintd +package fprintd1 import ( "github.com/linuxdeepin/go-lib/dbusutil" diff --git a/fprintd/fprintd.go b/fprintd1/fprintd.go similarity index 98% rename from fprintd/fprintd.go rename to fprintd1/fprintd.go index 279b83096..49b305e6c 100644 --- a/fprintd/fprintd.go +++ b/fprintd1/fprintd.go @@ -2,11 +2,11 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package fprintd +package fprintd1 import ( - "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/dde-daemon/loader" + "github.com/linuxdeepin/go-lib/log" ) var ( diff --git a/fprintd/fprintd_dbusutil.go b/fprintd1/fprintd_dbusutil.go similarity index 88% rename from fprintd/fprintd_dbusutil.go rename to fprintd1/fprintd_dbusutil.go index 3c554bda1..bdb156913 100644 --- a/fprintd/fprintd_dbusutil.go +++ b/fprintd1/fprintd_dbusutil.go @@ -1,9 +1,9 @@ // Code generated by "dbusutil-gen -type Manager -import github.com/godbus/dbus manager.go"; DO NOT EDIT. -package fprintd +package fprintd1 import ( - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" ) func (v *Manager) setPropDevices(value []dbus.ObjectPath) { diff --git a/fprintd/huawei_device.go b/fprintd1/huawei_device.go similarity index 98% rename from fprintd/huawei_device.go rename to fprintd1/huawei_device.go index a7f742c05..a06641208 100644 --- a/fprintd/huawei_device.go +++ b/fprintd1/huawei_device.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package fprintd +package fprintd1 import ( "errors" @@ -11,12 +11,12 @@ import ( "path/filepath" "sync" - dbus "github.com/godbus/dbus" - accounts "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.accounts" - huawei_fprint "github.com/linuxdeepin/go-dbus-factory/com.huawei.fingerprint" + dbus "github.com/godbus/dbus/v5" + fprintd_common "github.com/linuxdeepin/dde-daemon/fprintd1/common" + huawei_fprint "github.com/linuxdeepin/go-dbus-factory/system/com.huawei.fingerprint" + accounts "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.accounts1" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/strv" - fprintd_common "github.com/linuxdeepin/dde-daemon/fprintd/common" ) const ( diff --git a/fprintd/manager.go b/fprintd1/manager.go similarity index 95% rename from fprintd/manager.go rename to fprintd1/manager.go index 2d2bc5bb2..0d4ba3c27 100644 --- a/fprintd/manager.go +++ b/fprintd1/manager.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package fprintd +package fprintd1 import ( "errors" @@ -10,19 +10,19 @@ import ( "sync" "time" - "github.com/godbus/dbus" - huawei_fprint "github.com/linuxdeepin/go-dbus-factory/com.huawei.fingerprint" - fprint "github.com/linuxdeepin/go-dbus-factory/net.reactivated.fprint" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" - polkit "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.policykit1" + "github.com/godbus/dbus/v5" + huawei_fprint "github.com/linuxdeepin/go-dbus-factory/system/com.huawei.fingerprint" + fprint "github.com/linuxdeepin/go-dbus-factory/system/net.reactivated.fprint" + ofdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.dbus" + polkit "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.policykit1" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/strv" "golang.org/x/xerrors" ) const ( - dbusServiceName = "com.deepin.daemon.Fprintd" - dbusPath = "/com/deepin/daemon/Fprintd" + dbusServiceName = "org.deepin.dde.Fprintd1" + dbusPath = "/org/deepin/dde/Fprintd1" dbusInterface = dbusServiceName dbusDeviceInterface = dbusServiceName + ".Device" diff --git a/gesture/config_test.go b/gesture/config_test.go deleted file mode 100644 index dd3792d8f..000000000 --- a/gesture/config_test.go +++ /dev/null @@ -1,109 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package gesture - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -var ( - configPath = "testdata/gesture" -) - -// 查找手势信息 -func findGestureInfo(evInfo EventInfo, infos gestureInfos) bool { - for _, info := range infos { - if info.Event == evInfo { - return true - } - } - return false -} - -// 测试: 从文件读取手势信息 -func Test_newGestureInfosFromFile(t *testing.T) { - infos, err := newGestureInfosFromFile(configPath) - assert.NoError(t, err) - - assert.True(t, findGestureInfo(EventInfo{Name:"swipe", Direction:"up", Fingers:3}, infos)) - assert.True(t, findGestureInfo(EventInfo{Name:"swipe", Direction:"down", Fingers:3}, infos)) - assert.True(t, findGestureInfo(EventInfo{Name:"swipe", Direction:"left", Fingers:3}, infos)) - assert.True(t, findGestureInfo(EventInfo{Name:"swipe", Direction:"right", Fingers:3}, infos)) - assert.True(t, findGestureInfo(EventInfo{Name:"swipe", Direction:"up", Fingers:4}, infos)) - assert.True(t, findGestureInfo(EventInfo{Name:"swipe", Direction:"down", Fingers:4}, infos)) - assert.True(t, findGestureInfo(EventInfo{Name:"swipe", Direction:"left", Fingers:4}, infos)) - assert.True(t, findGestureInfo(EventInfo{Name:"swipe", Direction:"right", Fingers:4}, infos)) - assert.True(t, findGestureInfo(EventInfo{Name:"swipe", Direction:"up", Fingers:5}, infos)) - assert.True(t, findGestureInfo(EventInfo{Name:"swipe", Direction:"down", Fingers:5}, infos)) - assert.True(t, findGestureInfo(EventInfo{Name:"swipe", Direction:"left", Fingers:5}, infos)) - assert.True(t, findGestureInfo(EventInfo{Name:"swipe", Direction:"right", Fingers:5}, infos)) -} - -// 测试:Get接口 -func Test_Get(t *testing.T) { - infos, err := newGestureInfosFromFile(configPath) - assert.NoError(t, err) - - // for touch long press - infos = append(infos, &gestureInfo{ - Event: EventInfo{ - Name: "touch right button", - Direction: "down", - Fingers: 0, - }, - Action: ActionInfo{ - Type: ActionTypeCommandline, - Action: "xdotool mousedown 3", - }, - }) - infos = append(infos, &gestureInfo{ - Event: EventInfo{ - Name: "touch right button", - Direction: "up", - Fingers: 0, - }, - Action: ActionInfo{ - Type: ActionTypeCommandline, - Action: "xdotool mouseup 3", - }, - }) - - assert.NoError(t, err) - assert.NotNil(t, infos.Get(EventInfo{Name:"touch right button", Direction:"down", Fingers:0})) - assert.NotNil(t, infos.Get(EventInfo{Name:"touch right button", Direction:"up", Fingers:0}),) - assert.NotNil(t, infos.Get(EventInfo{Name:"swipe", Direction:"up", Fingers:3})) - assert.NotNil(t, infos.Get(EventInfo{Name:"swipe", Direction:"down", Fingers:3})) - assert.NotNil(t, infos.Get(EventInfo{Name:"swipe", Direction:"left", Fingers:3})) - assert.NotNil(t, infos.Get(EventInfo{Name:"swipe", Direction:"right", Fingers:3})) - assert.NotNil(t, infos.Get(EventInfo{Name:"swipe", Direction:"up", Fingers:4})) - assert.NotNil(t, infos.Get(EventInfo{Name:"swipe", Direction:"down", Fingers:4})) - assert.NotNil(t, infos.Get(EventInfo{Name:"swipe", Direction:"left", Fingers:4})) - assert.NotNil(t, infos.Get(EventInfo{Name:"swipe", Direction:"right", Fingers:4})) - assert.NotNil(t, infos.Get(EventInfo{Name:"swipe", Direction:"up", Fingers:5})) - assert.NotNil(t, infos.Get(EventInfo{Name:"swipe", Direction:"down", Fingers:5})) - assert.NotNil(t, infos.Get(EventInfo{Name:"swipe", Direction:"left", Fingers:5})) - assert.NotNil(t, infos.Get(EventInfo{Name:"swipe", Direction:"right", Fingers:5})) -} - -// 测试:Set接口 -func Test_Set(t *testing.T) { - infos, err := newGestureInfosFromFile(configPath) - assert.NoError(t, err) - - action1 := ActionInfo{ - Type: "shortcut", - Action: "ctrl+minus", - } - action2 := ActionInfo{ - Type: "shortcut", - Action: "ctrl+find", - } - assert.NotNil(t, infos.Set(EventInfo{Name:"pinch", Direction:"in", Fingers:2}, action1)) - assert.NotNil(t, infos.Set(EventInfo{Name:"pinch", Direction:"out", Fingers:2}, action1)) - assert.Nil(t, infos.Set(EventInfo{Name:"swipe", Direction:"up", Fingers:3}, action2)) - assert.Nil(t, infos.Set(EventInfo{Name:"swipe", Direction:"down", Fingers:3}, action2)) -} diff --git a/gesture/built-in.go b/gesture1/built-in.go similarity index 99% rename from gesture/built-in.go rename to gesture1/built-in.go index e77045003..b44d18cd6 100644 --- a/gesture/built-in.go +++ b/gesture1/built-in.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package gesture +package gesture1 import ( "os/exec" diff --git a/gesture/config.go b/gesture1/config.go similarity index 99% rename from gesture/config.go rename to gesture1/config.go index bfbd4db79..5051a3f06 100644 --- a/gesture/config.go +++ b/gesture1/config.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package gesture +package gesture1 import ( "encoding/json" diff --git a/gesture1/config_test.go b/gesture1/config_test.go new file mode 100644 index 000000000..25be2ad2b --- /dev/null +++ b/gesture1/config_test.go @@ -0,0 +1,109 @@ +// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +package gesture1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +var ( + configPath = "testdata/gesture" +) + +// 查找手势信息 +func findGestureInfo(evInfo EventInfo, infos gestureInfos) bool { + for _, info := range infos { + if info.Event == evInfo { + return true + } + } + return false +} + +// 测试: 从文件读取手势信息 +func Test_newGestureInfosFromFile(t *testing.T) { + infos, err := newGestureInfosFromFile(configPath) + assert.NoError(t, err) + + assert.True(t, findGestureInfo(EventInfo{Name: "swipe", Direction: "up", Fingers: 3}, infos)) + assert.True(t, findGestureInfo(EventInfo{Name: "swipe", Direction: "down", Fingers: 3}, infos)) + assert.True(t, findGestureInfo(EventInfo{Name: "swipe", Direction: "left", Fingers: 3}, infos)) + assert.True(t, findGestureInfo(EventInfo{Name: "swipe", Direction: "right", Fingers: 3}, infos)) + assert.True(t, findGestureInfo(EventInfo{Name: "swipe", Direction: "up", Fingers: 4}, infos)) + assert.True(t, findGestureInfo(EventInfo{Name: "swipe", Direction: "down", Fingers: 4}, infos)) + assert.True(t, findGestureInfo(EventInfo{Name: "swipe", Direction: "left", Fingers: 4}, infos)) + assert.True(t, findGestureInfo(EventInfo{Name: "swipe", Direction: "right", Fingers: 4}, infos)) + assert.True(t, findGestureInfo(EventInfo{Name: "swipe", Direction: "up", Fingers: 5}, infos)) + assert.True(t, findGestureInfo(EventInfo{Name: "swipe", Direction: "down", Fingers: 5}, infos)) + assert.True(t, findGestureInfo(EventInfo{Name: "swipe", Direction: "left", Fingers: 5}, infos)) + assert.True(t, findGestureInfo(EventInfo{Name: "swipe", Direction: "right", Fingers: 5}, infos)) +} + +// 测试:Get接口 +func Test_Get(t *testing.T) { + infos, err := newGestureInfosFromFile(configPath) + assert.NoError(t, err) + + // for touch long press + infos = append(infos, &gestureInfo{ + Event: EventInfo{ + Name: "touch right button", + Direction: "down", + Fingers: 0, + }, + Action: ActionInfo{ + Type: ActionTypeCommandline, + Action: "xdotool mousedown 3", + }, + }) + infos = append(infos, &gestureInfo{ + Event: EventInfo{ + Name: "touch right button", + Direction: "up", + Fingers: 0, + }, + Action: ActionInfo{ + Type: ActionTypeCommandline, + Action: "xdotool mouseup 3", + }, + }) + + assert.NoError(t, err) + assert.NotNil(t, infos.Get(EventInfo{Name: "touch right button", Direction: "down", Fingers: 0})) + assert.NotNil(t, infos.Get(EventInfo{Name: "touch right button", Direction: "up", Fingers: 0})) + assert.NotNil(t, infos.Get(EventInfo{Name: "swipe", Direction: "up", Fingers: 3})) + assert.NotNil(t, infos.Get(EventInfo{Name: "swipe", Direction: "down", Fingers: 3})) + assert.NotNil(t, infos.Get(EventInfo{Name: "swipe", Direction: "left", Fingers: 3})) + assert.NotNil(t, infos.Get(EventInfo{Name: "swipe", Direction: "right", Fingers: 3})) + assert.NotNil(t, infos.Get(EventInfo{Name: "swipe", Direction: "up", Fingers: 4})) + assert.NotNil(t, infos.Get(EventInfo{Name: "swipe", Direction: "down", Fingers: 4})) + assert.NotNil(t, infos.Get(EventInfo{Name: "swipe", Direction: "left", Fingers: 4})) + assert.NotNil(t, infos.Get(EventInfo{Name: "swipe", Direction: "right", Fingers: 4})) + assert.NotNil(t, infos.Get(EventInfo{Name: "swipe", Direction: "up", Fingers: 5})) + assert.NotNil(t, infos.Get(EventInfo{Name: "swipe", Direction: "down", Fingers: 5})) + assert.NotNil(t, infos.Get(EventInfo{Name: "swipe", Direction: "left", Fingers: 5})) + assert.NotNil(t, infos.Get(EventInfo{Name: "swipe", Direction: "right", Fingers: 5})) +} + +// 测试:Set接口 +func Test_Set(t *testing.T) { + infos, err := newGestureInfosFromFile(configPath) + assert.NoError(t, err) + + action1 := ActionInfo{ + Type: "shortcut", + Action: "ctrl+minus", + } + action2 := ActionInfo{ + Type: "shortcut", + Action: "ctrl+find", + } + assert.NotNil(t, infos.Set(EventInfo{Name: "pinch", Direction: "in", Fingers: 2}, action1)) + assert.NotNil(t, infos.Set(EventInfo{Name: "pinch", Direction: "out", Fingers: 2}, action1)) + assert.Nil(t, infos.Set(EventInfo{Name: "swipe", Direction: "up", Fingers: 3}, action2)) + assert.Nil(t, infos.Set(EventInfo{Name: "swipe", Direction: "down", Fingers: 3}, action2)) +} diff --git a/gesture/daemon.go b/gesture1/daemon.go similarity index 93% rename from gesture/daemon.go rename to gesture1/daemon.go index 3ffabe054..b2021008b 100644 --- a/gesture/daemon.go +++ b/gesture1/daemon.go @@ -2,11 +2,11 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package gesture +package gesture1 import ( - "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/dde-daemon/loader" + "github.com/linuxdeepin/go-lib/log" ) type Daemon struct { @@ -15,8 +15,8 @@ type Daemon struct { } const ( - dbusServiceName = "com.deepin.daemon.Gesture" - dbusServicePath = "/com/deepin/daemon/Gesture" + dbusServiceName = "org.deepin.dde.Gesture1" + dbusServicePath = "/org/deepin/dde/Gesture1" dbusServiceIFC = dbusServiceName ) diff --git a/gesture/exported_methods_auto.go b/gesture1/exported_methods_auto.go similarity index 98% rename from gesture/exported_methods_auto.go rename to gesture1/exported_methods_auto.go index 24364c292..3e114736d 100644 --- a/gesture/exported_methods_auto.go +++ b/gesture1/exported_methods_auto.go @@ -1,6 +1,6 @@ // Code generated by "dbusutil-gen em -type Manager"; DO NOT EDIT. -package gesture +package gesture1 import ( "github.com/linuxdeepin/go-lib/dbusutil" diff --git a/gesture/manager.go b/gesture1/manager.go similarity index 95% rename from gesture/manager.go rename to gesture1/manager.go index 0d2c5bfa1..77d0c5d92 100644 --- a/gesture/manager.go +++ b/gesture1/manager.go @@ -2,11 +2,12 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package gesture +package gesture1 import ( "encoding/json" "fmt" + "io/ioutil" "math" "os" @@ -15,16 +16,16 @@ import ( "strings" "sync" - "github.com/godbus/dbus" - daemon "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.daemon" - display "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.display" - gesture "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.gesture" - sessionwatcher "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.sessionwatcher" - clipboard "github.com/linuxdeepin/go-dbus-factory/com.deepin.dde.clipboard" - dock "github.com/linuxdeepin/go-dbus-factory/com.deepin.dde.daemon.dock" - notification "github.com/linuxdeepin/go-dbus-factory/com.deepin.dde.notification" - sessionmanager "github.com/linuxdeepin/go-dbus-factory/com.deepin.sessionmanager" - wm "github.com/linuxdeepin/go-dbus-factory/com.deepin.wm" + "github.com/godbus/dbus/v5" + dock "github.com/linuxdeepin/go-dbus-factory/session/com.deepin.dde.daemon.dock" + notification "github.com/linuxdeepin/go-dbus-factory/session/com.deepin.dde.notification" + wm "github.com/linuxdeepin/go-dbus-factory/session/com.deepin.wm" + clipboard "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.clipboard1" + display "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.display1" + sessionmanager "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.sessionmanager1" + sessionwatcher "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.sessionwatcher1" + daemon "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.daemon1" + gesture "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.gesture1" gio "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/proxy" @@ -649,7 +650,7 @@ func (m *Manager) getTouchScreenRotationContext() (context *touchEventContext, p return } -//param @edge: swipe to touchscreen edge +// param @edge: swipe to touchscreen edge // edge: 该手势来自屏幕的哪条边 // p: 该手势的终点 func (m *Manager) handleTouchEdgeMoveStopLeave(context *touchEventContext, edge string, p *point, duration int32) error { @@ -734,7 +735,7 @@ func (m *Manager) handleTouchMovementEvent(context *touchEventContext, direction return nil } -//touchpad double click down +// touchpad double click down func (m *Manager) handleDbclickDown(fingers int32) error { if fingers == 3 { return m.wm.TouchToMove(0, 0, 0) @@ -742,7 +743,7 @@ func (m *Manager) handleDbclickDown(fingers int32) error { return nil } -//touchpad swipe move +// touchpad swipe move func (m *Manager) handleSwipeMoving(fingers int32, accelX float64, accelY float64) error { if fingers == 3 { return m.wm.TouchToMove(0, int32(accelX), int32(accelY)) @@ -750,7 +751,7 @@ func (m *Manager) handleSwipeMoving(fingers int32, accelX float64, accelY float6 return nil } -//touchpad swipe stop or interrupted +// touchpad swipe stop or interrupted func (m *Manager) handleSwipeStop(fingers int32) error { if fingers == 3 { return m.wm.ClearMoveStatus(0) diff --git a/gesture/manager_ifc.go b/gesture1/manager_ifc.go similarity index 97% rename from gesture/manager_ifc.go rename to gesture1/manager_ifc.go index 0268ca9fa..60a23b1d6 100644 --- a/gesture/manager_ifc.go +++ b/gesture1/manager_ifc.go @@ -2,10 +2,10 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package gesture +package gesture1 import ( - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" ) diff --git a/gesture/testdata/gesture b/gesture1/testdata/gesture similarity index 92% rename from gesture/testdata/gesture rename to gesture1/testdata/gesture index a790fa1a2..14db6803e 100644 --- a/gesture/testdata/gesture +++ b/gesture1/testdata/gesture @@ -106,7 +106,7 @@ }, "Action": { "Type": "commandline", - "Action": "dbus-send --type=method_call --dest=com.deepin.dde.Launcher /com/deepin/dde/Launcher com.deepin.dde.Launcher.Toggle" + "Action": "dbus-send --type=method_call --dest=org.deepin.dde.Launcher1 /org/deepin/dde/Launcher1 org.deepin.dde.Launcher1.Toggle" } }, { @@ -161,7 +161,7 @@ }, "Action": { "Type": "commandline", - "Action": "dbus-send --type=method_call --dest=com.deepin.dde.Launcher /com/deepin/dde/Launcher com.deepin.dde.Launcher.Toggle" + "Action": "dbus-send --type=method_call --dest=org.deepin.dde.Launcher1 /org/deepin/dde/Launcher1 org.deepin.dde.Launcher1.Toggle" } } ] diff --git a/gesture/utils.go b/gesture1/utils.go similarity index 95% rename from gesture/utils.go rename to gesture1/utils.go index 245bd5495..50d2813cc 100644 --- a/gesture/utils.go +++ b/gesture1/utils.go @@ -2,15 +2,15 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package gesture +package gesture1 import ( "fmt" "io/ioutil" "strings" - "github.com/godbus/dbus" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + "github.com/godbus/dbus/v5" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" x "github.com/linuxdeepin/go-x11-client" "github.com/linuxdeepin/go-x11-client/util/keybind" "github.com/linuxdeepin/go-x11-client/util/wm/ewmh" diff --git a/gesture/utils_test.go b/gesture1/utils_test.go similarity index 86% rename from gesture/utils_test.go rename to gesture1/utils_test.go index 7a53d5333..2e29daee0 100644 --- a/gesture/utils_test.go +++ b/gesture1/utils_test.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package gesture +package gesture1 import ( "testing" @@ -15,5 +15,5 @@ func Test_isInWindowBlacklist(t *testing.T) { assert.True(t, isInWindowBlacklist("window1", slice)) assert.True(t, isInWindowBlacklist("window2", slice)) assert.True(t, isInWindowBlacklist("window3", slice)) - assert.False(t,isInWindowBlacklist("window4", slice)) + assert.False(t, isInWindowBlacklist("window4", slice)) } diff --git a/go.mod b/go.mod new file mode 100644 index 000000000..6aad7309d --- /dev/null +++ b/go.mod @@ -0,0 +1,47 @@ +module github.com/linuxdeepin/dde-daemon + +go 1.20 + +require ( + github.com/Lofanmi/pinyin-golang v0.0.0-20211114132645-1db892057f20 + github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 + github.com/davecgh/go-spew v1.1.1 + github.com/fsnotify/fsnotify v1.7.0 + github.com/godbus/dbus/v5 v5.1.0 + github.com/gosexy/gettext v0.0.0-20160830220431-74466a0a0c4a + github.com/jouyouyun/hardware v0.1.8 + github.com/linuxdeepin/dde-api v0.0.0-20240902063014-bac87797f4c3 + github.com/linuxdeepin/go-dbus-factory v0.0.0-20240903071359-9b78726cee9a + github.com/linuxdeepin/go-gir v0.0.0-20230710064042-bd15f0549c87 + github.com/linuxdeepin/go-lib v0.0.0-20240105075242-dddda54ea9f0 + github.com/linuxdeepin/go-x11-client v0.0.0-20240415051504-c8e43d028ff9 + github.com/mdlayher/netlink v1.7.2 + github.com/msteinert/pam v1.2.0 + github.com/rickb777/date v1.21.1 + github.com/stretchr/testify v1.9.0 + golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 + google.golang.org/protobuf v1.34.2 + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c + gopkg.in/yaml.v2 v2.4.0 +) + +require ( + github.com/google/go-cmp v0.6.0 // indirect + github.com/josharian/native v1.1.0 // indirect + github.com/kr/pretty v0.2.1 // indirect + github.com/kr/text v0.1.0 // indirect + github.com/mdlayher/socket v0.4.1 // indirect + github.com/mozillazg/go-pinyin v0.19.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rickb777/plural v1.4.2 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/youpy/go-riff v0.1.0 // indirect + github.com/youpy/go-wav v0.3.2 // indirect + github.com/zaf/g711 v0.0.0-20220109202201-cf0017bf0359 // indirect + golang.org/x/image v0.10.0 // indirect + golang.org/x/net v0.27.0 // indirect + golang.org/x/sync v0.8.0 // indirect + golang.org/x/sys v0.22.0 // indirect + golang.org/x/text v0.17.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 000000000..c0172ed8e --- /dev/null +++ b/go.sum @@ -0,0 +1,144 @@ +github.com/Lofanmi/pinyin-golang v0.0.0-20211114132645-1db892057f20 h1:QUwRV0ZgSjXBJnKOJh0T5rqe1jLWxlR5AvBLWSYJ7qg= +github.com/Lofanmi/pinyin-golang v0.0.0-20211114132645-1db892057f20/go.mod h1:J7A5UW8HA8b8lsEO/OshykiGGfmdQEnbDE53D23JsXE= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ= +github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gosexy/gettext v0.0.0-20160830220431-74466a0a0c4a h1:N2b2mb4Gki1SlF3WuhR9P1YHOpl7oy/b+xxX4A3iM2E= +github.com/gosexy/gettext v0.0.0-20160830220431-74466a0a0c4a/go.mod h1:IEJaV4/6J0VpoQ33kFCUUP6umRjrcBVEbOva6XCub/Q= +github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA= +github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= +github.com/jouyouyun/hardware v0.1.8 h1:AMYS9AMindRzSIL204OC9paLRpKZdnaoe5d/aJcg3r4= +github.com/jouyouyun/hardware v0.1.8/go.mod h1:euf5y8Zl/iC5YoBS+ELD1jrCN3K+D0CAz+vFtuzDGho= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/linuxdeepin/dde-api v0.0.0-20240902063014-bac87797f4c3 h1:SlPsz953m6CeFoawhtL5S/3huF0s4PtPxiTeIp7CKIw= +github.com/linuxdeepin/dde-api v0.0.0-20240902063014-bac87797f4c3/go.mod h1:Ms92CRDOjzkDmX1x0x6+b0vQSYHJ7Ab9jQMY2JYWiio= +github.com/linuxdeepin/go-dbus-factory v0.0.0-20240903071359-9b78726cee9a h1:y4efdtW6HfewiXayG9mRRGekkGECQDhgzmsSbkOkdoY= +github.com/linuxdeepin/go-dbus-factory v0.0.0-20240903071359-9b78726cee9a/go.mod h1:iIlTR50SA8MJ9ORPyMOpKWMF4g+AUorbER5AX0RD9Jk= +github.com/linuxdeepin/go-gir v0.0.0-20230331033513-a8d7a9e89f9b/go.mod h1:a0tox5vepTQu5iO6rdKc4diGT+fkyXZlRROM8ULEvaI= +github.com/linuxdeepin/go-gir v0.0.0-20230710064042-bd15f0549c87 h1:ga3ioifiDJJDfWv0ZJPX8e//fQNIzINXxJb4BMQofOo= +github.com/linuxdeepin/go-gir v0.0.0-20230710064042-bd15f0549c87/go.mod h1:a0tox5vepTQu5iO6rdKc4diGT+fkyXZlRROM8ULEvaI= +github.com/linuxdeepin/go-lib v0.0.0-20240105075242-dddda54ea9f0 h1:GKCg/0gMMMbQUBvZiGFeEp/xeFTWmBeee+a77viyO3I= +github.com/linuxdeepin/go-lib v0.0.0-20240105075242-dddda54ea9f0/go.mod h1:yNoMFao1mE45M8zW6i83eaGpT9eriCWsXEdcVNQswpw= +github.com/linuxdeepin/go-x11-client v0.0.0-20220830090948-78fe92b727bb/go.mod h1:KwpmRZ47A/0a2l9V0V6aTlkuNaqy5j1fOqMFJONuIMY= +github.com/linuxdeepin/go-x11-client v0.0.0-20240415051504-c8e43d028ff9 h1:GbhdC1TMi+V5yMRlfl16Y2gT/nhJn2OJalw6sVbFRHQ= +github.com/linuxdeepin/go-x11-client v0.0.0-20240415051504-c8e43d028ff9/go.mod h1:KwpmRZ47A/0a2l9V0V6aTlkuNaqy5j1fOqMFJONuIMY= +github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g= +github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw= +github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U= +github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= +github.com/mozillazg/go-pinyin v0.19.0 h1:p+J8/kjJ558KPvVGYLvqBhxf8jbZA2exSLCs2uUVN8c= +github.com/mozillazg/go-pinyin v0.19.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc= +github.com/msteinert/pam v1.2.0 h1:mYfjlvN2KYs2Pb9G6nb/1f/nPfAttT/Jee5Sq9r3bGE= +github.com/msteinert/pam v1.2.0/go.mod h1:d2n0DCUK8rGecChV3JzvmsDjOY4R7AYbsNxAT+ftQl0= +github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rickb777/date v1.21.1 h1:tUcQS8riIRoYK5kUAv5aevllFEYUEk2x8OYDyoldOn4= +github.com/rickb777/date v1.21.1/go.mod h1:gnDexsbXViZr2fCKMrY3m6IfAF5U2vSkEaiGJcNFaLQ= +github.com/rickb777/plural v1.4.2 h1:Kl/syFGLFZ5EbuV8c9SVud8s5HI2HpCCtOMw2U1kS+A= +github.com/rickb777/plural v1.4.2/go.mod h1:kdmXUpmKBJTS0FtG/TFumd//VBWsNTD7zOw7x4umxNw= +github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= +github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= +github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= +github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/youpy/go-riff v0.1.0 h1:vZO/37nI4tIET8tQI0Qn0Y79qQh99aEpponTPiPut7k= +github.com/youpy/go-riff v0.1.0/go.mod h1:83nxdDV4Z9RzrTut9losK7ve4hUnxUR8ASSz4BsKXwQ= +github.com/youpy/go-wav v0.3.2 h1:NLM8L/7yZ0Bntadw/0h95OyUsen+DQIVf9gay+SUsMU= +github.com/youpy/go-wav v0.3.2/go.mod h1:0FCieAXAeSdcxFfwLpRuEo0PFmAoc+8NU34h7TUvk50= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zaf/g711 v0.0.0-20190814101024-76a4a538f52b/go.mod h1:T2h1zV50R/q0CVYnsQOQ6L7P4a2ZxH47ixWcMXFGyx8= +github.com/zaf/g711 v0.0.0-20220109202201-cf0017bf0359 h1:P9yeMx2iNJxJqXEwLtMjSwWcD2a0AlFmFByeosMZhLM= +github.com/zaf/g711 v0.0.0-20220109202201-cf0017bf0359/go.mod h1:ySLGJD8AQluMQuu5JDvfJrwsBra+8iX1jFsKS8KfB2I= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/image v0.10.0 h1:gXjUUtwtx5yOE0VKWq1CH4IJAClq4UGgUA3i+rpON9M= +golang.org/x/image v0.10.0/go.mod h1:jtrku+n79PfroUbvDdeUWMAI+heR786BofxrbiSF+J0= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 h1:LLhsEBxRTBLuKlQxFBYUOU8xyFgXv6cOTp2HASDlsDk= +golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= diff --git a/grub2/edit_auth_ifc.go b/grub2/edit_auth_ifc.go index cac3bac64..db3407b53 100644 --- a/grub2/edit_auth_ifc.go +++ b/grub2/edit_auth_ifc.go @@ -9,7 +9,7 @@ import ( "strings" "unicode" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" ) diff --git a/grub2/fstart_ifc.go b/grub2/fstart_ifc.go index deeff8097..d0a0cca0e 100644 --- a/grub2/fstart_ifc.go +++ b/grub2/fstart_ifc.go @@ -7,7 +7,7 @@ package grub2 import ( "errors" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" ) @@ -18,7 +18,7 @@ const ( const ( deepinFstartFile = "/etc/default/grub.d/15_deepin_fstart.cfg" - deepinFstart = "DEEPIN_FSTART"; + deepinFstart = "DEEPIN_FSTART" ) func (*Fstart) GetInterfaceName() string { @@ -43,7 +43,7 @@ func (f *Fstart) SkipGrub(sender dbus.Sender, enabled bool) *dbus.Error { return nil } err = setFstartState(enabled) - if err != nil{ + if err != nil { return dbusutil.ToError(err) } diff --git a/grub2/grub2.go b/grub2/grub2.go index 36f0d6ce9..fdeee4e0b 100644 --- a/grub2/grub2.go +++ b/grub2/grub2.go @@ -17,9 +17,9 @@ import ( "sync" "unicode" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/grub_common" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" + ofdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.dbus" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/go-lib/procfs" @@ -705,7 +705,7 @@ func setFstartState(state bool) error { if strings.Trim(strings.TrimSpace(line[strings.Index(line, "=")+1:]), "\"") != arg { lines[lineNum] = "export " + deepinFstart + "=\"" + arg + "\"" err := ioutil.WriteFile(deepinFstartFile, []byte(strings.Join(lines, "\n")), 0644) - if err != nil{ + if err != nil { return dbusutil.ToError(err) } } diff --git a/grub2/grub2_ifc.go b/grub2/grub2_ifc.go index 7dd488fac..67f98b00f 100644 --- a/grub2/grub2_ifc.go +++ b/grub2/grub2_ifc.go @@ -9,19 +9,19 @@ import ( "io/ioutil" "strings" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/grub_common" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/procfs" ) const ( - dbusServiceName = "com.deepin.daemon.Grub2" - dbusPath = "/com/deepin/daemon/Grub2" - dbusInterface = "com.deepin.daemon.Grub2" + dbusServiceName = "org.deepin.dde.Grub2" + dbusPath = "/org/deepin/dde/Grub2" + dbusInterface = dbusServiceName - polikitActionIdCommon = "com.deepin.daemon.Grub2" - polikitActionIdPrepareGfxmodeDetect = "com.deepin.daemon.grub2.prepare-gfxmode-detect" + polikitActionIdCommon = "org.deepin.dde.Grub2" + polikitActionIdPrepareGfxmodeDetect = "org.deepin.dde.grub2.prepare-gfxmode-detect" timeoutMax = 10 ) diff --git a/grub2/inhibitor.go b/grub2/inhibitor.go index 4a6ad4c79..58799cc7c 100644 --- a/grub2/inhibitor.go +++ b/grub2/inhibitor.go @@ -7,8 +7,8 @@ package grub2 import ( "syscall" - "github.com/godbus/dbus" - "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" ) func (m *Grub2) enableShutdown() { diff --git a/grub2/theme_ifc.go b/grub2/theme_ifc.go index 454c00977..a7d0ab11f 100644 --- a/grub2/theme_ifc.go +++ b/grub2/theme_ifc.go @@ -11,7 +11,7 @@ import ( "path/filepath" "strings" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/utils" dutils "github.com/linuxdeepin/go-lib/utils" diff --git a/grub2/utils.go b/grub2/utils.go index 0e7281aea..4f5a770d6 100644 --- a/grub2/utils.go +++ b/grub2/utils.go @@ -14,9 +14,9 @@ import ( "strconv" "strings" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/grub_common" - polkit "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.policykit1" + polkit "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.policykit1" ) func quoteString(str string) string { diff --git a/grub_gfx/main.go b/grub_gfx/main.go index d2e1392d3..e758ffa04 100644 --- a/grub_gfx/main.go +++ b/grub_gfx/main.go @@ -5,9 +5,9 @@ package grub_gfx import ( - "github.com/godbus/dbus" - ofd "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/grub_common" + ofd "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.dbus" ) func detectChange() { @@ -97,7 +97,7 @@ func startSysGrubService() error { } sysBusDaemon := ofd.NewDBus(sysBus) _, err = sysBusDaemon.StartServiceByName(dbus.FlagNoAutoStart, - "com.deepin.daemon.Grub2", 0) + "org.deepin.dde.Grub2", 0) return err } @@ -107,7 +107,7 @@ func getSysGrubObj() (dbus.BusObject, error) { return nil, err } - obj := sysBus.Object("com.deepin.daemon.Grub2", "/com/deepin/daemon/Grub2") + obj := sysBus.Object("org.deepin.dde.Grub2", "/org/deepin/dde/Grub2") return obj, nil } @@ -118,5 +118,5 @@ func prepareGfxmodeDetect() error { return err } - return sysGrubObj.Call("com.deepin.daemon.Grub2.PrepareGfxmodeDetect", 0).Err + return sysGrubObj.Call("org.deepin.dde.Grub2.PrepareGfxmodeDetect", 0).Err } diff --git a/housekeeping/init.go b/housekeeping/init.go index 62b6c5e82..b328286d5 100644 --- a/housekeeping/init.go +++ b/housekeeping/init.go @@ -8,12 +8,12 @@ import ( "os" "time" - "github.com/godbus/dbus" - notifications "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.notifications" + "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/loader" + notifications "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.notifications" . "github.com/linuxdeepin/go-lib/gettext" "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/go-lib/utils" - "github.com/linuxdeepin/dde-daemon/loader" ) const ( @@ -61,21 +61,12 @@ func (d *Daemon) Start() error { return } - fs, err := utils.QueryFilesytemInfo(os.Getenv("HOME")) - if err != nil { - logger.Error("Failed to get filesystem info:", err) + if !d.checkSpace("HOME", true) { break } - logger.Debug("Home filesystem info(total, free, avail):", - fs.TotalSize, fs.FreeSize, fs.AvailSize) - if fs.AvailSize > fsMinLeftSpace { + if !d.checkSpace("/tmp", false) { break } - err = sendNotify("dialog-warning", "", - Tr("Insufficient disk space, please clean up in time!")) - if err != nil { - logger.Warning(err) - } case <-d.stopChan: logger.Debug("Stop housekeeping") if d.ticker != nil { @@ -108,3 +99,47 @@ func sendNotify(icon, summary, body string) error { nil, nil, -1) return err } + +func sendNotify2(icon, summary, body, action, call string, timeout int32) error { + sessionBus, err := dbus.SessionBus() + if err != nil { + return err + } + notifier := notifications.NewNotifications(sessionBus) + _, err = notifier.Notify(0, "dde-control-center", 0, + icon, summary, body, + []string{"_dbus", action}, + map[string]dbus.Variant{ + "x-deepin-action-_dbus": dbus.MakeVariant(call), + "x-deepin-ClickToDisappear": dbus.MakeVariant(false), + "x-deepin-DisappearAfterLock": dbus.MakeVariant(false), + }, timeout) + return err +} + +func (d *Daemon) checkSpace(dir string, state bool) bool { + if state { + dir = os.Getenv(dir) + } + fs, err := utils.QueryFilesytemInfo(dir) + if err != nil { + logger.Error("Failed to get filesystem info for :", dir, err) + return false + } + + if fs.AvailSize > fsMinLeftSpace { + logger.Debug("Sufficient space for:", dir) + return true + } + logger.Info("checkSpace fs.AvailSize(M) : ", dir, fs.AvailSize/1024/1024) + err = sendNotify2("dialog-warning", "", + Tr("Insufficient disk space, please clean up in time!"), + Tr("Go to clean up"), + "dbus-send,--type=method_call,--dest=com.deepin.defender.hmiscreen,/com/deepin/defender/hmiscreen,com.deepin.defender.hmiscreen.ShowModule,string:diskcleaner", + 5000, + ) + if err != nil { + logger.Warning("Failed to send notification for", dir, ":", err) + } + return false +} diff --git a/image_effect/exported_methods_auto.go b/image_effect1/exported_methods_auto.go similarity index 100% rename from image_effect/exported_methods_auto.go rename to image_effect1/exported_methods_auto.go diff --git a/image_effect/image_effect.go b/image_effect1/image_effect.go similarity index 98% rename from image_effect/image_effect.go rename to image_effect1/image_effect.go index 2bb4be993..653af4072 100644 --- a/image_effect/image_effect.go +++ b/image_effect1/image_effect.go @@ -14,7 +14,7 @@ import ( "sync" "time" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/procfs" "golang.org/x/xerrors" @@ -23,9 +23,9 @@ import ( //go:generate dbusutil-gen em -type ImageEffect const ( - dbusServiceName = "com.deepin.daemon.ImageEffect" + dbusServiceName = "org.deepin.dde.ImageEffect1" dbusInterface = dbusServiceName - dbusPath = "/com/deepin/daemon/ImageEffect" + dbusPath = "/org/deepin/dde/ImageEffect1" cacheDir = "/var/cache/deepin/dde-daemon/image-effect" effectPixmix = "pixmix" diff --git a/image_effect/module.go b/image_effect1/module.go similarity index 100% rename from image_effect/module.go rename to image_effect1/module.go index 9ee3ae1df..74ee334fa 100644 --- a/image_effect/module.go +++ b/image_effect1/module.go @@ -5,8 +5,8 @@ package image_effect import ( - "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/dde-daemon/loader" + "github.com/linuxdeepin/go-lib/log" ) func init() { diff --git a/image_effect/utils.go b/image_effect1/utils.go similarity index 100% rename from image_effect/utils.go rename to image_effect1/utils.go diff --git a/inputdevices/stub.go b/inputdevices/stub.go deleted file mode 100644 index 0b6cb1252..000000000 --- a/inputdevices/stub.go +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -package inputdevices - -const ( - dbusServiceName = "com.deepin.daemon.InputDevices" - dbusPath = "/com/deepin/daemon/InputDevices" - dbusInterface = dbusServiceName - - kbdDBusPath = "/com/deepin/daemon/InputDevice/Keyboard" - kbdDBusInterface = "com.deepin.daemon.InputDevice.Keyboard" - - mouseDBusPath = "/com/deepin/daemon/InputDevice/Mouse" - mouseDBusInterface = "com.deepin.daemon.InputDevice.Mouse" - trackPointDBusInterface = "com.deepin.daemon.InputDevice.TrackPoint" - - touchPadDBusPath = "/com/deepin/daemon/InputDevice/TouchPad" - touchPadDBusInterface = "com.deepin.daemon.InputDevice.TouchPad" - - wacomDBusPath = "/com/deepin/daemon/InputDevice/Wacom" - wacomDBusInterface = "com.deepin.daemon.InputDevice.Wacom" -) - -func (*Manager) GetInterfaceName() string { - return dbusInterface -} - -func (*Keyboard) GetInterfaceName() string { - return kbdDBusInterface -} - -func (*Mouse) GetInterfaceName() string { - return mouseDBusInterface -} - -func (*TrackPoint) GetInterfaceName() string { - return trackPointDBusInterface -} - -func (*Touchpad) GetInterfaceName() string { - return touchPadDBusInterface -} - -func (*Wacom) GetInterfaceName() string { - return wacomDBusInterface -} diff --git a/inputdevices/app_layout_config.go b/inputdevices1/app_layout_config.go similarity index 100% rename from inputdevices/app_layout_config.go rename to inputdevices1/app_layout_config.go diff --git a/inputdevices/exported_methods_auto.go b/inputdevices1/exported_methods_auto.go similarity index 100% rename from inputdevices/exported_methods_auto.go rename to inputdevices1/exported_methods_auto.go diff --git a/inputdevices/handle_gsettings.go b/inputdevices1/handle_gsettings.go similarity index 100% rename from inputdevices/handle_gsettings.go rename to inputdevices1/handle_gsettings.go diff --git a/inputdevices/ifc.go b/inputdevices1/ifc.go similarity index 96% rename from inputdevices/ifc.go rename to inputdevices1/ifc.go index 8adc701c0..b3257ce3d 100644 --- a/inputdevices/ifc.go +++ b/inputdevices1/ifc.go @@ -5,9 +5,9 @@ package inputdevices import ( - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/langselector1" "github.com/linuxdeepin/go-lib/dbusutil" - "github.com/linuxdeepin/dde-daemon/langselector" ) func (m *Mouse) Reset() *dbus.Error { diff --git a/inputdevices/inputdevices.go b/inputdevices1/inputdevices.go similarity index 100% rename from inputdevices/inputdevices.go rename to inputdevices1/inputdevices.go diff --git a/inputdevices/inputdevices_dbusutil.go b/inputdevices1/inputdevices_dbusutil.go similarity index 100% rename from inputdevices/inputdevices_dbusutil.go rename to inputdevices1/inputdevices_dbusutil.go diff --git a/inputdevices/inputdevices_test.go b/inputdevices1/inputdevices_test.go similarity index 100% rename from inputdevices/inputdevices_test.go rename to inputdevices1/inputdevices_test.go diff --git a/inputdevices/iso639/auto.go b/inputdevices1/iso639/auto.go similarity index 100% rename from inputdevices/iso639/auto.go rename to inputdevices1/iso639/auto.go diff --git a/inputdevices/iso639/iso639.go b/inputdevices1/iso639/iso639.go similarity index 100% rename from inputdevices/iso639/iso639.go rename to inputdevices1/iso639/iso639.go diff --git a/inputdevices/keyboard.go b/inputdevices1/keyboard.go similarity index 99% rename from inputdevices/keyboard.go rename to inputdevices1/keyboard.go index 7f3b684f5..1aaa39fbd 100644 --- a/inputdevices/keyboard.go +++ b/inputdevices1/keyboard.go @@ -15,10 +15,10 @@ import ( "strings" "sync" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-api/dxinput" ddbus "github.com/linuxdeepin/dde-daemon/dbus" - accounts "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.accounts" + accounts "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.accounts1" "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/gsprop" diff --git a/inputdevices/kwayland.go b/inputdevices1/kwayland.go similarity index 97% rename from inputdevices/kwayland.go rename to inputdevices1/kwayland.go index 2c23c1d0d..f34fd1f77 100644 --- a/inputdevices/kwayland.go +++ b/inputdevices1/kwayland.go @@ -9,11 +9,11 @@ import ( "strconv" "strings" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-api/dxinput" "github.com/linuxdeepin/dde-api/dxinput/common" "github.com/linuxdeepin/dde-api/dxinput/kwayland" - kwin "github.com/linuxdeepin/go-dbus-factory/org.kde.kwin" + kwin "github.com/linuxdeepin/go-dbus-factory/session/org.kde.kwin" ) var ( @@ -81,6 +81,7 @@ func (m *Manager) setWaylandWheelSpeed(speed uint32) error { if pointer && speed != uint32(scrollFactor) { err := device.ScrollFactor().Set(0, float64(speed)) + if err != nil { logger.Warning(err) continue diff --git a/inputdevices/layout_list.go b/inputdevices1/layout_list.go similarity index 98% rename from inputdevices/layout_list.go rename to inputdevices1/layout_list.go index ef8a17819..275b0ca66 100644 --- a/inputdevices/layout_list.go +++ b/inputdevices1/layout_list.go @@ -8,10 +8,10 @@ import ( "encoding/xml" "io/ioutil" + "github.com/linuxdeepin/dde-daemon/inputdevices1/iso639" "github.com/linuxdeepin/go-lib/gettext" lib_locale "github.com/linuxdeepin/go-lib/locale" "github.com/linuxdeepin/go-lib/strv" - "github.com/linuxdeepin/dde-daemon/inputdevices/iso639" ) const ( diff --git a/inputdevices/listen.c b/inputdevices1/listen.c similarity index 100% rename from inputdevices/listen.c rename to inputdevices1/listen.c diff --git a/inputdevices/listen.h b/inputdevices1/listen.h similarity index 100% rename from inputdevices/listen.h rename to inputdevices1/listen.h diff --git a/inputdevices/manager.go b/inputdevices1/manager.go similarity index 98% rename from inputdevices/manager.go rename to inputdevices1/manager.go index 20383cc72..115349ed6 100644 --- a/inputdevices/manager.go +++ b/inputdevices1/manager.go @@ -12,7 +12,7 @@ import ( "path/filepath" "github.com/linuxdeepin/dde-daemon/common/dsync" - kwin "github.com/linuxdeepin/go-dbus-factory/org.kde.kwin" + kwin "github.com/linuxdeepin/go-dbus-factory/session/org.kde.kwin" "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/gsprop" diff --git a/inputdevices/mouse.go b/inputdevices1/mouse.go similarity index 100% rename from inputdevices/mouse.go rename to inputdevices1/mouse.go diff --git a/inputdevices1/stub.go b/inputdevices1/stub.go new file mode 100644 index 000000000..c18074ce5 --- /dev/null +++ b/inputdevices1/stub.go @@ -0,0 +1,48 @@ +// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +package inputdevices + +const ( + dbusServiceName = "org.deepin.dde.InputDevices1" + dbusPath = "/org/deepin/dde/InputDevices1" + dbusInterface = dbusServiceName + + kbdDBusPath = "/org/deepin/dde/InputDevice1/Keyboard" + kbdDBusInterface = "org.deepin.dde.InputDevice1.Keyboard" + + mouseDBusPath = "/org/deepin/dde/InputDevice1/Mouse" + mouseDBusInterface = "org.deepin.dde.InputDevice1.Mouse" + trackPointDBusInterface = "org.deepin.dde.InputDevice1.TrackPoint" + + touchPadDBusPath = "/org/deepin/dde/InputDevice1/TouchPad" + touchPadDBusInterface = "org.deepin.dde.InputDevice1.TouchPad" + + wacomDBusPath = "/org/deepin/dde/InputDevice1/Wacom" + wacomDBusInterface = "org.deepin.dde.InputDevice1.Wacom" +) + +func (*Manager) GetInterfaceName() string { + return dbusInterface +} + +func (*Keyboard) GetInterfaceName() string { + return kbdDBusInterface +} + +func (*Mouse) GetInterfaceName() string { + return mouseDBusInterface +} + +func (*TrackPoint) GetInterfaceName() string { + return trackPointDBusInterface +} + +func (*Touchpad) GetInterfaceName() string { + return touchPadDBusInterface +} + +func (*Wacom) GetInterfaceName() string { + return wacomDBusInterface +} diff --git a/inputdevices/sync_config.go b/inputdevices1/sync_config.go similarity index 100% rename from inputdevices/sync_config.go rename to inputdevices1/sync_config.go diff --git a/inputdevices/testdata/base.xml b/inputdevices1/testdata/base.xml similarity index 100% rename from inputdevices/testdata/base.xml rename to inputdevices1/testdata/base.xml diff --git a/inputdevices/testdata/dde-desktop-cmdline b/inputdevices1/testdata/dde-desktop-cmdline similarity index 100% rename from inputdevices/testdata/dde-desktop-cmdline rename to inputdevices1/testdata/dde-desktop-cmdline diff --git a/inputdevices/testdata/keyboard b/inputdevices1/testdata/keyboard similarity index 100% rename from inputdevices/testdata/keyboard rename to inputdevices1/testdata/keyboard diff --git a/inputdevices/testdata/syndaemon.pid b/inputdevices1/testdata/syndaemon.pid similarity index 100% rename from inputdevices/testdata/syndaemon.pid rename to inputdevices1/testdata/syndaemon.pid diff --git a/inputdevices/testdata/users.ini b/inputdevices1/testdata/users.ini similarity index 100% rename from inputdevices/testdata/users.ini rename to inputdevices1/testdata/users.ini diff --git a/inputdevices/touchpad.go b/inputdevices1/touchpad.go similarity index 98% rename from inputdevices/touchpad.go rename to inputdevices1/touchpad.go index 9677e0f08..6bc76bfeb 100644 --- a/inputdevices/touchpad.go +++ b/inputdevices1/touchpad.go @@ -13,10 +13,10 @@ import ( "strings" "sync" - "github.com/godbus/dbus" - inputdevices "github.com/linuxdeepin/go-dbus-factory/com.deepin.system.inputdevices" - power "github.com/linuxdeepin/go-dbus-factory/com.deepin.system.power" + "github.com/godbus/dbus/v5" configManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" + inputdevices "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.inputdevices1" + power "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.power1" "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/gsprop" @@ -173,7 +173,7 @@ func (tpad *Touchpad) init() { } if tpad.systemConn != nil { - sysTouchPad, err := inputdevices.NewTouchpad(tpad.systemConn, "/com/deepin/system/InputDevices/Touchpad") + sysTouchPad, err := inputdevices.NewTouchpad(tpad.systemConn, "/org/deepin/dde/InputDevices1/Touchpad") if err != nil { logger.Warning(err) } else { diff --git a/inputdevices/trackpoint.go b/inputdevices1/trackpoint.go similarity index 100% rename from inputdevices/trackpoint.go rename to inputdevices1/trackpoint.go diff --git a/inputdevices/utils.go b/inputdevices1/utils.go similarity index 100% rename from inputdevices/utils.go rename to inputdevices1/utils.go diff --git a/inputdevices/utils_test.go b/inputdevices1/utils_test.go similarity index 100% rename from inputdevices/utils_test.go rename to inputdevices1/utils_test.go diff --git a/inputdevices/wacom.go b/inputdevices1/wacom.go similarity index 100% rename from inputdevices/wacom.go rename to inputdevices1/wacom.go index 6ce03293e..9825ab130 100644 --- a/inputdevices/wacom.go +++ b/inputdevices1/wacom.go @@ -10,12 +10,12 @@ import ( "sync" "time" + "github.com/linuxdeepin/dde-api/dxinput" "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/gsprop" x "github.com/linuxdeepin/go-x11-client" "github.com/linuxdeepin/go-x11-client/ext/randr" - "github.com/linuxdeepin/dde-api/dxinput" ) const ( diff --git a/inputdevices/wm_wrapper.go b/inputdevices1/wm_wrapper.go similarity index 100% rename from inputdevices/wm_wrapper.go rename to inputdevices1/wm_wrapper.go diff --git a/inputdevices/wrapper.go b/inputdevices1/wrapper.go similarity index 99% rename from inputdevices/wrapper.go rename to inputdevices1/wrapper.go index 571dad025..78f5aeaac 100644 --- a/inputdevices/wrapper.go +++ b/inputdevices1/wrapper.go @@ -62,7 +62,7 @@ func handleDeviceChanged() { // 鼠标依赖触摸板的数据,必须在触摸板之后获取 _tpadInfos = Touchpads{} - getTPadInfos(false, false) + getTPadInfos(false, true) _mouseInfos = Mouses{} getMouseInfos(false) _wacomInfos = dxWacoms{} diff --git a/keybinding/audio_controller.go b/keybinding1/audio_controller.go similarity index 95% rename from keybinding/audio_controller.go rename to keybinding1/audio_controller.go index 9f566269a..60bd24616 100644 --- a/keybinding/audio_controller.go +++ b/keybinding1/audio_controller.go @@ -8,10 +8,10 @@ import ( "errors" "strings" - "github.com/godbus/dbus" - . "github.com/linuxdeepin/dde-daemon/keybinding/shortcuts" - audio "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.audio" - backlight "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.helper.backlight" + "github.com/godbus/dbus/v5" + . "github.com/linuxdeepin/dde-daemon/keybinding1/shortcuts" + audio "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.audio1" + backlight "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.backlighthelper1" "github.com/linuxdeepin/go-gir/gio-2.0" ) diff --git a/keybinding/config.go b/keybinding1/config.go similarity index 100% rename from keybinding/config.go rename to keybinding1/config.go diff --git a/keybinding/daemon.go b/keybinding1/daemon.go similarity index 96% rename from keybinding/daemon.go rename to keybinding1/daemon.go index 2459d4392..8fd331e66 100644 --- a/keybinding/daemon.go +++ b/keybinding1/daemon.go @@ -5,9 +5,9 @@ package keybinding import ( - "github.com/linuxdeepin/go-lib/log" - "github.com/linuxdeepin/dde-daemon/keybinding/shortcuts" + "github.com/linuxdeepin/dde-daemon/keybinding1/shortcuts" "github.com/linuxdeepin/dde-daemon/loader" + "github.com/linuxdeepin/go-lib/log" ) func init() { diff --git a/keybinding/display_controller.go b/keybinding1/display_controller.go similarity index 91% rename from keybinding/display_controller.go rename to keybinding1/display_controller.go index 460bacd46..f50a47fee 100644 --- a/keybinding/display_controller.go +++ b/keybinding1/display_controller.go @@ -8,10 +8,10 @@ import ( "os/exec" "sync" - "github.com/godbus/dbus" - . "github.com/linuxdeepin/dde-daemon/keybinding/shortcuts" - display "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.display" - backlight "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.helper.backlight" + "github.com/godbus/dbus/v5" + . "github.com/linuxdeepin/dde-daemon/keybinding1/shortcuts" + display "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.display1" + backlight "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.backlighthelper1" "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/strv" ) @@ -73,7 +73,8 @@ func (c *DisplayController) ExecCmd(cmd ActionCmd) error { switch cmd { case DisplayModeSwitch: // TODO 联想xrandr -q需要修改成X的接口 - if strv.Strv(c.m.needXrandrQDevice).Contains(c.m.dmiInfo.ProductName) { + if c.m.dmiInfo.ProductName != "" && + strv.Strv(c.m.needXrandrQDevice).Contains(c.m.dmiInfo.ProductName) { logger.Info("win+p pressed,need run xrandr -q") err = exec.Command("xrandr", "-q").Run() if err != nil { diff --git a/keybinding/exported_methods_auto.go b/keybinding1/exported_methods_auto.go similarity index 95% rename from keybinding/exported_methods_auto.go rename to keybinding1/exported_methods_auto.go index 25bbfbbbb..ba76534bc 100644 --- a/keybinding/exported_methods_auto.go +++ b/keybinding1/exported_methods_auto.go @@ -56,6 +56,11 @@ func (v *Manager) GetExportedMethods() dbusutil.ExportedMethods { Fn: v.Disable, InArgs: []string{"id", "type0"}, }, + { + Name: "EnableSystemShortcut", + Fn: v.EnableSystemShortcut, + InArgs: []string{"shortcuts", "enabled", "isPersistent"}, + }, { Name: "GetCapsLockState", Fn: v.GetCapsLockState, diff --git a/keybinding/huawei_mic.go b/keybinding1/huawei_mic.go similarity index 97% rename from keybinding/huawei_mic.go rename to keybinding1/huawei_mic.go index 11a6c361a..e4e98b0be 100644 --- a/keybinding/huawei_mic.go +++ b/keybinding1/huawei_mic.go @@ -8,7 +8,7 @@ import ( "os" "path/filepath" - backlight "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.helper.backlight" + backlight "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.backlighthelper1" "github.com/linuxdeepin/go-lib/pulse" ) diff --git a/keybinding/kbd_light_controller.go b/keybinding1/kbd_light_controller.go similarity index 94% rename from keybinding/kbd_light_controller.go rename to keybinding1/kbd_light_controller.go index 6d2f335b0..1d3daac05 100644 --- a/keybinding/kbd_light_controller.go +++ b/keybinding1/kbd_light_controller.go @@ -7,10 +7,10 @@ package keybinding import ( "errors" - backlight "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.helper.backlight" + . "github.com/linuxdeepin/dde-daemon/keybinding1/shortcuts" + backlight "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.backlighthelper1" commonbl "github.com/linuxdeepin/go-lib/backlight/common" kbdbl "github.com/linuxdeepin/go-lib/backlight/keyboard" - . "github.com/linuxdeepin/dde-daemon/keybinding/shortcuts" ) const backlightTypeKeyboard = 2 diff --git a/keybinding/lock_state.go b/keybinding1/lock_state.go similarity index 96% rename from keybinding/lock_state.go rename to keybinding1/lock_state.go index 842d092a9..ec6a5d378 100644 --- a/keybinding/lock_state.go +++ b/keybinding1/lock_state.go @@ -10,10 +10,10 @@ import ( "os" "time" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" - "github.com/linuxdeepin/dde-daemon/keybinding/shortcuts" - kwayland "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.kwayland" + "github.com/linuxdeepin/dde-daemon/keybinding1/shortcuts" + kwayland "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.kwayland1" x "github.com/linuxdeepin/go-x11-client" "github.com/linuxdeepin/go-x11-client/ext/test" "github.com/linuxdeepin/go-x11-client/util/keysyms" diff --git a/keybinding/manager.go b/keybinding1/manager.go similarity index 83% rename from keybinding/manager.go rename to keybinding1/manager.go index 05876bace..22ed9777e 100644 --- a/keybinding/manager.go +++ b/keybinding1/manager.go @@ -5,31 +5,38 @@ package keybinding import ( + "crypto/sha256" + "encoding/hex" "encoding/json" + "github.com/linuxdeepin/go-lib/appinfo/desktopappinfo" + "github.com/linuxdeepin/go-lib/strv" + "os" "os/exec" "path/filepath" "strings" "time" - dbus "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/keybinding/shortcuts" - airplanemode "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.airplanemode" - backlight "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.helper.backlight" - inputdevices "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.inputdevices" - keyevent "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.keyevent" - kwayland "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.kwayland" - network "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.network" - lockfront "github.com/linuxdeepin/go-dbus-factory/com.deepin.dde.lockfront" - shutdownfront "github.com/linuxdeepin/go-dbus-factory/com.deepin.dde.shutdownfront" - sessionmanager "github.com/linuxdeepin/go-dbus-factory/com.deepin.sessionmanager" - power "github.com/linuxdeepin/go-dbus-factory/com.deepin.system.power" - systeminfo "github.com/linuxdeepin/go-dbus-factory/com.deepin.system.systeminfo" - wm "github.com/linuxdeepin/go-dbus-factory/com.deepin.wm" + dbus "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/keybinding1/shortcuts" configManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" - DisplayManager "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.DisplayManager" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" - networkmanager "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.networkmanager" + lockfront "github.com/linuxdeepin/go-dbus-factory/session/com.deepin.dde.lockfront" + shutdownfront "github.com/linuxdeepin/go-dbus-factory/session/com.deepin.dde.shutdownfront" + wm "github.com/linuxdeepin/go-dbus-factory/session/com.deepin.wm" + appmanager "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.application1" + inputdevices "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.inputdevices1" + kwayland "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.kwayland1" + network "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.network1" + sessionmanager "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.sessionmanager1" + newAppmanager "github.com/linuxdeepin/go-dbus-factory/session/org.desktopspec.applicationmanager1" + airplanemode "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.airplanemode1" + backlight "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.backlighthelper1" + keyevent "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.keyevent1" + power "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.power1" + systeminfo "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.systeminfo1" + DisplayManager "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.DisplayManager" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" + networkmanager "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.networkmanager" gio "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/gsprop" @@ -69,10 +76,11 @@ const ( ) const ( - DSettingsAppID = "org.deepin.dde.daemon" - DSettingsKeyBindingName = "org.deepin.dde.daemon.keybinding" - DSettingsKeyWirelessControlEnable = "wirelessControlEnable" - DSettingsKeyNeedXrandrQDevices = "need-xrandr-q-devices" + DSettingsAppID = "org.deepin.dde.daemon" + DSettingsKeyBindingName = "org.deepin.dde.daemon.keybinding" + DSettingsKeyWirelessControlEnable = "wirelessControlEnable" + DSettingsKeyNeedXrandrQDevices = "need-xrandr-q-devices" + DSettingsKeyDeviceManagerControlEnable = "deviceManagerControlEnable" ) const ( // power按键事件的响应 @@ -89,6 +97,25 @@ func setUseWayland(value bool) { _useWayland = value } +const ( + appManagerDBusServiceName = "org.desktopspec.ApplicationManager1" + appManagerDBusPath = "/org/desktopspec/ApplicationManager1" +) + +const ( + KeyType = "Type" + KeyVersion = "Version" + KeyName = "Name" + KeyGenericName = "GenericName" + KeyNoDisplay = "NoDisplay" + KeyIcon = "Icon" + KeyExec = "Exec" + KeyPath = "Path" + KeyTerminal = "Terminal" + KeyMimeType = "MimeType" + KeyActions = "Actions" +) + type Manager struct { service *dbusutil.Service // properties @@ -119,9 +146,10 @@ type Manager struct { lockFront lockfront.LockFront shutdownFront shutdownfront.ShutdownFront - sessionSigLoop *dbusutil.SignalLoop - systemSigLoop *dbusutil.SignalLoop - startManager sessionmanager.StartManager + sessionSigLoop *dbusutil.SignalLoop + systemSigLoop *dbusutil.SignalLoop + //startManager sessionmanager.StartManager + appManager appmanager.Manager sessionManager sessionmanager.SessionManager airplane airplanemode.AirplaneMode networkmanager networkmanager.Manager @@ -156,10 +184,13 @@ type Manager struct { sklWaitQuit chan int // dsg config - wifiControlEnable bool - needXrandrQDevice []string + wifiControlEnable bool + needXrandrQDevice []string + useNewAppManager bool + deviceManagerControlEnable bool - configManagerPath dbus.ObjectPath + configManagerPath dbus.ObjectPath + DisabledSystemShortcutsList strv.Strv dmiInfo systeminfo.DMIInfo rfkillState bool @@ -319,7 +350,7 @@ func (m *Manager) init() { m.audioController = NewAudioController(sessionBus, m.backlightHelper) m.mediaPlayerController = NewMediaPlayerController(m.systemSigLoop, sessionBus) - m.startManager = sessionmanager.NewStartManager(sessionBus) + //m.startManager = sessionmanager.NewStartManager(sessionBus) m.airplane = airplanemode.NewAirplaneMode(sysBus) m.networkmanager = networkmanager.NewManager(sysBus) m.sessionManager = sessionmanager.NewSessionManager(sessionBus) @@ -373,6 +404,14 @@ func (m *Manager) init() { } else { logger.Info("init rfkillState : ", m.rfkillState) } + + hasOwner, err := m.service.NameHasOwner(appManagerDBusServiceName) + if err != nil { + logger.Warning("failed to call NameHasOwner:", err) + } + if hasOwner { + m.useNewAppManager = true + } } func (m *Manager) initDSettings(bus *dbus.Conn) { @@ -409,8 +448,17 @@ func (m *Manager) initDSettings(bus *dbus.Conn) { } } + getDeviceManagerControlEnableConfig := func() { + v, err := keybindingDS.Value(0, DSettingsKeyDeviceManagerControlEnable) + if err != nil { + logger.Warning(err) + return + } + m.deviceManagerControlEnable = v.Value().(bool) + } getWirelessControlEnableConfig() getNeedXrandrQConfig() + getDeviceManagerControlEnableConfig() keybindingDS.InitSignalExt(m.systemSigLoop, true) // 监听dsg配置变化 @@ -420,6 +468,8 @@ func (m *Manager) initDSettings(bus *dbus.Conn) { getWirelessControlEnableConfig() case DSettingsKeyNeedXrandrQDevices: getNeedXrandrQConfig() + case DSettingsKeyDeviceManagerControlEnable: + getDeviceManagerControlEnableConfig() } }) if err != nil { @@ -540,6 +590,11 @@ func (m *Manager) listenGlobalAccel(sessionBus *dbus.Conn) error { m.shortcutKey = sig.Body[0].(string) m.shortcutKeyCmd = sig.Body[1].(string) + shortId := kwinSysActionCmdMap[m.shortcutKeyCmd] + if shortId != "" && m.DisabledSystemShortcutsList.Contains(shortId) { + logger.Warningf("shortcut id: %s is disabled", shortId) + return + } ok := strings.Compare(string("kwin"), m.shortcutKey) if ok == 0 { logger.Debug("[global key] get accel sig.Body[1]", m.shortcutKeyCmd) @@ -578,13 +633,13 @@ func (m *Manager) listenGlobalAccel(sessionBus *dbus.Conn) error { } func (m *Manager) listenKeyboardEvent(systemBus *dbus.Conn) { - err := systemBus.Object("com.deepin.daemon.Gesture", - "/com/deepin/daemon/Gesture").AddMatchSignal("com.deepin.daemon.Gesture", "KeyboardEvent").Err + err := systemBus.Object("org.deepin.dde.Gesture1", + "/org/deepin/dde/Gesture1").AddMatchSignal("org.deepin.dde.Gesture1", "KeyboardEvent").Err if err != nil { logger.Warning(err) } m.systemSigLoop.AddHandler(&dbusutil.SignalRule{ - Name: "com.deepin.daemon.Gesture.KeyboardEvent", + Name: "org.deepin.dde.Gesture1.KeyboardEvent", }, func(sig *dbus.Signal) { if len(sig.Body) > 1 { key := sig.Body[0].(uint32) @@ -1069,6 +1124,10 @@ func (m *Manager) handleKeyEvent(ev *shortcuts.KeyEvent) { shortcutId := ev.Shortcut.GetId() logger.Debugf("shortcut id: %s, type: %v, action: %#v", shortcutId, ev.Shortcut.GetType(), action) + if ev.Shortcut.GetType() == shortcuts.ShortcutTypeSystem && m.DisabledSystemShortcutsList.Contains(shortcutId) { + logger.Warningf("shortcut id: %s is disabled", shortcutId) + return + } if action == nil { logger.Warning("action is nil") return @@ -1170,20 +1229,117 @@ func (m *Manager) execCmd(cmd string, viaStartdde bool) error { return exec.Command("/bin/sh", "-c", cmd).Run() } - logger.Debug("startdde run cmd:", cmd) - return m.startManager.RunCommand(0, "/bin/sh", []string{"-c", cmd}) + logger.Debug("exec run cmd:", cmd) + + if m.useNewAppManager { + desktopExt := ".desktop" + sha256Hasher := sha256.New() + _, err := sha256Hasher.Write([]byte(cmd)) + if err != nil { + logger.Warning("generate sha256 hash failed with error: ", err) + return err + } + desktopPre := sha256Hasher.Sum(nil) + name := hex.EncodeToString(desktopPre) + desktopFileName := "daemon-keybinding-" + name + desktopExt + + _, err = os.Stat(basedir.GetUserDataDir() + "/applications/" + desktopFileName) + // 如果对应命令的desktop文件不存在,需要新建desktop文件 + if os.IsNotExist(err) { + desktopInfoMap := map[string]dbus.Variant{ + KeyExec: dbus.MakeVariant(map[string]string{ + "default": cmd, + }), + KeyIcon: dbus.MakeVariant(map[string]string{ + "default-icon": "", + }), + KeyMimeType: dbus.MakeVariant([]string{""}), + KeyName: dbus.MakeVariant(map[string]string{ + "default": name, + }), + KeyTerminal: dbus.MakeVariant(false), + KeyType: dbus.MakeVariant("Application"), + KeyVersion: dbus.MakeVariant(1), + KeyNoDisplay: dbus.MakeVariant(true), + } + + appManager := newAppmanager.NewManager(m.sessionSigLoop.Conn()) + err := appManager.ReloadApplications(0) + if err != nil { + logger.Warning("reload applications error: ", err) + } + + desktopFileName, err = appManager.AddUserApplication(0, desktopInfoMap, desktopFileName) + if err != nil { + logger.Warning("adding user application error: ", err) + return err + } + } + + obj, err := desktopappinfo.GetDBusObjectFromAppDesktop(desktopFileName, appManagerDBusServiceName, appManagerDBusPath) + if err != nil { + logger.Warning("get dbus object error:", err) + return err + } + + appManagerAppObj, err := newAppmanager.NewApplication(m.sessionSigLoop.Conn(), obj) + if err != nil { + return err + } + + _, err = appManagerAppObj.Launch(0, "", []string{}, make(map[string]dbus.Variant)) + + if err != nil { + logger.Warningf("launch keybinding cmd %s error: %v", cmd, err) + return err + } + } else { + err := m.appManager.RunCommand(0, "/bin/sh", []string{"-c", cmd}) + if err != nil { + logger.Warningf("launch keybinding cmd %s error: %v", cmd, err) + return err + } + } + + return nil } func (m *Manager) handleCheckCamera() error { cmd := "deepin-camera" + viaStartdde := true if checkProRunning(cmd) { cmd = "killall deepin-camera" + viaStartdde = false } - return m.startManager.RunCommand(0, "/bin/sh", []string{"-c", cmd}) + return m.execCmd(cmd, viaStartdde) } func (m *Manager) runDesktopFile(desktop string) error { - return m.startManager.LaunchApp(0, desktop, 0, []string{}) + if m.useNewAppManager { + obj, err := desktopappinfo.GetDBusObjectFromAppDesktop(desktop, appManagerDBusServiceName, appManagerDBusPath) + if err != nil { + logger.Warning("get dbus object error: ", err) + return err + } + + appManagerAppObj, err := newAppmanager.NewApplication(m.sessionSigLoop.Conn(), obj) + if err != nil { + return err + } + + _, err = appManagerAppObj.Launch(0, "", []string{}, make(map[string]dbus.Variant)) + if err != nil { + logger.Warning("failed to launch application", desktop) + return err + } + } else { + err := m.appManager.LaunchApp(0, desktop, 0, []string{}) + if err != nil { + logger.Warning("failed to launch application", desktop) + } + } + + return nil } func (m *Manager) eliminateKeystrokeConflict() { diff --git a/keybinding/manager_handlers.go b/keybinding1/manager_handlers.go similarity index 98% rename from keybinding/manager_handlers.go rename to keybinding1/manager_handlers.go index e646d52fc..3b2212b50 100644 --- a/keybinding/manager_handlers.go +++ b/keybinding1/manager_handlers.go @@ -8,7 +8,7 @@ import ( "fmt" "time" - . "github.com/linuxdeepin/dde-daemon/keybinding/shortcuts" + . "github.com/linuxdeepin/dde-daemon/keybinding1/shortcuts" ) func (m *Manager) shouldShowCapsLockOSD() bool { diff --git a/keybinding/manager_ifc.go b/keybinding1/manager_ifc.go similarity index 94% rename from keybinding/manager_ifc.go rename to keybinding1/manager_ifc.go index 48f0618f9..3c1d828d5 100644 --- a/keybinding/manager_ifc.go +++ b/keybinding1/manager_ifc.go @@ -10,18 +10,18 @@ import ( "strings" "time" - "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/keybinding/shortcuts" - "github.com/linuxdeepin/dde-daemon/keybinding/util" - wm "github.com/linuxdeepin/go-dbus-factory/com.deepin.wm" + "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/keybinding1/shortcuts" + "github.com/linuxdeepin/dde-daemon/keybinding1/util" + wm "github.com/linuxdeepin/go-dbus-factory/session/com.deepin.wm" "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil" ) const ( - dbusServiceName = "com.deepin.daemon.Keybinding" - dbusPath = "/com/deepin/daemon/Keybinding" - dbusInterface = "com.deepin.daemon.Keybinding" + dbusServiceName = "org.deepin.dde.Keybinding1" + dbusPath = "/org/deepin/dde/Keybinding1" + dbusInterface = "org.deepin.dde.Keybinding1" ) type ErrInvalidShortcutType struct { @@ -50,7 +50,7 @@ func (*Manager) GetInterfaceName() string { return dbusInterface } -//true : ignore +// true : ignore func (m *Manager) isIgnoreRepeat(name string) bool { const minKeyEventInterval = 200 * time.Millisecond now := time.Now() @@ -184,6 +184,18 @@ func (m *Manager) ListAllShortcuts() (shortcuts string, busErr *dbus.Error) { return ret, nil } +func (m *Manager) EnableSystemShortcut(shortcuts []string, enabled bool, isPersistent bool) *dbus.Error { + for _, shortcut := range shortcuts { + if enabled { + m.DisabledSystemShortcutsList, _ = m.DisabledSystemShortcutsList.Delete(shortcut) + } else { + m.DisabledSystemShortcutsList, _ = m.DisabledSystemShortcutsList.Add(shortcut) + } + } + logger.Debug("DisabledSystemShortcutsList:", m.DisabledSystemShortcutsList) + return nil +} + func (m *Manager) ListShortcutsByType(type0 int32) (shortcuts string, busErr *dbus.Error) { list := m.shortcutManager.ListByType(type0) ret, err := util.MarshalJSON(list) @@ -339,6 +351,7 @@ func (m *Manager) processWaylandCustomShortcut(id, cmd, keystroke string) *dbus. m.shortcutManager.WaylandCustomShortCutMap[wlname] = cmd return nil } + // ModifyCustomShortcut modify custom shortcut // // id: shortcut id diff --git a/keybinding/manager_ifc_deprecated.go b/keybinding1/manager_ifc_deprecated.go similarity index 96% rename from keybinding/manager_ifc_deprecated.go rename to keybinding1/manager_ifc_deprecated.go index b15847fba..92c732434 100644 --- a/keybinding/manager_ifc_deprecated.go +++ b/keybinding1/manager_ifc_deprecated.go @@ -5,9 +5,9 @@ package keybinding import ( - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/keybinding1/shortcuts" "github.com/linuxdeepin/go-lib/dbusutil" - "github.com/linuxdeepin/dde-daemon/keybinding/shortcuts" ) // List list all shortcut diff --git a/keybinding/media_player_controller.go b/keybinding1/media_player_controller.go similarity index 91% rename from keybinding/media_player_controller.go rename to keybinding1/media_player_controller.go index 1f5431ba2..84793f48a 100644 --- a/keybinding/media_player_controller.go +++ b/keybinding1/media_player_controller.go @@ -8,13 +8,13 @@ import ( "errors" "strings" - dbus "github.com/godbus/dbus" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" - mpris2 "github.com/linuxdeepin/go-dbus-factory/org.mpris.mediaplayer2" + dbus "github.com/godbus/dbus/v5" + . "github.com/linuxdeepin/dde-daemon/keybinding1/shortcuts" + ofdbus "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.dbus" + mpris2 "github.com/linuxdeepin/go-dbus-factory/session/org.mpris.mediaplayer2" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/proxy" - . "github.com/linuxdeepin/dde-daemon/keybinding/shortcuts" ) const ( diff --git a/keybinding/select_keystroke.go b/keybinding1/select_keystroke.go similarity index 97% rename from keybinding/select_keystroke.go rename to keybinding1/select_keystroke.go index b4c202f49..bc41d7d48 100644 --- a/keybinding/select_keystroke.go +++ b/keybinding1/select_keystroke.go @@ -5,10 +5,10 @@ package keybinding import ( + "github.com/linuxdeepin/dde-daemon/keybinding1/shortcuts" x "github.com/linuxdeepin/go-x11-client" "github.com/linuxdeepin/go-x11-client/util/keybind" "github.com/linuxdeepin/go-x11-client/util/mousebind" - "github.com/linuxdeepin/dde-daemon/keybinding/shortcuts" ) func (m *Manager) selectKeystroke() error { diff --git a/keybinding/shortcuts/action.go b/keybinding1/shortcuts/action.go similarity index 100% rename from keybinding/shortcuts/action.go rename to keybinding1/shortcuts/action.go diff --git a/keybinding/shortcuts/custom_shortcut.go b/keybinding1/shortcuts/custom_shortcut.go similarity index 96% rename from keybinding/shortcuts/custom_shortcut.go rename to keybinding1/shortcuts/custom_shortcut.go index 53ef0d33a..ab91e77b4 100644 --- a/keybinding/shortcuts/custom_shortcut.go +++ b/keybinding1/shortcuts/custom_shortcut.go @@ -9,8 +9,8 @@ import ( "path/filepath" "strings" - "github.com/linuxdeepin/dde-daemon/keybinding/util" - wm "github.com/linuxdeepin/go-dbus-factory/com.deepin.wm" + "github.com/linuxdeepin/dde-daemon/keybinding1/util" + wm "github.com/linuxdeepin/go-dbus-factory/session/com.deepin.wm" "github.com/linuxdeepin/go-lib/keyfile" ) @@ -109,8 +109,8 @@ func newCustomShort(id, name, cmd string, keystrokes []string, wm wm.Wm, csm *Cu Keystrokes: ParseKeystrokes(keystrokes), }, manager: csm, - wm: wm, - Cmd: cmd, + wm: wm, + Cmd: cmd, } } diff --git a/keybinding/shortcuts/gsettings_shortcut.go b/keybinding1/shortcuts/gsettings_shortcut.go similarity index 96% rename from keybinding/shortcuts/gsettings_shortcut.go rename to keybinding1/shortcuts/gsettings_shortcut.go index fe5672454..3d8f9f4ac 100644 --- a/keybinding/shortcuts/gsettings_shortcut.go +++ b/keybinding1/shortcuts/gsettings_shortcut.go @@ -5,7 +5,7 @@ package shortcuts import ( - wm "github.com/linuxdeepin/go-dbus-factory/com.deepin.wm" + wm "github.com/linuxdeepin/go-dbus-factory/session/com.deepin.wm" "github.com/linuxdeepin/go-gir/gio-2.0" ) diff --git a/keybinding/shortcuts/id_name_map.go b/keybinding1/shortcuts/id_name_map.go similarity index 70% rename from keybinding/shortcuts/id_name_map.go rename to keybinding1/shortcuts/id_name_map.go index 3cdf9d823..86829f73e 100644 --- a/keybinding/shortcuts/id_name_map.go +++ b/keybinding1/shortcuts/id_name_map.go @@ -149,60 +149,60 @@ func getWMIdNameMap() map[string]string { func getMediaIdNameMap() map[string]string { var idNameMap = map[string]string{ - "messenger": "Messenger", // XF86Messenger - "save": "Save", // XF86Save - "new": "New", // XF86New - "wake-up": "WakeUp", // XF86WakeUp - "audio-rewind": "AudioRewind", // XF86AudioRewind - "audio-mute": "AudioMute", // XF86AudioMute - "mon-brightness-up": "MonBrightnessUp", // XF86MonBrightnessUp - "wlan": "WLAN", // XF86WLAN - "audio-media": "AudioMedia", // XF86AudioMedia - "reply": "Reply", // XF86Reply - "favorites": "Favorites", // XF86Favorites - "audio-play": "AudioPlay", // XF86AudioPlay - "audio-mic-mute": "AudioMicMute", // XF86AudioMicMute - "audio-pause": "AudioPause", // XF86AudioPause - "audio-stop": "AudioStop", // XF86AudioStop - "documents": "Documents", // XF86Documents - "game": "Game", // XF86Game - "search": "Search", // XF86Search - "audio-record": "AudioRecord", // XF86AudioRecord - "display": "Display", // XF86Display - "reload": "Reload", // XF86Reload - "explorer": "Explorer", // XF86Explorer - "calculator": "Calculator", // XF86Calculator - "calendar": "Calendar", // XF86Calendar - "forward": "Forward", // XF86Forward - "cut": "Cut", // XF86Cut - "mon-brightness-down": "MonBrightnessDown", // XF86MonBrightnessDown - "copy": "Copy", // XF86Copy - "tools": "Tools", // XF86Tools - "audio-raise-volume": "AudioRaiseVolume", // XF86AudioRaiseVolume - "media-close": "media-Close", // XF86Close - "www": "WWW", // XF86WWW - "home-page": "HomePage", // XF86HomePage - "sleep": "Sleep", // XF86Sleep - "audio-lower-volume": "AudioLowerVolume", // XF86AudioLowerVolume - "audio-prev": "AudioPrev", // XF86AudioPrev - "audio-next": "AudioNext", // XF86AudioNext - "paste": "Paste", // XF86Paste - "open": "Open", // XF86Open - "send": "Send", // XF86Send - "my-computer": "MyComputer", // XF86MyComputer - "mail": "Mail", // XF86Mail - "adjust-brightness": "BrightnessAdjust", // XF86BrightnessAdjust - "log-off": "LogOff", // XF86LogOff - "pictures": "Pictures", // XF86Pictures - "terminal": "Terminal", // XF86Terminal - "video": "Video", // XF86Video - "music": "Music", // XF86Music - "app-left": "ApplicationLeft", // XF86ApplicationLeft - "app-right": "ApplicationRight", // XF86ApplicationRight - "meeting": "Meeting", // XF86Meeting - "touchpad-toggle": "ToggleTouchpad", // XF86TouchpadToggle - "away": "Away", // XF86Away - "web-cam": "Camera", // XF86WebCam + "messenger": "Messenger", // XF86Messenger + "save": "Save", // XF86Save + "new": "New", // XF86New + "wake-up": "WakeUp", // XF86WakeUp + "audio-rewind": "AudioRewind", // XF86AudioRewind + "audio-mute": "AudioMute", // XF86AudioMute + "mon-brightness-up": "MonBrightnessUp", // XF86MonBrightnessUp + "wlan": "WLAN", // XF86WLAN + "audio-media": "AudioMedia", // XF86AudioMedia + "reply": "Reply", // XF86Reply + "favorites": "Favorites", // XF86Favorites + "audio-play": "AudioPlay", // XF86AudioPlay + "audio-mic-mute": "AudioMicMute", // XF86AudioMicMute + "audio-pause": "AudioPause", // XF86AudioPause + "audio-stop": "AudioStop", // XF86AudioStop + "documents": "Documents", // XF86Documents + "game": "Game", // XF86Game + "search": "Search", // XF86Search + "audio-record": "AudioRecord", // XF86AudioRecord + "display": "Display", // XF86Display + "reload": "Reload", // XF86Reload + "explorer": "Explorer", // XF86Explorer + "calculator": "Calculator", // XF86Calculator + "calendar": "Calendar", // XF86Calendar + "forward": "Forward", // XF86Forward + "cut": "Cut", // XF86Cut + "mon-brightness-down": "MonBrightnessDown", // XF86MonBrightnessDown + "copy": "Copy", // XF86Copy + "tools": "Tools", // XF86Tools + "audio-raise-volume": "AudioRaiseVolume", // XF86AudioRaiseVolume + "media-close": "media-Close", // XF86Close + "www": "WWW", // XF86WWW + "home-page": "HomePage", // XF86HomePage + "sleep": "Sleep", // XF86Sleep + "audio-lower-volume": "AudioLowerVolume", // XF86AudioLowerVolume + "audio-prev": "AudioPrev", // XF86AudioPrev + "audio-next": "AudioNext", // XF86AudioNext + "paste": "Paste", // XF86Paste + "open": "Open", // XF86Open + "send": "Send", // XF86Send + "my-computer": "MyComputer", // XF86MyComputer + "mail": "Mail", // XF86Mail + "adjust-brightness": "BrightnessAdjust", // XF86BrightnessAdjust + "log-off": "LogOff", // XF86LogOff + "pictures": "Pictures", // XF86Pictures + "terminal": "Terminal", // XF86Terminal + "video": "Video", // XF86Video + "music": "Music", // XF86Music + "app-left": "ApplicationLeft", // XF86ApplicationLeft + "app-right": "ApplicationRight", // XF86ApplicationRight + "meeting": "Meeting", // XF86Meeting + "touchpad-toggle": "ToggleTouchpad", // XF86TouchpadToggle + "away": "Away", // XF86Away + "web-cam": "Camera", // XF86WebCam } return idNameMap } diff --git a/keybinding/shortcuts/key.go b/keybinding1/shortcuts/key.go similarity index 100% rename from keybinding/shortcuts/key.go rename to keybinding1/shortcuts/key.go diff --git a/keybinding/shortcuts/keystroke.go b/keybinding1/shortcuts/keystroke.go similarity index 100% rename from keybinding/shortcuts/keystroke.go rename to keybinding1/shortcuts/keystroke.go diff --git a/keybinding/shortcuts/keystroke_test.go b/keybinding1/shortcuts/keystroke_test.go similarity index 100% rename from keybinding/shortcuts/keystroke_test.go rename to keybinding1/shortcuts/keystroke_test.go diff --git a/keybinding/shortcuts/kwin_shortcut.go b/keybinding1/shortcuts/kwin_shortcut.go similarity index 93% rename from keybinding/shortcuts/kwin_shortcut.go rename to keybinding1/shortcuts/kwin_shortcut.go index c1ed9ffd6..4fa1d61c1 100644 --- a/keybinding/shortcuts/kwin_shortcut.go +++ b/keybinding1/shortcuts/kwin_shortcut.go @@ -9,8 +9,8 @@ import ( "os" "strings" - wm "github.com/linuxdeepin/go-dbus-factory/com.deepin.wm" - "github.com/linuxdeepin/dde-daemon/keybinding/util" + "github.com/linuxdeepin/dde-daemon/keybinding1/util" + wm "github.com/linuxdeepin/go-dbus-factory/session/com.deepin.wm" ) type kWinShortcut struct { diff --git a/keybinding/shortcuts/media_shortcut.go b/keybinding1/shortcuts/media_shortcut.go similarity index 96% rename from keybinding/shortcuts/media_shortcut.go rename to keybinding1/shortcuts/media_shortcut.go index 5d611df8c..56e28d18a 100644 --- a/keybinding/shortcuts/media_shortcut.go +++ b/keybinding1/shortcuts/media_shortcut.go @@ -5,7 +5,7 @@ package shortcuts import ( - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" ) type MediaShortcut struct { @@ -30,7 +30,7 @@ const ( cmdMeeting = "deepin-contacts" cmdTerminal = "/usr/lib/deepin-daemon/default-terminal" cmdMessenger = "dbus-send --print-reply --dest=com.deepin.dde.osd /com/deepin/dde/Notification com.deepin.dde.Notification.Toggle" - cmdLauncher = "dbus-send --print-reply --dest=com.deepin.dde.Launcher /com/deepin/dde/Launcher com.deepin.dde.Launcher.Toggle" + cmdLauncher = "dbus-send --print-reply --dest=org.deepin.dde.Launcher1 /org/deepin/dde/Launcher1 org.deepin.dde.Launcher1.Toggle" cmdCamera = "/usr/share/dde-daemon/keybinding/cameraSwitch.sh" ) diff --git a/keybinding/shortcuts/shortcut.go b/keybinding1/shortcuts/shortcut.go similarity index 98% rename from keybinding/shortcuts/shortcut.go rename to keybinding1/shortcuts/shortcut.go index 23fedd1e5..972982cdf 100644 --- a/keybinding/shortcuts/shortcut.go +++ b/keybinding1/shortcuts/shortcut.go @@ -10,7 +10,7 @@ import ( "strconv" "sync" - "github.com/linuxdeepin/dde-daemon/keybinding/util" + "github.com/linuxdeepin/dde-daemon/keybinding1/util" "github.com/linuxdeepin/go-lib/pinyin_search" ) diff --git a/keybinding/shortcuts/shortcut_manager.go b/keybinding1/shortcuts/shortcut_manager.go similarity index 98% rename from keybinding/shortcuts/shortcut_manager.go rename to keybinding1/shortcuts/shortcut_manager.go index 0978dd14a..fe1f8e70b 100644 --- a/keybinding/shortcuts/shortcut_manager.go +++ b/keybinding1/shortcuts/shortcut_manager.go @@ -14,10 +14,10 @@ import ( "time" "unicode" - "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/keybinding/util" - daemon "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.daemon" - wm "github.com/linuxdeepin/go-dbus-factory/com.deepin.wm" + "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/keybinding1/util" + wm "github.com/linuxdeepin/go-dbus-factory/session/com.deepin.wm" + daemon "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.daemon1" gio "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/gettext" "github.com/linuxdeepin/go-lib/keyfile" @@ -702,8 +702,8 @@ func (sm *ShortcutManager) SetAllModKeysReleasedCallback(cb func()) { sm.xRecordEventHandler.allModKeysReleasedCb = cb } -//get Active Window pid -//注意: 从D-BUS启动dde-system-daemon的时候x会取不到环境变量,只能把获取pid放到dde-session-daemon +// get Active Window pid +// 注意: 从D-BUS启动dde-system-daemon的时候x会取不到环境变量,只能把获取pid放到dde-session-daemon func (sm *ShortcutManager) getActiveWindowPid() (uint32, error) { activeWin, err := ewmh.GetActiveWindow(sm.conn).Reply(sm.conn) if err != nil { @@ -730,7 +730,7 @@ func (sm *ShortcutManager) isPidVirtualMachine(pid uint32) (bool, error) { return ret, nil } -//初始化go-dbus-factory system DBUS : com.deepin.daemon.Daemon +// 初始化go-dbus-factory system DBUS : org.deepin.dde.Daemon1 func (sm *ShortcutManager) initSysDaemon() error { sysBus, err := dbus.SystemBus() if err != nil { @@ -786,7 +786,7 @@ func (sm *ShortcutManager) handleXRecordKeyEvent(pressed bool, code uint8, state // 显示桌面快捷键是窗管控制,此处需要隐藏启动器 if shortcut != nil && shortcut.GetType() == ShortcutTypeWM && shortcut.GetId() == "show-desktop" { go func() { - cmd := "dbus-send --print-reply --dest=com.deepin.dde.Launcher /com/deepin/dde/Launcher com.deepin.dde.Launcher.Hide" + cmd := "dbus-send --print-reply --dest=org.deepin.dde.Launcher1 /org/deepin/dde/Launcher1 org.deepin.dde.Launcher1.Hide" err := exec.Command("/bin/sh", "-c", cmd).Run() if err != nil { logger.Warning(err) diff --git a/keybinding/shortcuts/shortcut_manager_test.go b/keybinding1/shortcuts/shortcut_manager_test.go similarity index 100% rename from keybinding/shortcuts/shortcut_manager_test.go rename to keybinding1/shortcuts/shortcut_manager_test.go diff --git a/keybinding/shortcuts/system_shortcut.go b/keybinding1/shortcuts/system_shortcut.go similarity index 87% rename from keybinding/shortcuts/system_shortcut.go rename to keybinding1/shortcuts/system_shortcut.go index d80ace4a1..87f807861 100644 --- a/keybinding/shortcuts/system_shortcut.go +++ b/keybinding1/shortcuts/system_shortcut.go @@ -82,12 +82,12 @@ func getSystemActionCmd(id string) string { // key is id, value is commandline. var defaultSysActionCmdMap = map[string]string{ - "launcher": "dbus-send --print-reply --dest=com.deepin.dde.Launcher /com/deepin/dde/Launcher com.deepin.dde.Launcher.Toggle", + "launcher": "dbus-send --print-reply --dest=org.deepin.dde.Launcher1 /org/deepin/dde/Launcher1 org.deepin.dde.Launcher1.Toggle", "terminal": "/usr/lib/deepin-daemon/default-terminal", "terminal-quake": "deepin-terminal --quake-mode", - "lock-screen": "originmap=$(setxkbmap -query | grep option | awk -F ' ' '{print $2}');/usr/bin/setxkbmap -option grab:break_actions&&/usr/bin/xdotool key XF86Ungrab&&dbus-send --print-reply --dest=com.deepin.dde.lockFront /com/deepin/dde/lockFront com.deepin.dde.lockFront.Show&&/usr/bin/setxkbmap -option $originmap", + "lock-screen": "originmap=$(setxkbmap -query | grep option | awk -F ' ' '{print $2}');/usr/bin/setxkbmap -option grab:break_actions&&/usr/bin/xdotool key XF86Ungrab&&dbus-send --print-reply --dest=org.deepin.dde.LockFront1 /org/deepin/dde/LockFront1 org.deepin.dde.LockFront1.Show&&/usr/bin/setxkbmap -option $originmap", //wayland不能设置XF86Ungrab,否则会导致Bug-224309 - "lock-screen-wayland": "originmap=$(setxkbmap -query | grep option | awk -F ' ' '{print $2}');/usr/bin/setxkbmap -option grab:break_actions&&dbus-send --print-reply --dest=com.deepin.dde.lockFront /com/deepin/dde/lockFront com.deepin.dde.lockFront.Show&&/usr/bin/setxkbmap -option $originmap", + "lock-screen-wayland": "originmap=$(setxkbmap -query | grep option | awk -F ' ' '{print $2}');/usr/bin/setxkbmap -option grab:break_actions&&dbus-send --print-reply --dest=org.deepin.dde.LockFront1 /org/deepin/dde/LockFront1 org.deepin.dde.LockFront1.Show&&/usr/bin/setxkbmap -option $originmap", "logout": "dbus-send --print-reply --dest=com.deepin.dde.shutdownFront /com/deepin/dde/shutdownFront com.deepin.dde.shutdownFront.Show", "deepin-screen-recorder": "dbus-send --print-reply --dest=com.deepin.ScreenRecorder /com/deepin/ScreenRecorder com.deepin.ScreenRecorder.stopRecord", "system-monitor": "/usr/bin/deepin-system-monitor", @@ -104,9 +104,9 @@ var defaultSysActionCmdMap = map[string]string{ "wm-switcher": "dbus-send --type=method_call --dest=com.deepin.WMSwitcher /com/deepin/WMSwitcher com.deepin.WMSwitcher.RequestSwitchWM", "turn-off-screen": "sleep 0.5; xset dpms force off", "notification-center": "dbus-send --print-reply --dest=com.deepin.dde.osd /org/freedesktop/Notifications com.deepin.dde.Notification.Toggle", - "clipboard": "dbus-send --print-reply --dest=com.deepin.dde.Clipboard /com/deepin/dde/Clipboard com.deepin.dde.Clipboard.Toggle; dbus-send --print-reply --dest=com.deepin.dde.Launcher /com/deepin/dde/Launcher com.deepin.dde.Launcher.Hide", + "clipboard": "dbus-send --print-reply --dest=com.deepin.dde.Clipboard /com/deepin/dde/Clipboard com.deepin.dde.Clipboard.Toggle; dbus-send --print-reply --dest=org.deepin.dde.Launcher1 /org/deepin/dde/Launcher1 org.deepin.dde.Launcher1.Hide", "global-search": "/usr/libexec/dde-daemon/keybinding/shortcut-dde-grand-search.sh", - "switch-next-kbd-layout": "dbus-send --print-reply --dest=com.deepin.daemon.Keybinding /com/deepin/daemon/InputDevice/Keyboard com.deepin.daemon.InputDevice.Keyboard.ToggleNextLayout", + "switch-next-kbd-layout": "dbus-send --print-reply --dest=org.deepin.dde.Keybinding1 /org/deepin/dde/InputDevice1/Keyboard org.deepin.dde.InputDevice1.Keyboard.ToggleNextLayout", "switch-monitors": "dbus-send --print-reply --dest=com.deepin.dde.osd / com.deepin.dde.osd.ShowOSD string:SwitchMonitors", // cmd "calculator": "/usr/bin/deepin-calculator", diff --git a/keybinding/shortcuts/xrecord_event_handler.go b/keybinding1/shortcuts/xrecord_event_handler.go similarity index 100% rename from keybinding/shortcuts/xrecord_event_handler.go rename to keybinding1/shortcuts/xrecord_event_handler.go diff --git a/keybinding/shortcuts/xrecord_event_handler_test.go b/keybinding1/shortcuts/xrecord_event_handler_test.go similarity index 100% rename from keybinding/shortcuts/xrecord_event_handler_test.go rename to keybinding1/shortcuts/xrecord_event_handler_test.go diff --git a/keybinding/special_keycode.go b/keybinding1/special_keycode.go similarity index 91% rename from keybinding/special_keycode.go rename to keybinding1/special_keycode.go index 7af89d0b8..cb1768f5a 100644 --- a/keybinding/special_keycode.go +++ b/keybinding1/special_keycode.go @@ -10,10 +10,8 @@ import ( "strings" "time" - "github.com/godbus/dbus" - launcher "github.com/linuxdeepin/go-dbus-factory/com.deepin.dde.daemon.launcher" - sessionmanager "github.com/linuxdeepin/go-dbus-factory/com.deepin.sessionmanager" - power "github.com/linuxdeepin/go-dbus-factory/com.deepin.system.power" + "github.com/godbus/dbus/v5" + power "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.power1" ) // 按键码 @@ -123,8 +121,10 @@ func (m *Manager) initSpecialKeycodeMap() { m.specialKeycodeBindingList[key] = m.handleScreenshot // 打开设备管理器 - key = createSpecialKeycodeIndex(KEY_UNKNOWN, false, MODIFY_NONE) - m.specialKeycodeBindingList[key] = m.handleOpenDeviceManager + if m.deviceManagerControlEnable { + key = createSpecialKeycodeIndex(KEY_UNKNOWN, false, MODIFY_NONE) + m.specialKeycodeBindingList[key] = m.handleOpenDeviceManager + } } // 处理函数的总入口 @@ -360,9 +360,9 @@ func (m *Manager) handlePower() { } m.systemTurnOffScreen() case powerActionShowUI: - cmd := "originmap=$(setxkbmap -query | grep option | awk -F ' ' '{print $2}');/usr/bin/setxkbmap -option grab:break_actions&&/usr/bin/xdotool key XF86Ungrab&&dbus-send --print-reply --dest=com.deepin.dde.lockFront /com/deepin/dde/shutdownFront com.deepin.dde.shutdownFront.Show&&/usr/bin/setxkbmap -option $originmap" + cmd := "originmap=$(setxkbmap -query | grep option | awk -F ' ' '{print $2}');/usr/bin/setxkbmap -option grab:break_actions&&/usr/bin/xdotool key XF86Ungrab&&dbus-send --print-reply --dest=org.deepin.dde.LockFront1 /com/deepin/dde/shutdownFront com.deepin.dde.shutdownFront.Show&&/usr/bin/setxkbmap -option $originmap" if _useWayland { - cmd = "originmap=$(setxkbmap -query | grep option | awk -F ' ' '{print $2}');/usr/bin/setxkbmap -option grab:break_actions&&dbus-send --print-reply --dest=com.deepin.dde.lockFront /com/deepin/dde/shutdownFront com.deepin.dde.shutdownFront.Show&&/usr/bin/setxkbmap -option $originmap" + cmd = "originmap=$(setxkbmap -query | grep option | awk -F ' ' '{print $2}');/usr/bin/setxkbmap -option grab:break_actions&&dbus-send --print-reply --dest=org.deepin.dde.LockFront1 /com/deepin/dde/shutdownFront com.deepin.dde.shutdownFront.Show&&/usr/bin/setxkbmap -option $originmap" } go func() { locked, err := m.sessionManager.Locked().Get(0) @@ -472,14 +472,7 @@ func (m *Manager) handleOpenDeviceManager() { return } - launcher := launcher.NewLauncher(m.service.Conn()) - info, err := launcher.GetItemInfo(0, "deepin-devicemanager") - if err != nil { - logger.Warning(err) - return - } - sessionmanager := sessionmanager.NewStartManager(m.service.Conn()) - _, err = sessionmanager.Launch(0, info.Path) + err := m.execCmd("deepin-devicemanager", true) if err != nil { logger.Warning(err) } diff --git a/keybinding/testdata/hotkey b/keybinding1/testdata/hotkey similarity index 100% rename from keybinding/testdata/hotkey rename to keybinding1/testdata/hotkey diff --git a/keybinding/testdata/hotkey_disable b/keybinding1/testdata/hotkey_disable similarity index 100% rename from keybinding/testdata/hotkey_disable rename to keybinding1/testdata/hotkey_disable diff --git a/keybinding/touchpad_controller.go b/keybinding1/touchpad_controller.go similarity index 89% rename from keybinding/touchpad_controller.go rename to keybinding1/touchpad_controller.go index c899b087a..e9df68ac5 100644 --- a/keybinding/touchpad_controller.go +++ b/keybinding1/touchpad_controller.go @@ -5,9 +5,9 @@ package keybinding import ( - "github.com/godbus/dbus" - inputdevices "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.inputdevices" - . "github.com/linuxdeepin/dde-daemon/keybinding/shortcuts" + "github.com/godbus/dbus/v5" + . "github.com/linuxdeepin/dde-daemon/keybinding1/shortcuts" + inputdevices "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.inputdevices1" ) type TouchPadController struct { diff --git a/keybinding/util/util.go b/keybinding1/util/util.go similarity index 95% rename from keybinding/util/util.go rename to keybinding1/util/util.go index 081018feb..714fb1b05 100644 --- a/keybinding/util/util.go +++ b/keybinding1/util/util.go @@ -7,10 +7,10 @@ package util import ( "bytes" "encoding/json" - "strings" "os" + "strings" - wm "github.com/linuxdeepin/go-dbus-factory/com.deepin.wm" + wm "github.com/linuxdeepin/go-dbus-factory/session/com.deepin.wm" ) func MarshalJSON(v interface{}) (string, error) { diff --git a/keybinding/utils.go b/keybinding1/utils.go similarity index 95% rename from keybinding/utils.go rename to keybinding1/utils.go index 07ea57da3..8d7f8af53 100644 --- a/keybinding/utils.go +++ b/keybinding1/utils.go @@ -15,9 +15,9 @@ import ( "strings" "time" - dbus "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/keybinding/util" - wm "github.com/linuxdeepin/go-dbus-factory/com.deepin.wm" + dbus "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/keybinding1/util" + wm "github.com/linuxdeepin/go-dbus-factory/session/com.deepin.wm" gio "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/strv" "github.com/linuxdeepin/go-x11-client/ext/dpms" @@ -404,8 +404,8 @@ func (m *Manager) doLock(autoStartAuth bool) { func doPrepareSuspend() { sessionDBus, _ := dbus.SessionBus() - obj := sessionDBus.Object("com.deepin.daemon.Power", "/com/deepin/daemon/Power") - err := obj.Call("com.deepin.daemon.Power.SetPrepareSuspend", 0, suspendStateButtonClick).Err + obj := sessionDBus.Object("org.deepin.dde.Power1", "/org/deepin/dde/Power1") + err := obj.Call("org.deepin.dde.Power1.SetPrepareSuspend", 0, suspendStateButtonClick).Err if err != nil { logger.Warning(err) } @@ -413,8 +413,8 @@ func doPrepareSuspend() { func undoPrepareSuspend() { sessionDBus, _ := dbus.SessionBus() - obj := sessionDBus.Object("com.deepin.daemon.Power", "/com/deepin/daemon/Power") - err := obj.Call("com.deepin.daemon.Power.SetPrepareSuspend", 0, suspendStateFinish).Err + obj := sessionDBus.Object("org.deepin.dde.Power1", "/org/deepin/dde/Power1") + err := obj.Call("org.deepin.dde.Power.SetPrepareSuspend", 0, suspendStateFinish).Err if err != nil { logger.Warning(err) } diff --git a/keybinding/utils_test.go b/keybinding1/utils_test.go similarity index 100% rename from keybinding/utils_test.go rename to keybinding1/utils_test.go diff --git a/langselector/exported_methods_auto.go b/langselector1/exported_methods_auto.go similarity index 100% rename from langselector/exported_methods_auto.go rename to langselector1/exported_methods_auto.go diff --git a/langselector/langselector_dbusutil.go b/langselector1/langselector_dbusutil.go similarity index 100% rename from langselector/langselector_dbusutil.go rename to langselector1/langselector_dbusutil.go diff --git a/langselector/locale.go b/langselector1/locale.go similarity index 97% rename from langselector/locale.go rename to langselector1/locale.go index 8b8a96831..7d37e1602 100644 --- a/langselector/locale.go +++ b/langselector1/locale.go @@ -16,22 +16,22 @@ import ( "sync" "time" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" // dbus services: - localehelper "github.com/linuxdeepin/go-dbus-factory/com.deepin.api.localehelper" - libnetwork "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.network" - lastore "github.com/linuxdeepin/go-dbus-factory/com.deepin.lastore" - notifications "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.notifications" + "github.com/linuxdeepin/dde-api/lang_info" + "github.com/linuxdeepin/dde-api/language_support" + "github.com/linuxdeepin/dde-api/userenv" + ddbus "github.com/linuxdeepin/dde-daemon/dbus" + libnetwork "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.network1" + notifications "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.notifications" + localehelper "github.com/linuxdeepin/go-dbus-factory/system/com.deepin.api.localehelper" + lastore "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.lastore1" "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil" . "github.com/linuxdeepin/go-lib/gettext" "github.com/linuxdeepin/go-lib/gsettings" "github.com/linuxdeepin/go-lib/strv" "github.com/linuxdeepin/go-lib/xdg/basedir" - "github.com/linuxdeepin/dde-api/lang_info" - "github.com/linuxdeepin/dde-api/language_support" - "github.com/linuxdeepin/dde-api/userenv" - ddbus "github.com/linuxdeepin/dde-daemon/dbus" ) const ( diff --git a/langselector/locale_ifc.go b/langselector1/locale_ifc.go similarity index 95% rename from langselector/locale_ifc.go rename to langselector1/locale_ifc.go index e575e5c1e..e8cb15d19 100644 --- a/langselector/locale_ifc.go +++ b/langselector1/locale_ifc.go @@ -8,14 +8,14 @@ import ( "errors" "fmt" - "github.com/godbus/dbus" - "github.com/linuxdeepin/go-lib/dbusutil" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-api/language_support" + "github.com/linuxdeepin/go-lib/dbusutil" ) const ( - dbusPath = "/com/deepin/daemon/LangSelector" - dbusInterface = "com.deepin.daemon.LangSelector" + dbusPath = "/org/deepin/dde/LangSelector1" + dbusInterface = "org.deepin.dde.LangSelector1" localeIconStart = "notification-change-language-start" localeIconFailed = "notification-change-language-failed" diff --git a/langselector/locale_test.go b/langselector1/locale_test.go similarity index 100% rename from langselector/locale_test.go rename to langselector1/locale_test.go diff --git a/langselector/main.go b/langselector1/main.go similarity index 96% rename from langselector/main.go rename to langselector1/main.go index 7554b084f..032df5b17 100644 --- a/langselector/main.go +++ b/langselector1/main.go @@ -15,7 +15,7 @@ import ( ) const ( - dbusServiceName = "com.deepin.daemon.LangSelector" + dbusServiceName = dbusInterface ) var ( diff --git a/langselector/testdata/pam_environment b/langselector1/testdata/pam_environment similarity index 100% rename from langselector/testdata/pam_environment rename to langselector1/testdata/pam_environment diff --git a/langselector/testdata/support_languages.json b/langselector1/testdata/support_languages.json similarity index 100% rename from langselector/testdata/support_languages.json rename to langselector1/testdata/support_languages.json diff --git a/lastore/agent.go b/lastore1/agent.go similarity index 87% rename from lastore/agent.go rename to lastore1/agent.go index 1c9af9504..678c9c8a0 100644 --- a/lastore/agent.go +++ b/lastore1/agent.go @@ -9,10 +9,10 @@ import ( "strings" "sync" - "github.com/godbus/dbus" - kwayland "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.kwayland" - ControlCenter "github.com/linuxdeepin/go-dbus-factory/com.deepin.dde.ControlCenter" - lastore "github.com/linuxdeepin/go-dbus-factory/com.deepin.lastore" + "github.com/godbus/dbus/v5" + ControlCenter "github.com/linuxdeepin/go-dbus-factory/session/com.deepin.dde.ControlCenter" + kwayland "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.kwayland1" + lastore "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.lastore1" "github.com/linuxdeepin/go-lib/dbusutil" ) @@ -22,7 +22,7 @@ const ( sessionAgentPath = "/com/deepin/lastore/agent" ) -// 对应com.deepin.daemon.Network.GetProxy方法的key值 +// 对应org.deepin.dde.Network1.GetProxy方法的key值 const ( proxyTypeHttp = "http" proxyTypeHttps = "https" diff --git a/lastore/agent_ifc.go b/lastore1/agent_ifc.go similarity index 96% rename from lastore/agent_ifc.go rename to lastore1/agent_ifc.go index 185ac50da..7adcb7e4c 100644 --- a/lastore/agent_ifc.go +++ b/lastore1/agent_ifc.go @@ -10,8 +10,8 @@ import ( "os/exec" "strings" - "github.com/godbus/dbus" - kwayland "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.kwayland" + "github.com/godbus/dbus/v5" + kwayland "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.kwayland1" "github.com/linuxdeepin/go-lib/dbusutil" ) @@ -92,7 +92,7 @@ func (a *Agent) SendNotify(sender dbus.Sender, appName string, replacesId uint32 if err != nil { logger.Warning(err) } else { - wInfo, err := kwayland.NewWindow(a.sessionService.Conn(), dbus.ObjectPath(fmt.Sprintf("/com/deepin/daemon/KWayland/PlasmaWindow_%v", winId))) + wInfo, err := kwayland.NewWindow(a.sessionService.Conn(), dbus.ObjectPath(fmt.Sprintf("/org/deepin/dde/KWayland1/PlasmaWindow_%v", winId))) if err != nil { logger.Warning(err) } else { diff --git a/lastore/daemon.go b/lastore1/daemon.go similarity index 94% rename from lastore/daemon.go rename to lastore1/daemon.go index df43fe462..e8dab3ab3 100644 --- a/lastore/daemon.go +++ b/lastore1/daemon.go @@ -9,21 +9,21 @@ import ( "sync" "time" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/loader" - abrecovery "github.com/linuxdeepin/go-dbus-factory/com.deepin.abrecovery" - notifications "github.com/linuxdeepin/go-dbus-factory/com.deepin.dde.notification" - lastore "github.com/linuxdeepin/go-dbus-factory/com.deepin.lastore" ConfigManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" + notifications "github.com/linuxdeepin/go-dbus-factory/session/com.deepin.dde.notification" + abrecovery "github.com/linuxdeepin/go-dbus-factory/system/com.deepin.abrecovery" + lastore "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.lastore1" + ofdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.dbus" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/gettext" "github.com/linuxdeepin/go-lib/log" ) const ( - dbusPath = "/com/deepin/LastoreSessionHelper" - dbusServiceName = "com.deepin.LastoreSessionHelper" + dbusPath = "/org/deepin/dde/LastoreSessionHelper1" + dbusServiceName = "org.deepin.dde.LastoreSessionHelper1" ) const ( diff --git a/lastore/exported_methods_auto.go b/lastore1/exported_methods_auto.go similarity index 100% rename from lastore/exported_methods_auto.go rename to lastore1/exported_methods_auto.go diff --git a/lastore/lastore.go b/lastore1/lastore.go similarity index 84% rename from lastore/lastore.go rename to lastore1/lastore.go index ca0877389..69e4432e4 100644 --- a/lastore/lastore.go +++ b/lastore1/lastore.go @@ -7,12 +7,12 @@ package lastore import ( "sync" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/common/dsync" - eventLog "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.EventLog" - network "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.network" - lastore "github.com/linuxdeepin/go-dbus-factory/com.deepin.lastore" - notifications "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.notifications" + eventLog "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.EventLog1" + network "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.network1" + notifications "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.notifications" + lastore "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.lastore1" "github.com/linuxdeepin/go-lib/dbusutil" ) diff --git a/lastore/sync_config.go b/lastore1/sync_config.go similarity index 98% rename from lastore/sync_config.go rename to lastore1/sync_config.go index f67e801c0..5e17e83a3 100644 --- a/lastore/sync_config.go +++ b/lastore1/sync_config.go @@ -8,7 +8,7 @@ import ( "encoding/json" "errors" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" ) type syncConfig struct { diff --git a/lastore/tools.go b/lastore1/tools.go similarity index 100% rename from lastore/tools.go rename to lastore1/tools.go diff --git a/lastore/tools_test.go b/lastore1/tools_test.go similarity index 100% rename from lastore/tools_test.go rename to lastore1/tools_test.go diff --git a/launcher/manager.go b/launcher/manager.go index a0e3cce1f..8d964c1a2 100644 --- a/launcher/manager.go +++ b/launcher/manager.go @@ -17,17 +17,17 @@ import ( "time" "github.com/fsnotify/fsnotify" - "github.com/godbus/dbus" - libApps "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.apps" - libLastore "github.com/linuxdeepin/go-dbus-factory/com.deepin.lastore" - notifications "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.notifications" + "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/common/dsync" + "github.com/linuxdeepin/dde-daemon/session/common" + notifications "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.notifications" + libApps "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.apps1" + libLastore "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.lastore1" gio "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/gsprop" "github.com/linuxdeepin/go-lib/gettext" "github.com/linuxdeepin/go-lib/strv" - "github.com/linuxdeepin/dde-daemon/common/dsync" - "github.com/linuxdeepin/dde-daemon/session/common" ) //go:generate dbusutil-gen em -type Manager diff --git a/launcher/manager_ifc.go b/launcher/manager_ifc.go index 440aa8e56..15028cea3 100644 --- a/launcher/manager_ifc.go +++ b/launcher/manager_ifc.go @@ -12,11 +12,11 @@ import ( "strings" "sync/atomic" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-api/soundutils" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/keyfile" "github.com/linuxdeepin/go-lib/procfs" - "github.com/linuxdeepin/dde-api/soundutils" ) const ( diff --git a/launcher/manager_uninstall.go b/launcher/manager_uninstall.go index a23c6eb9f..2f4380c82 100644 --- a/launcher/manager_uninstall.go +++ b/launcher/manager_uninstall.go @@ -15,7 +15,7 @@ import ( "regexp" "strings" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/appinfo/desktopappinfo" "github.com/linuxdeepin/go-lib/dbusutil" . "github.com/linuxdeepin/go-lib/gettext" diff --git a/loader/module.go b/loader/module.go index b444562b6..95d2e5d5a 100644 --- a/loader/module.go +++ b/loader/module.go @@ -8,7 +8,7 @@ import ( "fmt" "sync" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" ConfigManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/log" diff --git a/mime/manager.go b/mime/manager.go index 7b6949301..c302fa021 100644 --- a/mime/manager.go +++ b/mime/manager.go @@ -13,7 +13,7 @@ import ( "time" "github.com/fsnotify/fsnotify" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/appinfo/desktopappinfo" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/gsettings" diff --git a/misc/conf/com.deepin.daemon.Daemon.conf b/misc/conf/com.deepin.daemon.Daemon.conf deleted file mode 100644 index 904facc1a..000000000 --- a/misc/conf/com.deepin.daemon.Daemon.conf +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/misc/conf/com.deepin.daemon.Fprintd.conf b/misc/conf/com.deepin.daemon.Fprintd.conf deleted file mode 100644 index a7614b176..000000000 --- a/misc/conf/com.deepin.daemon.Fprintd.conf +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/misc/conf/com.deepin.daemon.SwapSchedHelper.conf b/misc/conf/com.deepin.daemon.SwapSchedHelper.conf deleted file mode 100644 index f574862ad..000000000 --- a/misc/conf/com.deepin.daemon.SwapSchedHelper.conf +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/misc/conf/com.deepin.daemon.Timedated.conf b/misc/conf/com.deepin.daemon.Timedated.conf deleted file mode 100644 index 89fa9f3d8..000000000 --- a/misc/conf/com.deepin.daemon.Timedated.conf +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/misc/conf/com.deepin.daemon.helper.Backlight.conf b/misc/conf/com.deepin.daemon.helper.Backlight.conf deleted file mode 100644 index 18d500e79..000000000 --- a/misc/conf/com.deepin.daemon.helper.Backlight.conf +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/misc/conf/com.deepin.system.Bluetooth.conf b/misc/conf/com.deepin.system.Bluetooth.conf deleted file mode 100644 index 22b55fb3d..000000000 --- a/misc/conf/com.deepin.system.Bluetooth.conf +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/misc/conf/com.deepin.daemon.Greeter.conf b/misc/conf/org.deepin.dde.Accounts1.conf similarity index 59% rename from misc/conf/com.deepin.daemon.Greeter.conf rename to misc/conf/org.deepin.dde.Accounts1.conf index f64244dee..bd11fe50c 100644 --- a/misc/conf/com.deepin.daemon.Greeter.conf +++ b/misc/conf/org.deepin.dde.Accounts1.conf @@ -7,19 +7,19 @@ - + - - + + - - + - diff --git a/misc/conf/com.deepin.system.SystemInfo.conf b/misc/conf/org.deepin.dde.AirplaneMode1.conf similarity index 79% rename from misc/conf/com.deepin.system.SystemInfo.conf rename to misc/conf/org.deepin.dde.AirplaneMode1.conf index 0e228a356..c0825f458 100644 --- a/misc/conf/com.deepin.system.SystemInfo.conf +++ b/misc/conf/org.deepin.dde.AirplaneMode1.conf @@ -7,12 +7,12 @@ - + - + diff --git a/misc/conf/com.deepin.daemon.Apps.conf b/misc/conf/org.deepin.dde.Apps1.conf similarity index 80% rename from misc/conf/com.deepin.daemon.Apps.conf rename to misc/conf/org.deepin.dde.Apps1.conf index 4cba02796..53eb1ccc8 100644 --- a/misc/conf/com.deepin.daemon.Apps.conf +++ b/misc/conf/org.deepin.dde.Apps1.conf @@ -7,12 +7,12 @@ - + - + diff --git a/misc/conf/com.deepin.daemon.Authority.conf b/misc/conf/org.deepin.dde.Authority1.conf similarity index 60% rename from misc/conf/com.deepin.daemon.Authority.conf rename to misc/conf/org.deepin.dde.Authority1.conf index 8e67fd2bc..f712c7dc1 100644 --- a/misc/conf/com.deepin.daemon.Authority.conf +++ b/misc/conf/org.deepin.dde.Authority1.conf @@ -2,15 +2,15 @@ - - - + + + - + - + diff --git a/misc/conf/com.deepin.daemon.PowerManager.conf b/misc/conf/org.deepin.dde.BacklightHelper1.conf similarity index 56% rename from misc/conf/com.deepin.daemon.PowerManager.conf rename to misc/conf/org.deepin.dde.BacklightHelper1.conf index 071f54fc8..ae0178780 100644 --- a/misc/conf/com.deepin.daemon.PowerManager.conf +++ b/misc/conf/org.deepin.dde.BacklightHelper1.conf @@ -7,22 +7,20 @@ - + - - - + + - + - - + diff --git a/misc/conf/org.deepin.dde.Bluetooth1.conf b/misc/conf/org.deepin.dde.Bluetooth1.conf new file mode 100644 index 000000000..51ba7c7e3 --- /dev/null +++ b/misc/conf/org.deepin.dde.Bluetooth1.conf @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/misc/conf/org.deepin.dde.Daemon1.conf b/misc/conf/org.deepin.dde.Daemon1.conf new file mode 100644 index 000000000..cd1bb871a --- /dev/null +++ b/misc/conf/org.deepin.dde.Daemon1.conf @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/misc/conf/com.deepin.system.Display.conf b/misc/conf/org.deepin.dde.Display1.conf similarity index 64% rename from misc/conf/com.deepin.system.Display.conf rename to misc/conf/org.deepin.dde.Display1.conf index d442bd979..990800e80 100644 --- a/misc/conf/com.deepin.system.Display.conf +++ b/misc/conf/org.deepin.dde.Display1.conf @@ -7,23 +7,23 @@ - + - - - - + diff --git a/misc/conf/org.deepin.dde.Fprintd1.conf b/misc/conf/org.deepin.dde.Fprintd1.conf new file mode 100644 index 000000000..3bc7200bd --- /dev/null +++ b/misc/conf/org.deepin.dde.Fprintd1.conf @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + diff --git a/misc/conf/com.deepin.daemon.Gesture.conf b/misc/conf/org.deepin.dde.Gesture1.conf similarity index 59% rename from misc/conf/com.deepin.daemon.Gesture.conf rename to misc/conf/org.deepin.dde.Gesture1.conf index 5d1c7ee4d..f0c75fac9 100644 --- a/misc/conf/com.deepin.daemon.Gesture.conf +++ b/misc/conf/org.deepin.dde.Gesture1.conf @@ -6,17 +6,17 @@ - + - + - - - + diff --git a/misc/conf/com.deepin.daemon.Accounts.conf b/misc/conf/org.deepin.dde.Greeter1.conf similarity index 58% rename from misc/conf/com.deepin.daemon.Accounts.conf rename to misc/conf/org.deepin.dde.Greeter1.conf index b055fe81a..5cccda8a6 100644 --- a/misc/conf/com.deepin.daemon.Accounts.conf +++ b/misc/conf/org.deepin.dde.Greeter1.conf @@ -7,19 +7,19 @@ - + - - + + - - + - diff --git a/misc/conf/com.deepin.daemon.Grub2.conf b/misc/conf/org.deepin.dde.Grub2.conf similarity index 80% rename from misc/conf/com.deepin.daemon.Grub2.conf rename to misc/conf/org.deepin.dde.Grub2.conf index 7caae477e..5c1b44499 100644 --- a/misc/conf/com.deepin.daemon.Grub2.conf +++ b/misc/conf/org.deepin.dde.Grub2.conf @@ -7,12 +7,12 @@ - + - + diff --git a/misc/conf/com.deepin.system.InputDevices.conf b/misc/conf/org.deepin.dde.ImageBlur1.conf similarity index 78% rename from misc/conf/com.deepin.system.InputDevices.conf rename to misc/conf/org.deepin.dde.ImageBlur1.conf index 0a669f63c..2e2cec820 100644 --- a/misc/conf/com.deepin.system.InputDevices.conf +++ b/misc/conf/org.deepin.dde.ImageBlur1.conf @@ -7,12 +7,12 @@ - + - + diff --git a/misc/conf/com.deepin.daemon.ImageEffect.conf b/misc/conf/org.deepin.dde.ImageEffect1.conf similarity index 78% rename from misc/conf/com.deepin.daemon.ImageEffect.conf rename to misc/conf/org.deepin.dde.ImageEffect1.conf index 628fedfc2..d46bae18b 100644 --- a/misc/conf/com.deepin.daemon.ImageEffect.conf +++ b/misc/conf/org.deepin.dde.ImageEffect1.conf @@ -7,12 +7,12 @@ - + - + diff --git a/misc/conf/org.deepin.dde.InputDevices1.conf b/misc/conf/org.deepin.dde.InputDevices1.conf new file mode 100644 index 000000000..2566c06fe --- /dev/null +++ b/misc/conf/org.deepin.dde.InputDevices1.conf @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/misc/conf/com.deepin.daemon.KeyEvent.conf b/misc/conf/org.deepin.dde.KeyEvent1.conf similarity index 64% rename from misc/conf/com.deepin.daemon.KeyEvent.conf rename to misc/conf/org.deepin.dde.KeyEvent1.conf index c789e9682..b0f95603f 100644 --- a/misc/conf/com.deepin.daemon.KeyEvent.conf +++ b/misc/conf/org.deepin.dde.KeyEvent1.conf @@ -7,22 +7,22 @@ - + - - - - + diff --git a/misc/conf/com.deepin.dde.LockService.conf b/misc/conf/org.deepin.dde.LockService1.conf similarity index 58% rename from misc/conf/com.deepin.dde.LockService.conf rename to misc/conf/org.deepin.dde.LockService1.conf index 407c9a0c1..9b25218dc 100644 --- a/misc/conf/com.deepin.dde.LockService.conf +++ b/misc/conf/org.deepin.dde.LockService1.conf @@ -6,17 +6,17 @@ - + - + - - - + diff --git a/misc/conf/com.deepin.system.Network.conf b/misc/conf/org.deepin.dde.Network1.conf similarity index 64% rename from misc/conf/com.deepin.system.Network.conf rename to misc/conf/org.deepin.dde.Network1.conf index 4734f8fb2..956e4d8ae 100644 --- a/misc/conf/com.deepin.system.Network.conf +++ b/misc/conf/org.deepin.dde.Network1.conf @@ -7,22 +7,22 @@ - + - - - - + diff --git a/misc/conf/com.deepin.system.Power.conf b/misc/conf/org.deepin.dde.Power1.conf similarity index 56% rename from misc/conf/com.deepin.system.Power.conf rename to misc/conf/org.deepin.dde.Power1.conf index 8129ffa6b..181ba374d 100644 --- a/misc/conf/com.deepin.system.Power.conf +++ b/misc/conf/org.deepin.dde.Power1.conf @@ -7,30 +7,30 @@ - + - - - - + - + - - diff --git a/misc/conf/org.deepin.dde.PowerManager1.conf b/misc/conf/org.deepin.dde.PowerManager1.conf new file mode 100644 index 000000000..5fbd238fc --- /dev/null +++ b/misc/conf/org.deepin.dde.PowerManager1.conf @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/misc/conf/com.deepin.daemon.AirplaneMode.conf b/misc/conf/org.deepin.dde.SwapSchedHelper1.conf similarity index 71% rename from misc/conf/com.deepin.daemon.AirplaneMode.conf rename to misc/conf/org.deepin.dde.SwapSchedHelper1.conf index 2c0a095d5..001f798cb 100644 --- a/misc/conf/com.deepin.daemon.AirplaneMode.conf +++ b/misc/conf/org.deepin.dde.SwapSchedHelper1.conf @@ -7,12 +7,13 @@ - + - + diff --git a/misc/conf/org.deepin.dde.SystemInfo1.conf b/misc/conf/org.deepin.dde.SystemInfo1.conf new file mode 100644 index 000000000..0734824e4 --- /dev/null +++ b/misc/conf/org.deepin.dde.SystemInfo1.conf @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/misc/conf/org.deepin.dde.Timedate1.conf b/misc/conf/org.deepin.dde.Timedate1.conf new file mode 100644 index 000000000..e4f9cd02d --- /dev/null +++ b/misc/conf/org.deepin.dde.Timedate1.conf @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/misc/conf/com.deepin.daemon.Uadp.conf b/misc/conf/org.deepin.dde.Uadp1.conf similarity index 66% rename from misc/conf/com.deepin.daemon.Uadp.conf rename to misc/conf/org.deepin.dde.Uadp1.conf index 1f97d2ea3..38b0117f5 100644 --- a/misc/conf/com.deepin.daemon.Uadp.conf +++ b/misc/conf/org.deepin.dde.Uadp1.conf @@ -7,22 +7,22 @@ - + - - - - + diff --git a/misc/dde-daemon/gesture.json b/misc/dde-daemon/gesture.json index a790fa1a2..14db6803e 100644 --- a/misc/dde-daemon/gesture.json +++ b/misc/dde-daemon/gesture.json @@ -106,7 +106,7 @@ }, "Action": { "Type": "commandline", - "Action": "dbus-send --type=method_call --dest=com.deepin.dde.Launcher /com/deepin/dde/Launcher com.deepin.dde.Launcher.Toggle" + "Action": "dbus-send --type=method_call --dest=org.deepin.dde.Launcher1 /org/deepin/dde/Launcher1 org.deepin.dde.Launcher1.Toggle" } }, { @@ -161,7 +161,7 @@ }, "Action": { "Type": "commandline", - "Action": "dbus-send --type=method_call --dest=com.deepin.dde.Launcher /com/deepin/dde/Launcher com.deepin.dde.Launcher.Toggle" + "Action": "dbus-send --type=method_call --dest=org.deepin.dde.Launcher1 /org/deepin/dde/Launcher1 org.deepin.dde.Launcher1.Toggle" } } ] diff --git a/misc/dde-daemon/keybinding/system_actions.json b/misc/dde-daemon/keybinding/system_actions.json index 57991a70d..a30f0966e 100644 --- a/misc/dde-daemon/keybinding/system_actions.json +++ b/misc/dde-daemon/keybinding/system_actions.json @@ -1,7 +1,7 @@ { "Actions": [ { - "Action": "dbus-send --print-reply --dest=com.deepin.dde.Launcher /com/deepin/dde/Launcher com.deepin.dde.Launcher.Toggle", + "Action": "dbus-send --print-reply --dest=org.deepin.dde.Launcher1 /org/deepin/dde/Launcher1 org.deepin.dde.Launcher1.Toggle", "Key": "launcher" }, { @@ -13,23 +13,19 @@ "Action": "dbus-send --print-reply --dest=com.deepin.ScreenRecorder /com/deepin/ScreenRecorder com.deepin.ScreenRecorder.stopRecord" }, { - "Action": "/usr/bin/deepin-system-monitor", - "Key": "system-monitor" + "Key": "system-monitor", + "Action": "dde-am deepin-system-monitor" }, { "Key": "deepin-picker", "Action": "dbus-send --print-reply --dest=com.deepin.Picker /com/deepin/Picker com.deepin.Picker.Show" }, { - "Action": "originmap=$(setxkbmap -query | grep option | awk -F ' ' '{print $2}');/usr/bin/setxkbmap -option grab:break_actions&&/usr/bin/xdotool key XF86Ungrab&&dbus-send --print-reply --dest=com.deepin.dde.lockFront /com/deepin/dde/lockFront com.deepin.dde.lockFront.Show&&/usr/bin/setxkbmap -option $originmap", + "Action": "/usr/lib/deepin-daemon/dde-lock.sh", "Key": "lock-screen" }, { - "Action": "originmap=$(setxkbmap -query | grep option | awk -F ' ' '{print $2}');/usr/bin/setxkbmap -option grab:break_actions&&dbus-send --print-reply --dest=com.deepin.dde.lockFront /com/deepin/dde/lockFront com.deepin.dde.lockFront.Show&&/usr/bin/setxkbmap -option $originmap", - "Key": "lock-screen-wayland" - }, - { - "Action": "dbus-send --print-reply --dest=com.deepin.dde.shutdownFront /com/deepin/dde/shutdownFront com.deepin.dde.shutdownFront.Show", + "Action": "dbus-send --print-reply --dest=org.deepin.dde.ShutdownFront1 /org/deepin/dde/ShutdownFront1 org.deepin.dde.ShutdownFront1.Show", "Key": "logout" }, { @@ -61,7 +57,7 @@ "Key": "disable-touchpad" }, { - "Action": "dbus-send --type=method_call --dest=com.deepin.WMSwitcher /com/deepin/WMSwitcher com.deepin.WMSwitcher.RequestSwitchWM", + "Action": "dbus-send --type=method_call --dest=org.deepin.dde.WMSwitcher1 /org/deepin/dde/WMSwitcher1 org.deepin.dde.WMSwitcher1.RequestSwitchWM", "Key": "wm-switcher" }, { @@ -82,7 +78,7 @@ }, { "Key": "clipboard", - "Action": "dbus-send --print-reply --dest=com.deepin.dde.Clipboard /com/deepin/dde/Clipboard com.deepin.dde.Clipboard.Toggle; dbus-send --print-reply --dest=com.deepin.dde.Launcher /com/deepin/dde/Launcher com.deepin.dde.Launcher.Hide" + "Action": "dbus-send --print-reply --dest=org.deepin.dde.Clipboard1 /org/deepin/dde/Clipboard1 org.deepin.dde.Clipboard1.Toggle" }, { "Key": "translation", @@ -90,7 +86,7 @@ }, { "key":"notification-center", - "Action":"dbus-send --print-reply --dest=com.deepin.dde.osd /org/freedesktop/Notifications com.deepin.dde.Notification.Toggle" + "Action":"dbus-send --print-reply --dest=org.deepin.dde.Widgets1 /org/deepin/dde/Widgets1 org.deepin.dde.Widgets1.Toggle" }, { "Key": "screenshot-ocr", diff --git a/misc/dsg-configs/org.deepin.dde.daemon.audio.json b/misc/dsg-configs/org.deepin.dde.daemon.audio.json index 85ef04e8a..870de8152 100644 --- a/misc/dsg-configs/org.deepin.dde.daemon.audio.json +++ b/misc/dsg-configs/org.deepin.dde.daemon.audio.json @@ -77,6 +77,17 @@ "description[zh_CN]": "通过端口类型设置输出优先级,0:蓝牙音频 1:3.5mm, 耳麦 2:USB, 3:内置扬声器和话筒, 4:HDMI, 5:线缆输入输出, 6:多声道, 7:其他类型", "permissions": "read", "visibility": "private" + }, + "bluezModeDefault": { + "value": "a2dp", + "serial": 0, + "flags": [], + "global": true, + "name": "BluezModeDefault", + "name[zh_CN]": "蓝牙默认模式", + "description": "bluetooth audio default mode", + "permissions": "readwrite", + "visibility": "private" } } } diff --git a/misc/dsg-configs/org.deepin.dde.daemon.keybinding.json b/misc/dsg-configs/org.deepin.dde.daemon.keybinding.json index f7783dff2..be6c5d45e 100644 --- a/misc/dsg-configs/org.deepin.dde.daemon.keybinding.json +++ b/misc/dsg-configs/org.deepin.dde.daemon.keybinding.json @@ -24,6 +24,16 @@ "description": "system-product-names need xrandr+q to resolve hot plug", "permissions": "readwrite", "visibility": "private" + }, + "deviceManagerControlEnable": { + "value": false, + "serial": 0, + "flags": [], + "name": "deviceManagerControlEnable", + "name[zh_CN]": "通过DDE控制实现设备管理器热键功能", + "description": "DeviceManager shortcut effected by DDE software", + "permissions": "readonly", + "visibility": "private" } } } \ No newline at end of file diff --git a/misc/polkit-action/com.deepin.daemon.airplane-mode.policy b/misc/polkit-action/com.deepin.daemon.airplane-mode.policy deleted file mode 100644 index bccf29e73..000000000 --- a/misc/polkit-action/com.deepin.daemon.airplane-mode.policy +++ /dev/null @@ -1,19 +0,0 @@ - - - - LinuxDeepin - https://www.deepin.com/ - - - Enable or disable any switch in airplane mode - Authentication is required to enable or disable any switch in airplane mode - - no - no - yes - - - - diff --git a/misc/polkit-action/com.deepin.daemon.Fprintd.policy.in b/misc/polkit-action/org.deepin.dde.Fprintd1.policy.in similarity index 86% rename from misc/polkit-action/com.deepin.daemon.Fprintd.policy.in rename to misc/polkit-action/org.deepin.dde.Fprintd1.policy.in index 02e21e366..9003e6faf 100644 --- a/misc/polkit-action/com.deepin.daemon.Fprintd.policy.in +++ b/misc/polkit-action/org.deepin.dde.Fprintd1.policy.in @@ -4,7 +4,7 @@ LinuxDeepin https://www.deepin.com/ - + Add fingerprint password Authentication is required to add fingerprint password @@ -13,7 +13,7 @@ auth_admin_keep - + Clear fingerprint passwords Authentication is required to clear fingerprint passwords @@ -22,7 +22,7 @@ auth_admin_keep - + Rename fingerprint password Authentication is required to rename fingerprint password @@ -31,7 +31,7 @@ auth_admin_keep - + Manage fingerprint passwords Password is required to perform this action diff --git a/misc/polkit-action/com.deepin.daemon.Grub2.policy.in b/misc/polkit-action/org.deepin.dde.Grub2.policy.in similarity index 90% rename from misc/polkit-action/com.deepin.daemon.Grub2.policy.in rename to misc/polkit-action/org.deepin.dde.Grub2.policy.in index 2f3f8af1a..127576822 100644 --- a/misc/polkit-action/com.deepin.daemon.Grub2.policy.in +++ b/misc/polkit-action/org.deepin.dde.Grub2.policy.in @@ -6,7 +6,7 @@ LinuxDeepin https://www.deepin.com/ - + Change the grub configuration Authentication is required to change the grub configuration @@ -16,7 +16,7 @@ - + Prepare grub display resolution detection Authentication is required to prepare grub display resolution detection diff --git a/misc/polkit-action/com.deepin.daemon.accounts.policy.in b/misc/polkit-action/org.deepin.dde.accounts1.policy.in similarity index 70% rename from misc/polkit-action/com.deepin.daemon.accounts.policy.in rename to misc/polkit-action/org.deepin.dde.accounts1.policy.in index 7f73fae77..54eaca85d 100644 --- a/misc/polkit-action/com.deepin.daemon.accounts.policy.in +++ b/misc/polkit-action/org.deepin.dde.accounts1.policy.in @@ -6,7 +6,7 @@ - + Change your own user data Authentication is required to change your own user data @@ -16,7 +16,7 @@ - + Manage user accounts Authentication is required to change user data @@ -26,7 +26,7 @@ - + Enable Auto Login Authentication is required to enable auto login @@ -36,7 +36,7 @@ - + Disable Auto Login Authentication is required to disable auto login @@ -46,7 +46,7 @@ - + Enable Quick Login Authentication is required to enable quick login @@ -56,7 +56,7 @@ - + Disable Quick Login Authentication is required to disable quick login @@ -66,7 +66,27 @@ - + + Enable WeChat Code Login + Authentication is required to enable WeChat code login + + no + no + auth_self + + + + + Disable WeChat Code Login + Authentication is required to disable WeChat code login + + no + no + auth_self + + + + Enable Login without password Authentication is required to enable login without password @@ -76,7 +96,7 @@ - + Disable Login without password Authentication is required to disable login without password @@ -86,7 +106,7 @@ - + Set keyboard layout Authentication is required to set keyboard layout diff --git a/misc/polkit-localauthority/com.deepin.daemon.Accounts.pkla b/misc/polkit-localauthority/org.deepin.dde.accounts.pkla similarity index 66% rename from misc/polkit-localauthority/com.deepin.daemon.Accounts.pkla rename to misc/polkit-localauthority/org.deepin.dde.accounts.pkla index 431edfe1d..8580c1d42 100644 --- a/misc/polkit-localauthority/com.deepin.daemon.Accounts.pkla +++ b/misc/polkit-localauthority/org.deepin.dde.accounts.pkla @@ -1,6 +1,6 @@ [Greeter Set Keyboard Layout] Identity=unix-user:lightdm -Action=com.deepin.daemon.accounts.set-keyboard-layout +Action=org.deepin.dde.accounts.set-keyboard-layout ResultAny=no ResultInactive=no ResultActive=yes diff --git a/misc/polkit-localauthority/com.deepin.daemon.Fprintd.pkla b/misc/polkit-localauthority/org.deepin.dde.fprintd.pkla similarity index 100% rename from misc/polkit-localauthority/com.deepin.daemon.Fprintd.pkla rename to misc/polkit-localauthority/org.deepin.dde.fprintd.pkla diff --git a/misc/polkit-localauthority/com.deepin.daemon.Grub2.pkla b/misc/polkit-localauthority/org.deepin.dde.grub2.pkla similarity index 66% rename from misc/polkit-localauthority/com.deepin.daemon.Grub2.pkla rename to misc/polkit-localauthority/org.deepin.dde.grub2.pkla index 814cb32f7..03b6a5763 100644 --- a/misc/polkit-localauthority/com.deepin.daemon.Grub2.pkla +++ b/misc/polkit-localauthority/org.deepin.dde.grub2.pkla @@ -1,6 +1,6 @@ [Prepare grub2 gfxmode deletection] Identity=unix-group:sudo -Action=com.deepin.daemon.grub2.prepare-gfxmode-detect +Action=org.deepin.dde.grub2.prepare-gfxmode-detect ResultAny=no ResultInactive=no ResultActive=yes diff --git a/misc/scripts/dde-lock.sh b/misc/scripts/dde-lock.sh new file mode 100644 index 000000000..e98e52503 --- /dev/null +++ b/misc/scripts/dde-lock.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +originmap=$(setxkbmap -query | grep option | awk -F ' ' '{print $2}');setxkbmap -option grab:break_actions&&xdotool key XF86Ungrab&&dbus-send --print-reply --dest=org.deepin.dde.LockFront1 /org/deepin/dde/LockFront1 org.deepin.dde.LockFront1.Show; setxkbmap -option $originmap \ No newline at end of file diff --git a/misc/scripts/dde-system-daemon-power-refresh.sh b/misc/scripts/dde-system-daemon-power-refresh.sh index 470d9831e..2038c9c5c 100755 --- a/misc/scripts/dde-system-daemon-power-refresh.sh +++ b/misc/scripts/dde-system-daemon-power-refresh.sh @@ -3,6 +3,6 @@ case $1/$2 in pre/*) ;; post/*) - gdbus call -y -d com.deepin.system.Power -o /com/deepin/system/Power -m com.deepin.system.Power.Refresh --timeout 2 + gdbus call -y -d org.deepin.dde.Power1 -o /org/deepin/dde/Power1 -m org.deepin.dde.Power1.Refresh --timeout 2 ;; esac diff --git a/misc/services/com.deepin.LastoreSessionHelper.service b/misc/services/com.deepin.LastoreSessionHelper.service deleted file mode 100644 index 7a0c0a90e..000000000 --- a/misc/services/com.deepin.LastoreSessionHelper.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.LastoreSessionHelper -Exec=/usr/lib/deepin-daemon/dde-session-daemon - diff --git a/misc/services/com.deepin.api.XEventMonitor.service b/misc/services/com.deepin.api.XEventMonitor.service deleted file mode 100644 index 699664844..000000000 --- a/misc/services/com.deepin.api.XEventMonitor.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=com.deepin.api.XEventMonitor -Exec=/usr/lib/deepin-daemon/dde-session-daemon diff --git a/misc/services/com.deepin.daemon.Appearance.service b/misc/services/com.deepin.daemon.Appearance.service deleted file mode 100644 index e72c8f0c9..000000000 --- a/misc/services/com.deepin.daemon.Appearance.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Appearance -Exec=/usr/lib/deepin-daemon/dde-session-daemon diff --git a/misc/services/com.deepin.daemon.Audio.service b/misc/services/com.deepin.daemon.Audio.service deleted file mode 100644 index 37fd1808e..000000000 --- a/misc/services/com.deepin.daemon.Audio.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Audio -Exec=/usr/lib/deepin-daemon/dde-session-daemon diff --git a/misc/services/com.deepin.daemon.Bluetooth.service b/misc/services/com.deepin.daemon.Bluetooth.service deleted file mode 100644 index 8db042f83..000000000 --- a/misc/services/com.deepin.daemon.Bluetooth.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Bluetooth -Exec=/usr/lib/deepin-daemon/dde-session-daemon diff --git a/misc/services/com.deepin.daemon.EventLog.service b/misc/services/com.deepin.daemon.EventLog.service deleted file mode 100644 index 89bef9547..000000000 --- a/misc/services/com.deepin.daemon.EventLog.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.EventLog -Exec=/usr/lib/deepin-daemon/dde-session-daemon \ No newline at end of file diff --git a/misc/services/com.deepin.daemon.InputDevices.service b/misc/services/com.deepin.daemon.InputDevices.service deleted file mode 100644 index 9d3cf38b0..000000000 --- a/misc/services/com.deepin.daemon.InputDevices.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.InputDevices -Exec=/usr/lib/deepin-daemon/dde-session-daemon diff --git a/misc/services/com.deepin.daemon.Keybinding.service b/misc/services/com.deepin.daemon.Keybinding.service deleted file mode 100644 index 3c4f4e3a5..000000000 --- a/misc/services/com.deepin.daemon.Keybinding.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Keybinding -Exec=/usr/lib/deepin-daemon/dde-session-daemon diff --git a/misc/services/com.deepin.daemon.Mime.service b/misc/services/com.deepin.daemon.Mime.service deleted file mode 100644 index b50715da4..000000000 --- a/misc/services/com.deepin.daemon.Mime.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Mime -Exec=/usr/lib/deepin-daemon/dde-session-daemon diff --git a/misc/services/com.deepin.daemon.Network.service b/misc/services/com.deepin.daemon.Network.service deleted file mode 100644 index e5c637a80..000000000 --- a/misc/services/com.deepin.daemon.Network.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Network -Exec=/usr/lib/deepin-daemon/dde-session-daemon diff --git a/misc/services/com.deepin.daemon.Power.service b/misc/services/com.deepin.daemon.Power.service deleted file mode 100644 index d029d2004..000000000 --- a/misc/services/com.deepin.daemon.Power.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Power -Exec=/usr/lib/deepin-daemon/dde-session-daemon diff --git a/misc/services/com.deepin.daemon.SessionWatcher.service b/misc/services/com.deepin.daemon.SessionWatcher.service deleted file mode 100644 index 901556344..000000000 --- a/misc/services/com.deepin.daemon.SessionWatcher.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.SessionWatcher -Exec=/usr/lib/deepin-daemon/dde-session-daemon diff --git a/misc/services/com.deepin.daemon.SystemInfo.service b/misc/services/com.deepin.daemon.SystemInfo.service deleted file mode 100644 index 5b5b09892..000000000 --- a/misc/services/com.deepin.daemon.SystemInfo.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.SystemInfo -Exec=/usr/lib/deepin-daemon/dde-session-daemon diff --git a/misc/services/com.deepin.daemon.Timedate.service b/misc/services/com.deepin.daemon.Timedate.service deleted file mode 100644 index d18672968..000000000 --- a/misc/services/com.deepin.daemon.Timedate.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Timedate -Exec=/usr/lib/deepin-daemon/dde-session-daemon diff --git a/misc/services/com.deepin.daemon.Zone.service b/misc/services/com.deepin.daemon.Zone.service deleted file mode 100644 index e183801e8..000000000 --- a/misc/services/com.deepin.daemon.Zone.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Zone -Exec=/usr/lib/deepin-daemon/dde-session-daemon diff --git a/misc/services/com.deepin.dde.daemon.Dock.service b/misc/services/com.deepin.dde.daemon.Dock.service deleted file mode 100644 index 1696a9105..000000000 --- a/misc/services/com.deepin.dde.daemon.Dock.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=com.deepin.dde.daemon.Dock -Exec=/usr/lib/deepin-daemon/dde-session-daemon diff --git a/misc/services/com.deepin.dde.daemon.Launcher.service b/misc/services/com.deepin.dde.daemon.Launcher.service deleted file mode 100644 index df329366f..000000000 --- a/misc/services/com.deepin.dde.daemon.Launcher.service +++ /dev/null @@ -1,3 +0,0 @@ -[D-BUS Service] -Name=com.deepin.dde.daemon.Launcher -Exec=/usr/lib/deepin-daemon/dde-session-daemon diff --git a/misc/services/org.deepin.dde.Audio1.service b/misc/services/org.deepin.dde.Audio1.service new file mode 100644 index 000000000..86963cf3f --- /dev/null +++ b/misc/services/org.deepin.dde.Audio1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Audio1 +Exec=/usr/lib/deepin-daemon/dde-session-daemon +SystemdService=org.dde.session.Daemon1.service diff --git a/misc/services/org.deepin.dde.Bluetooth1.service b/misc/services/org.deepin.dde.Bluetooth1.service new file mode 100644 index 000000000..b0def8523 --- /dev/null +++ b/misc/services/org.deepin.dde.Bluetooth1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Bluetooth1 +Exec=/usr/lib/deepin-daemon/dde-session-daemon +SystemdService=org.dde.session.Daemon1.service diff --git a/misc/services/org.deepin.dde.InputDevices1.service b/misc/services/org.deepin.dde.InputDevices1.service new file mode 100644 index 000000000..20b7904f1 --- /dev/null +++ b/misc/services/org.deepin.dde.InputDevices1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.InputDevices1 +Exec=/usr/lib/deepin-daemon/dde-session-daemon +SystemdService=org.dde.session.Daemon1.service diff --git a/misc/services/org.deepin.dde.Keybinding1.service b/misc/services/org.deepin.dde.Keybinding1.service new file mode 100644 index 000000000..450a59052 --- /dev/null +++ b/misc/services/org.deepin.dde.Keybinding1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Keybinding1 +Exec=/usr/lib/deepin-daemon/dde-session-daemon +SystemdService=org.dde.session.Daemon1.service diff --git a/misc/services/com.deepin.daemon.LangSelector.service b/misc/services/org.deepin.dde.LangSelector1.service similarity index 61% rename from misc/services/com.deepin.daemon.LangSelector.service rename to misc/services/org.deepin.dde.LangSelector1.service index d1b349d09..84357675b 100644 --- a/misc/services/com.deepin.daemon.LangSelector.service +++ b/misc/services/org.deepin.dde.LangSelector1.service @@ -1,3 +1,3 @@ [D-BUS Service] -Name=com.deepin.daemon.LangSelector +Name=org.deepin.dde.LangSelector1 Exec=/usr/lib/deepin-daemon/langselector diff --git a/misc/services/org.deepin.dde.LastoreSessionHelper1.service b/misc/services/org.deepin.dde.LastoreSessionHelper1.service new file mode 100644 index 000000000..97de6e8e7 --- /dev/null +++ b/misc/services/org.deepin.dde.LastoreSessionHelper1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.LastoreSessionHelper1 +Exec=/usr/lib/deepin-daemon/dde-session-daemon +SystemdService=org.dde.session.Daemon1.service diff --git a/misc/services/org.deepin.dde.Network1.service b/misc/services/org.deepin.dde.Network1.service new file mode 100644 index 000000000..79d6e9d13 --- /dev/null +++ b/misc/services/org.deepin.dde.Network1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Network1 +Exec=/usr/lib/deepin-daemon/dde-session-daemon +SystemdService=org.dde.session.Daemon1.service diff --git a/misc/services/org.deepin.dde.Power1.service b/misc/services/org.deepin.dde.Power1.service new file mode 100644 index 000000000..7b8350d01 --- /dev/null +++ b/misc/services/org.deepin.dde.Power1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Power1 +Exec=/usr/lib/deepin-daemon/dde-session-daemon +SystemdService=org.dde.session.Daemon1.service diff --git a/misc/services/com.deepin.daemon.Search.service b/misc/services/org.deepin.dde.Search1.service similarity index 62% rename from misc/services/com.deepin.daemon.Search.service rename to misc/services/org.deepin.dde.Search1.service index 20bb0eea1..4e7aa9db9 100644 --- a/misc/services/com.deepin.daemon.Search.service +++ b/misc/services/org.deepin.dde.Search1.service @@ -1,3 +1,3 @@ [D-BUS Service] -Name=com.deepin.daemon.Search +Name=org.deepin.dde.Search1 Exec=/usr/lib/deepin-daemon/search diff --git a/misc/services/org.deepin.dde.SessionWatcher1.service b/misc/services/org.deepin.dde.SessionWatcher1.service new file mode 100644 index 000000000..b24841615 --- /dev/null +++ b/misc/services/org.deepin.dde.SessionWatcher1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.SessionWatcher1 +Exec=/usr/lib/deepin-daemon/dde-session-daemon +SystemdService=org.dde.session.Daemon1.service diff --git a/misc/services/com.deepin.daemon.SoundEffect.service b/misc/services/org.deepin.dde.SoundEffect1.service similarity index 61% rename from misc/services/com.deepin.daemon.SoundEffect.service rename to misc/services/org.deepin.dde.SoundEffect1.service index 9e404ab4f..a135253af 100644 --- a/misc/services/com.deepin.daemon.SoundEffect.service +++ b/misc/services/org.deepin.dde.SoundEffect1.service @@ -1,3 +1,3 @@ [D-BUS Service] -Name=com.deepin.daemon.SoundEffect +Name=org.deepin.dde.SoundEffect1 Exec=/usr/lib/deepin-daemon/soundeffect diff --git a/misc/services/org.deepin.dde.SystemInfo1.service b/misc/services/org.deepin.dde.SystemInfo1.service new file mode 100644 index 000000000..17113be6d --- /dev/null +++ b/misc/services/org.deepin.dde.SystemInfo1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.SystemInfo1 +Exec=/usr/lib/deepin-daemon/dde-session-daemon +SystemdService=org.dde.session.Daemon1.service diff --git a/misc/services/org.deepin.dde.Timedate1.service b/misc/services/org.deepin.dde.Timedate1.service new file mode 100644 index 000000000..17fd901e7 --- /dev/null +++ b/misc/services/org.deepin.dde.Timedate1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Timedate1 +Exec=/usr/lib/deepin-daemon/dde-session-daemon +SystemdService=org.dde.session.Daemon1.service diff --git a/misc/services/org.deepin.dde.XEventMonitor1.service b/misc/services/org.deepin.dde.XEventMonitor1.service new file mode 100644 index 000000000..126719d95 --- /dev/null +++ b/misc/services/org.deepin.dde.XEventMonitor1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.XEventMonitor1 +Exec=/usr/lib/deepin-daemon/dde-session-daemon -l info +SystemdService=org.dde.session.Daemon1.service diff --git a/misc/services/org.deepin.dde.Zone1.service b/misc/services/org.deepin.dde.Zone1.service new file mode 100644 index 000000000..ed150fc20 --- /dev/null +++ b/misc/services/org.deepin.dde.Zone1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Zone1 +Exec=/usr/lib/deepin-daemon/dde-session-daemon +SystemdService=org.dde.session.Daemon1.service diff --git a/misc/system-services/com.deepin.daemon.Accounts.service b/misc/system-services/com.deepin.daemon.Accounts.service deleted file mode 100644 index 25260d2dd..000000000 --- a/misc/system-services/com.deepin.daemon.Accounts.service +++ /dev/null @@ -1,5 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Accounts -Exec=/usr/lib/deepin-daemon/dde-system-daemon -User=root -SystemdService=deepin-accounts-daemon.service diff --git a/misc/system-services/com.deepin.daemon.AirplaneMode.service b/misc/system-services/com.deepin.daemon.AirplaneMode.service deleted file mode 100644 index 3bbf94524..000000000 --- a/misc/system-services/com.deepin.daemon.AirplaneMode.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.AirplaneMode -Exec=/usr/lib/deepin-daemon/dde-system-daemon -User=root diff --git a/misc/system-services/com.deepin.daemon.Apps.service b/misc/system-services/com.deepin.daemon.Apps.service deleted file mode 100644 index 0d315119b..000000000 --- a/misc/system-services/com.deepin.daemon.Apps.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Apps -Exec=/usr/lib/deepin-daemon/dde-system-daemon -User=root diff --git a/misc/system-services/com.deepin.daemon.Authority.service b/misc/system-services/com.deepin.daemon.Authority.service deleted file mode 100644 index 689928cac..000000000 --- a/misc/system-services/com.deepin.daemon.Authority.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Authority -Exec=/usr/lib/deepin-daemon/dde-authority -User=root diff --git a/misc/system-services/com.deepin.daemon.Daemon.service b/misc/system-services/com.deepin.daemon.Daemon.service deleted file mode 100644 index 064ddb9e9..000000000 --- a/misc/system-services/com.deepin.daemon.Daemon.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Daemon -Exec=/usr/lib/deepin-daemon/dde-system-daemon -User=root diff --git a/misc/system-services/com.deepin.daemon.Fprintd.service b/misc/system-services/com.deepin.daemon.Fprintd.service deleted file mode 100644 index a8a373794..000000000 --- a/misc/system-services/com.deepin.daemon.Fprintd.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Fprintd -Exec=/usr/lib/deepin-daemon/dde-system-daemon -User=root diff --git a/misc/system-services/com.deepin.daemon.Gesture.service b/misc/system-services/com.deepin.daemon.Gesture.service deleted file mode 100644 index 575ba5871..000000000 --- a/misc/system-services/com.deepin.daemon.Gesture.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Gesture -Exec=/usr/lib/deepin-daemon/dde-system-daemon -User=root diff --git a/misc/system-services/com.deepin.daemon.Greeter.service b/misc/system-services/com.deepin.daemon.Greeter.service deleted file mode 100644 index e8e026595..000000000 --- a/misc/system-services/com.deepin.daemon.Greeter.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Greeter -Exec=/usr/lib/deepin-daemon/dde-greeter-setter -User=root diff --git a/misc/system-services/com.deepin.daemon.Grub2.service b/misc/system-services/com.deepin.daemon.Grub2.service deleted file mode 100644 index 031ff9878..000000000 --- a/misc/system-services/com.deepin.daemon.Grub2.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Grub2 -Exec=/usr/lib/deepin-daemon/grub2 -User=root diff --git a/misc/system-services/com.deepin.daemon.ImageEffect.service b/misc/system-services/com.deepin.daemon.ImageEffect.service deleted file mode 100644 index c06bf49d7..000000000 --- a/misc/system-services/com.deepin.daemon.ImageEffect.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.ImageEffect -Exec=/usr/lib/deepin-daemon/dde-system-daemon -User=root diff --git a/misc/system-services/com.deepin.daemon.SwapSchedHelper.service b/misc/system-services/com.deepin.daemon.SwapSchedHelper.service deleted file mode 100644 index 28e5dd5be..000000000 --- a/misc/system-services/com.deepin.daemon.SwapSchedHelper.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.SwapSchedHelper -Exec=/usr/lib/deepin-daemon/dde-system-daemon -User=root diff --git a/misc/system-services/com.deepin.daemon.Timedated.service b/misc/system-services/com.deepin.daemon.Timedated.service deleted file mode 100644 index 691b4f7bc..000000000 --- a/misc/system-services/com.deepin.daemon.Timedated.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Timedated -Exec=/usr/lib/deepin-daemon/dde-system-daemon -User=root diff --git a/misc/system-services/com.deepin.daemon.Uadp.service b/misc/system-services/com.deepin.daemon.Uadp.service deleted file mode 100644 index 509462c5f..000000000 --- a/misc/system-services/com.deepin.daemon.Uadp.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.Uadp -Exec=/usr/lib/deepin-daemon/dde-system-daemon -User=root \ No newline at end of file diff --git a/misc/system-services/com.deepin.daemon.helper.Backlight.service b/misc/system-services/com.deepin.daemon.helper.Backlight.service deleted file mode 100644 index 958e9ec71..000000000 --- a/misc/system-services/com.deepin.daemon.helper.Backlight.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.daemon.helper.Backlight -Exec=/usr/lib/deepin-daemon/backlight_helper -User=root diff --git a/misc/system-services/com.deepin.dde.LockService.service b/misc/system-services/com.deepin.dde.LockService.service deleted file mode 100644 index 9de324c77..000000000 --- a/misc/system-services/com.deepin.dde.LockService.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.dde.LockService -Exec=/usr/lib/deepin-daemon/dde-lockservice -User=root diff --git a/misc/system-services/com.deepin.system.Bluetooth.service b/misc/system-services/com.deepin.system.Bluetooth.service deleted file mode 100644 index f1405796f..000000000 --- a/misc/system-services/com.deepin.system.Bluetooth.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.system.Bluetooth -Exec=/usr/lib/deepin-daemon/dde-system-daemon -User=root diff --git a/misc/system-services/com.deepin.system.Display.service b/misc/system-services/com.deepin.system.Display.service deleted file mode 100644 index 3f71eff2f..000000000 --- a/misc/system-services/com.deepin.system.Display.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.system.Display -Exec=/usr/lib/deepin-daemon/dde-system-daemon -User=root diff --git a/misc/system-services/com.deepin.system.Network.service b/misc/system-services/com.deepin.system.Network.service deleted file mode 100644 index 5fd04a4c4..000000000 --- a/misc/system-services/com.deepin.system.Network.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.system.Network -Exec=/usr/lib/deepin-daemon/dde-system-daemon -User=root diff --git a/misc/system-services/com.deepin.system.Power.service b/misc/system-services/com.deepin.system.Power.service deleted file mode 100644 index c32b47fad..000000000 --- a/misc/system-services/com.deepin.system.Power.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=com.deepin.system.Power -Exec=/usr/lib/deepin-daemon/dde-system-daemon -User=root diff --git a/misc/system-services/org.deepin.dde.Accounts1.service b/misc/system-services/org.deepin.dde.Accounts1.service new file mode 100644 index 000000000..5ca7e331b --- /dev/null +++ b/misc/system-services/org.deepin.dde.Accounts1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Accounts1 +Exec=/bin/false +SystemdService=deepin-accounts1-daemon.service diff --git a/misc/system-services/org.deepin.dde.AirplaneMode1.service b/misc/system-services/org.deepin.dde.AirplaneMode1.service new file mode 100644 index 000000000..e87b44e30 --- /dev/null +++ b/misc/system-services/org.deepin.dde.AirplaneMode1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.AirplaneMode1 +Exec=/bin/false +SystemdService=deepin-accounts1-daemon.service diff --git a/misc/system-services/org.deepin.dde.Apps1.service b/misc/system-services/org.deepin.dde.Apps1.service new file mode 100644 index 000000000..2727600a9 --- /dev/null +++ b/misc/system-services/org.deepin.dde.Apps1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Apps1 +Exec=/bin/false +SystemdService=deepin-accounts1-daemon.service \ No newline at end of file diff --git a/misc/system-services/org.deepin.dde.Authority1.service b/misc/system-services/org.deepin.dde.Authority1.service new file mode 100644 index 000000000..b2ed5d592 --- /dev/null +++ b/misc/system-services/org.deepin.dde.Authority1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Authority1 +Exec=/bin/false +SystemdService=deepin-authority.service diff --git a/misc/system-services/org.deepin.dde.BacklightHelper1.service b/misc/system-services/org.deepin.dde.BacklightHelper1.service new file mode 100644 index 000000000..d007e6b73 --- /dev/null +++ b/misc/system-services/org.deepin.dde.BacklightHelper1.service @@ -0,0 +1,5 @@ +[D-BUS Service] +Name=org.deepin.dde.BacklightHelper1 +Exec=/bin/false +User=root +SystemdService=deepin-helper-backlight.service diff --git a/misc/system-services/org.deepin.dde.Bluetooth1.service b/misc/system-services/org.deepin.dde.Bluetooth1.service new file mode 100644 index 000000000..5e5ddef25 --- /dev/null +++ b/misc/system-services/org.deepin.dde.Bluetooth1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Bluetooth1 +Exec=/bin/false +SystemdService=deepin-accounts1-daemon.service \ No newline at end of file diff --git a/misc/system-services/org.deepin.dde.Daemon1.service b/misc/system-services/org.deepin.dde.Daemon1.service new file mode 100644 index 000000000..6c0b6e986 --- /dev/null +++ b/misc/system-services/org.deepin.dde.Daemon1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Daemon1 +Exec=/bin/false +SystemdService=deepin-accounts1-daemon.service diff --git a/misc/system-services/org.deepin.dde.Display1.service b/misc/system-services/org.deepin.dde.Display1.service new file mode 100644 index 000000000..1e97450df --- /dev/null +++ b/misc/system-services/org.deepin.dde.Display1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Display1 +Exec=/bin/false +SystemdService=deepin-accounts1-daemon.service \ No newline at end of file diff --git a/misc/system-services/org.deepin.dde.Fprintd1.service b/misc/system-services/org.deepin.dde.Fprintd1.service new file mode 100644 index 000000000..f5b164f05 --- /dev/null +++ b/misc/system-services/org.deepin.dde.Fprintd1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Fprintd1 +Exec=/bin/false +SystemdService=deepin-accounts1-daemon.service diff --git a/misc/system-services/org.deepin.dde.Gesture1.service b/misc/system-services/org.deepin.dde.Gesture1.service new file mode 100644 index 000000000..a5157d360 --- /dev/null +++ b/misc/system-services/org.deepin.dde.Gesture1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Gesture1 +Exec=/bin/false +SystemdService=deepin-accounts1-daemon.service diff --git a/misc/system-services/org.deepin.dde.Greeter1.service b/misc/system-services/org.deepin.dde.Greeter1.service new file mode 100644 index 000000000..238358c63 --- /dev/null +++ b/misc/system-services/org.deepin.dde.Greeter1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Greeter1 +Exec=/bin/false +SystemdService=deepin-greeter-setter.service diff --git a/misc/system-services/org.deepin.dde.Grub2.service b/misc/system-services/org.deepin.dde.Grub2.service new file mode 100644 index 000000000..5191c653d --- /dev/null +++ b/misc/system-services/org.deepin.dde.Grub2.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Grub2 +Exec=/bin/false +SystemdService=deepin-grub2.service diff --git a/misc/system-services/org.deepin.dde.ImageEffect1.service b/misc/system-services/org.deepin.dde.ImageEffect1.service new file mode 100644 index 000000000..638f7f436 --- /dev/null +++ b/misc/system-services/org.deepin.dde.ImageEffect1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.ImageEffect1 +Exec=/bin/false +SystemdService=deepin-accounts1-daemon.service diff --git a/misc/system-services/org.deepin.dde.LockService1.service b/misc/system-services/org.deepin.dde.LockService1.service new file mode 100644 index 000000000..321b336eb --- /dev/null +++ b/misc/system-services/org.deepin.dde.LockService1.service @@ -0,0 +1,5 @@ +[D-BUS Service] +Name=org.deepin.dde.LockService1 +Exec=/bin/false +User=deepin-daemon +SystemdService=deepin-user-lock.service diff --git a/misc/system-services/org.deepin.dde.Network1.service b/misc/system-services/org.deepin.dde.Network1.service new file mode 100644 index 000000000..4a9111a6d --- /dev/null +++ b/misc/system-services/org.deepin.dde.Network1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Network1 +Exec=/bin/false +SystemdService=deepin-accounts1-daemon.service diff --git a/misc/system-services/org.deepin.dde.Power1.service b/misc/system-services/org.deepin.dde.Power1.service new file mode 100644 index 000000000..d01c22e6a --- /dev/null +++ b/misc/system-services/org.deepin.dde.Power1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Power1 +Exec=/bin/false +SystemdService=deepin-accounts1-daemon.service diff --git a/misc/system-services/org.deepin.dde.SwapSchedHelper1.service b/misc/system-services/org.deepin.dde.SwapSchedHelper1.service new file mode 100644 index 000000000..779110c71 --- /dev/null +++ b/misc/system-services/org.deepin.dde.SwapSchedHelper1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.SwapSchedHelper1 +Exec=/bin/false +SystemdService=deepin-accounts1-daemon.service diff --git a/misc/system-services/org.deepin.dde.Timedate1.service b/misc/system-services/org.deepin.dde.Timedate1.service new file mode 100644 index 000000000..16c7fc1a0 --- /dev/null +++ b/misc/system-services/org.deepin.dde.Timedate1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Timedate1 +Exec=/bin/false +SystemdService=deepin-accounts1-daemon.service diff --git a/misc/system-services/org.deepin.dde.Uadp1.service b/misc/system-services/org.deepin.dde.Uadp1.service new file mode 100644 index 000000000..384fe950c --- /dev/null +++ b/misc/system-services/org.deepin.dde.Uadp1.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.dde.Uadp1 +Exec=/bin/false +SystemdService=deepin-accounts1-daemon.service \ No newline at end of file diff --git a/misc/systemd/services/system/deepin-accounts1-daemon.service b/misc/systemd/services/system/deepin-accounts1-daemon.service new file mode 100644 index 000000000..b82fbcdc5 --- /dev/null +++ b/misc/systemd/services/system/deepin-accounts1-daemon.service @@ -0,0 +1,27 @@ +[Unit] +Description=Accounts Service + +# In order to avoid races with identity-providing services like SSSD or +# winbind, we need to ensure that Accounts Service starts after +# nss-user-lookup.target +After=nss-user-lookup.target lightdm.service +Wants=nss-user-lookup.target fprintd.service + +[Service] +Type=dbus +BusName=org.deepin.dde.Accounts1 +ExecStart=/usr/lib/deepin-daemon/dde-system-daemon +StandardOutput=null +StandardError=journal +Environment=GVFS_DISABLE_FUSE=1 +Environment=GIO_USE_VFS=local +Environment=GVFS_REMOTE_VOLUME_MONITOR_IGNORE=1 +CapabilityBoundingSet=~CAP_AUDIT_CONTROL +NoNewPrivileges=true + +[Install] +# We pull this in by graphical.target instead of waiting for the bus +# activation, to speed things up a little: gdm uses this anyway so it is nice +# if it is already around when gdm wants to use it and doesn't have to wait for +# it. +WantedBy=graphical.target diff --git a/misc/systemd/services/system/deepin-authority.service b/misc/systemd/services/system/deepin-authority.service new file mode 100644 index 000000000..a94305014 --- /dev/null +++ b/misc/systemd/services/system/deepin-authority.service @@ -0,0 +1,36 @@ +[Unit] +Description=Authority + +[Service] +Type=dbus +User=deepin-daemon +BusName=org.deepin.dde.Authority1 +ExecStart=/usr/lib/deepin-daemon/dde-authority +StandardOutput=null +StandardError=journal + +ProtectSystem=strict +# pam 校验密码需要访问 +#InaccessiblePaths=/etc/shadow +InaccessiblePaths=-/etc/NetworkManager/system-connections +# pam认证需要该配置 +#InaccessiblePaths=-/etc/pam.d +InaccessiblePaths=-/usr/share/uadp/ + +NoNewPrivileges=yes +ProtectHome=yes +ProtectKernelTunables=yes +ProtectKernelModules=yes +ProtectControlGroups=yes +PrivateMounts=yes +PrivateTmp=yes +PrivateDevices=yes +PrivateNetwork=yes +# 需要读取/proc的exe字段数据 +#PrivateUsers=yes +RestrictNamespaces=yes +LockPersonality=yes +RestrictRealtime=yes +RemoveIPC=yes +# 和golang -pie参数冲突,导致进程无法启动 +#MemoryDenyWriteExecute=yes diff --git a/misc/systemd/services/system/deepin-greeter-setter.service b/misc/systemd/services/system/deepin-greeter-setter.service new file mode 100644 index 000000000..e5cd22545 --- /dev/null +++ b/misc/systemd/services/system/deepin-greeter-setter.service @@ -0,0 +1,36 @@ +[Unit] +Description=deepin greeter setter service + +[Service] +Type=dbus +User=root +BusName=org.deepin.dde.Greeter1 +ExecStart=/usr/lib/deepin-daemon/dde-greeter-setter +StandardOutput=null +StandardError=journal + +ProtectSystem=strict +InaccessiblePaths=-/etc/shadow +InaccessiblePaths=-/etc/NetworkManager/system-connections +InaccessiblePaths=-/etc/pam.d +InaccessiblePaths=-/usr/share/uadp/ +# /etc/lightdm/deepin/qt-theme.ini文件为dde-session-shell安装 +ReadWritePaths=-/etc/lightdm/ + +NoNewPrivileges=yes +ProtectHome=yes +ProtectKernelTunables=yes +ProtectKernelModules=yes +ProtectControlGroups=yes +PrivateMounts=yes +PrivateTmp=yes +PrivateDevices=yes +PrivateNetwork=yes +# 需要读取/proc的exe字段数据 +#PrivateUsers=yes +RestrictNamespaces=yes +LockPersonality=yes +RestrictRealtime=yes +RemoveIPC=yes +# 和golang -pie参数冲突,导致进程无法启动 +#MemoryDenyWriteExecute=yes diff --git a/misc/systemd/services/system/deepin-grub2.service b/misc/systemd/services/system/deepin-grub2.service new file mode 100644 index 000000000..4aaa991ef --- /dev/null +++ b/misc/systemd/services/system/deepin-grub2.service @@ -0,0 +1,44 @@ +[Unit] +Description=deepin grub2 config service + +[Service] +Type=dbus +User=root +BusName=org.deepin.dde.Grub2 +ExecStart=/usr/lib/deepin-daemon/grub2 +StandardOutput=null +StandardError=journal + +ProtectSystem=strict +InaccessiblePaths=/etc/shadow +InaccessiblePaths=-/etc/NetworkManager/system-connections +InaccessiblePaths=-/etc/pam.d +InaccessiblePaths=-/usr/share/uadp/ +# 创建/etc/default/grub.d/11_dde.cfg +ReadWritePaths=-/etc/default/grub.d +# 创建/tmp/deepin-gfxmode-detect-ready // TODO分析该文件是否有被其他进程使用,该文件存放需要修改 +ReadWritePaths=-/tmp/ +# /var/cache/deepin/grub2.log +ReadWritePaths=-/var/cache/deepin +# /etc/grub.d/42_uos_menu_crypto +ReadWritePaths=-/etc/grub.d +ReadWritePaths=-/boot + +NoNewPrivileges=yes +ProtectHome=yes +ProtectKernelTunables=yes +ProtectKernelModules=yes +ProtectControlGroups=yes +PrivateMounts=yes +#PrivateTmp=yes +# /usr/sbin/grub-probe需要使用 +#PrivateDevices=yes +PrivateNetwork=yes +# 需要读取/proc的exe字段数据 +#PrivateUsers=yes +RestrictNamespaces=yes +LockPersonality=yes +RestrictRealtime=yes +RemoveIPC=yes +# 和golang -pie参数冲突,导致进程无法启动 +#MemoryDenyWriteExecute=yes diff --git a/misc/systemd/services/system/deepin-helper-backlight.service b/misc/systemd/services/system/deepin-helper-backlight.service new file mode 100644 index 000000000..3ebab4ebf --- /dev/null +++ b/misc/systemd/services/system/deepin-helper-backlight.service @@ -0,0 +1,37 @@ +[Unit] +Description=deepin backlight helper service + +[Service] +Type=dbus +BusName=org.deepin.dde.BacklightHelper1 +User=root +ExecStart=/usr/lib/deepin-daemon/backlight_helper +StandardOutput=null +StandardError=journal + +ProtectSystem=strict + +InaccessiblePaths=/etc/shadow +InaccessiblePaths=-/etc/NetworkManager/system-connections +InaccessiblePaths=-/etc/pam.d +InaccessiblePaths=-/usr/share/uadp/ +#ReadOnlyPaths=/lib +#ReadWritePaths=/sys/class + +NoNewPrivileges=yes +ProtectHome=yes +# 设置背光需要 +#ProtectKeirnelTunables=yes +ProtectKernelModules=yes +ProtectControlGroups=yes +PrivateMounts=yes +PrivateTmp=yes +# 背光设置需要 +#PrivateDevices=yes +PrivateNetwork=yes +PrivateUsers=yes +RestrictNamespaces=yes +LockPersonality=yes +RestrictRealtime=yes +RemoveIPC=yes +#MemoryDenyWriteExecute=yes diff --git a/misc/systemd/services/system/deepin-user-lock.service b/misc/systemd/services/system/deepin-user-lock.service new file mode 100644 index 000000000..cdca4c32b --- /dev/null +++ b/misc/systemd/services/system/deepin-user-lock.service @@ -0,0 +1,39 @@ +[Unit] +Description=deepin user lock service + +[Service] +Type=dbus +BusName=org.deepin.dde.LockService1 +ExecStart=/usr/lib/deepin-daemon/dde-lockservice +# display和lockservice都会读写/var/lib/lightdm/lightdm-deepin-greeter/state_user文件,因此无法将lockservice单独改为非root +#User=deepin-daemon +User=root +StandardOutput=journal +StandardError=journal + +ProtectSystem=strict +InaccessiblePaths=-/etc/shadow +InaccessiblePaths=-/etc/NetworkManager/system-connections +InaccessiblePaths=-/etc/pam.d +InaccessiblePaths=-/usr/share/uadp/ + +ReadWritePaths=-/var/lib/lightdm + +NoNewPrivileges=true +PrivateMounts=yes +ProtectHome=yes +ProtectKernelTunables=yes +ProtectKernelModules=yes +ProtectControlGroups=yes +PrivateMounts=yes +PrivateTmp=yes +PrivateDevices=yes +PrivateNetwork=yes +# 需要读取/proc的exe字段数据 +#PrivateUsers=yes +RestrictNamespaces=yes +LockPersonality=yes +RestrictRealtime=yes +RemoveIPC=yes +# 和golang -pie参数冲突,导致进程无法启动 +#MemoryDenyWriteExecute=yes diff --git a/misc/systemd/services/user/org.dde.session.Daemon1.service b/misc/systemd/services/user/org.dde.session.Daemon1.service new file mode 100644 index 000000000..bfc769dbe --- /dev/null +++ b/misc/systemd/services/user/org.dde.session.Daemon1.service @@ -0,0 +1,20 @@ +[Unit] +Description=dde-session-daemon service +RefuseManualStart=no +RefuseManualStop=no +CollectMode=inactive-or-failed + +Requisite=dde-session-pre.target +After=dde-session-pre.target + +Requisite=dde-session-initialized.target +PartOf=dde-session-initialized.target +Before=dde-session-initialized.target + +[Service] +Type=dbus +BusName=org.deepin.dde.XEventMonitor1 +ExecStart=/usr/lib/deepin-daemon/dde-session-daemon +Slice=app.slice +Restart=on-failure +NotifyAccess=main diff --git a/misc/systemd/services/deepin-accounts-daemon.service b/misc/systemd/system-services/deepin-accounts1-daemon.service similarity index 87% rename from misc/systemd/services/deepin-accounts-daemon.service rename to misc/systemd/system-services/deepin-accounts1-daemon.service index c2d33a554..c3fe2b1a4 100644 --- a/misc/systemd/services/deepin-accounts-daemon.service +++ b/misc/systemd/system-services/deepin-accounts1-daemon.service @@ -1,5 +1,5 @@ [Unit] -Description=Accounts Service +Description=Accounts1 Service # In order to avoid races with identity-providing services like SSSD or # winbind, we need to ensure that Accounts Service starts after @@ -9,9 +9,10 @@ Wants=nss-user-lookup.target fprintd.service [Service] Type=dbus -BusName=com.deepin.daemon.Accounts +BusName=org.deepin.dde.Accounts1 ExecStart=/usr/lib/deepin-daemon/dde-system-daemon -StandardOutput=syslog +StandardOutput=null +StandardError=journal Environment=GVFS_DISABLE_FUSE=1 Environment=GIO_USE_VFS=local Environment=GVFS_REMOTE_VOLUME_MONITOR_IGNORE=1 diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ady.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_ady.ts deleted file mode 100644 index fce9d66a5..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ady.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_af_ZA.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_af_ZA.ts deleted file mode 100644 index da5a802ad..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_af_ZA.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_am_ET.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_am_ET.ts deleted file mode 100644 index c29e8645d..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_am_ET.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ar_EG.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_ar_EG.ts deleted file mode 100644 index 62803cbc2..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ar_EG.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ast.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_ast.ts deleted file mode 100644 index 1ce90c4a0..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ast.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_az.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_az.ts deleted file mode 100644 index 0387bf4ea..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_az.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_bqi.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_bqi.ts deleted file mode 100644 index 74cf574cf..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_bqi.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ca.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_ca.ts deleted file mode 100644 index ecf27cfab..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ca.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_cgg.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_cgg.ts deleted file mode 100644 index 0ec50df9a..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_cgg.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_de_CH.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_de_CH.ts deleted file mode 100644 index d453618d0..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_de_CH.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_de_DE.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_de_DE.ts deleted file mode 100644 index d41e612d6..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_de_DE.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_el_GR.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_el_GR.ts deleted file mode 100644 index bf26a48fc..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_el_GR.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_en_AU.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_en_AU.ts deleted file mode 100644 index 8217c4a4a..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_en_AU.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_en_GB.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_en_GB.ts deleted file mode 100644 index 8b23918ed..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_en_GB.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_en_NO.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_en_NO.ts deleted file mode 100644 index 62c6600c8..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_en_NO.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_en_US.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_en_US.ts deleted file mode 100644 index c9350c145..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_en_US.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_es.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_es.ts deleted file mode 100644 index e47f748a4..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_es.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_fi.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_fi.ts deleted file mode 100644 index 571f0211e..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_fi.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_fil.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_fil.ts deleted file mode 100644 index f09e86571..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_fil.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_gl_ES.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_gl_ES.ts deleted file mode 100644 index 65cce4e5a..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_gl_ES.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_hi_IN.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_hi_IN.ts deleted file mode 100644 index 6e76d936b..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_hi_IN.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_id_ID.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_id_ID.ts deleted file mode 100644 index 181f4277e..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_id_ID.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_kab.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_kab.ts deleted file mode 100644 index 4a3ad53c0..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_kab.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_km_KH.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_km_KH.ts deleted file mode 100644 index 5460d550e..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_km_KH.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_kn_IN.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_kn_IN.ts deleted file mode 100644 index 7e84d8902..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_kn_IN.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ku_IQ.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_ku_IQ.ts deleted file mode 100644 index 9f0184ca0..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ku_IQ.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ky@Arab.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_ky@Arab.ts deleted file mode 100644 index 971ea86aa..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ky@Arab.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_pam.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_pam.ts deleted file mode 100644 index c499c6a04..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_pam.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_pt_BR.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_pt_BR.ts deleted file mode 100644 index 2ed80967d..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_pt_BR.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ru_UA.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_ru_UA.ts deleted file mode 100644 index e7997dd30..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ru_UA.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_sv_SE.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_sv_SE.ts deleted file mode 100644 index 04a0c4613..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_sv_SE.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_tzm.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_tzm.ts deleted file mode 100644 index 592a483c1..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_tzm.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ug.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_ug.ts deleted file mode 100644 index f19c73822..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ug.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_uk.ts b/misc/ts/com.deepin.daemon.Grub2.policy/policy_uk.ts deleted file mode 100644 index 5c5bd1cc7..000000000 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_uk.ts +++ /dev/null @@ -1,25 +0,0 @@ - - - policy - - - Authentication is required to change the grub configuration - - - - - Change the grub configuration - - - - - Authentication is required to prepare grub display resolution detection - - - - - Prepare grub display resolution detection - - - - \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy.ts similarity index 66% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy.ts index c0738cbf8..ef05ded06 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Authentication is required to add fingerprint password - + Add fingerprint password Add fingerprint password - + Authentication is required to clear fingerprint passwords Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords Clear fingerprint passwords - + Authentication is required to rename fingerprint password Authentication is required to rename fingerprint password - + Rename fingerprint password Rename fingerprint password - + Password is required to perform this action Password is required to perform this action - + Manage fingerprint passwords Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ady.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ady.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ady.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ady.ts index ce3649775..8d360570e 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ady.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ady.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_af.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_af.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_af.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_af.ts index 665ca0158..2606787f1 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_af.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_af.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_af_ZA.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_af_ZA.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_af_ZA.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_af_ZA.ts index 013275491..7c16058c7 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_af_ZA.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_af_ZA.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ak.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ak.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ak.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ak.ts index f32ed6e1f..50889b38a 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ak.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ak.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_am.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_am.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_am.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_am.ts index 2b294ae11..7dd2b6516 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_am.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_am.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_am_ET.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_am_ET.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_am_ET.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_am_ET.ts index 7002c0983..a22629853 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_am_ET.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_am_ET.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ar.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ar.ts similarity index 67% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ar.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ar.ts index b71e2c5de..c9d8c9fdf 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ar.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ar.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password المصادقة ضرورية لإضافة كلمة مرور بالبصمة - + Add fingerprint password إضافة كلمة مرور ببصمة الأصبع - + Authentication is required to clear fingerprint passwords المصادقة ضرورية لحذف كلمات المرور بالبصمة - + Clear fingerprint passwords حذف كلمات المرور بالبصمة - + Authentication is required to rename fingerprint password المصادقة ضرورية لإعادة تسمية كلمة المرور بالبصمة - + Rename fingerprint password إعادة تسمية كلمة المرور بالبصمة - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ar_EG.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ar_EG.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ar_EG.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ar_EG.ts index 42e34dc9e..9df82e85d 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ar_EG.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ar_EG.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ast.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ast.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ast.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ast.ts index 2605b424f..574168288 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ast.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ast.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_az.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_az.ts similarity index 68% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_az.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_az.ts index 603f4c86d..c8cb98f45 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_az.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_az.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Barmaq izi şifrəsini əlavə etmək üçün doğrulama tələb edilir - + Add fingerprint password Barmaq izi şifrəsi əlavə etmək - + Authentication is required to clear fingerprint passwords Barmaq izi şifrəsini silmək üçün doğrulama tələb edilir - + Clear fingerprint passwords Barmaq izi şifrəsini silmək - + Authentication is required to rename fingerprint password Barmaq izi şifrəsinin adını dəyişmək üçün doğrulama tələb edilir - + Rename fingerprint password Barmaq izi şifrəsinin adını dəyişmək - + Password is required to perform this action Bu əməlin icra edilməsi üçün şifrə tələb olunur - + Manage fingerprint passwords Barmaq izi şifrələrinin idarə edilməsi diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_bg.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_bg.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_bg.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_bg.ts index e78d823cf..e93d960de 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_bg.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_bg.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_bn.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_bn.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_bn.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_bn.ts index 1eaf76c06..51f35aab3 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_bn.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_bn.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_bo.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_bo.ts similarity index 72% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_bo.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_bo.ts index 2f4ded676..738f881c2 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_bo.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_bo.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password མཛུབ་རིས་སྣོན་པར་ར་སྤྲོད་བྱེད་དགོས། - + Add fingerprint password མཛུབ་རིས་གསང་ཨང་སྣོན་པ། - + Authentication is required to clear fingerprint passwords མཛུབ་རིས་མེད་པ་བཟོ་ཚེ་ར་སྤྲོད་བྱེད་དགོས། - + Clear fingerprint passwords མཛུབ་རིས་གསང་ཨང་མེད་པར་བཟོ་བ། - + Authentication is required to rename fingerprint password མཛུབ་རིས་བསྐྱར་དུ་འདོགས་ཚེ་ར་སྤྲོད་བྱེད་དགོས། - + Rename fingerprint password མཛུབ་རིས་མིང་བསྐྱར་དུ་འདོགས་པ། - + Password is required to perform this action གསང་ཨང་བཅུག་རྗེས་བཀོལ་སྤྱོད་འདི་ལག་བསྟར་བྱེད་པ། - + Manage fingerprint passwords མཛུབ་རིས་གསང་ཨང་དོ་དམ། diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_bqi.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_bqi.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_bqi.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_bqi.ts index 06b281768..7c12da9c2 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_bqi.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_bqi.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_br.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_br.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_br.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_br.ts index ec65d571f..86637fefa 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_br.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_br.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ca.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ca.ts similarity index 67% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ca.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ca.ts index 8bcc7aad5..6ce0e07cc 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ca.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ca.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Cal autenticació per afegir una contrasenya d'empremta. - + Add fingerprint password Afegiu una contrasenya d'empremta - + Authentication is required to clear fingerprint passwords Cal autenticació per netejar contrasenyes d'empremta. - + Clear fingerprint passwords Neteja les contrasenyes d'empremta - + Authentication is required to rename fingerprint password Cal autenticació per canviar de nom una contrasenya d'empremta. - + Rename fingerprint password Canvia de nom la contrasenya d'empremta - + Password is required to perform this action Cal la contrasenya per realitzar aquesta acció - + Manage fingerprint passwords Gestiona les contrasenyes d'empremta diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_cgg.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_cgg.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_cgg.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_cgg.ts index 11ac3fcfe..5c4cdd01e 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_cgg.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_cgg.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_cs.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_cs.ts similarity index 68% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_cs.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_cs.ts index 641fcc79b..0dc99e7dc 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_cs.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_cs.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Pro přidání hesla zastupovaného otiskem prstu je požadováno ověření se - + Add fingerprint password Přidat heslo zastupované otiskem prstu - + Authentication is required to clear fingerprint passwords Pro smazání hesel zastupovaných otiskem prstu je požadováno ověření se - + Clear fingerprint passwords Smazat hesla zastupovaná otiskem prstu - + Authentication is required to rename fingerprint password Pro přejmenování hesla, zastupovaného otiskem prstu, je požadováno ověření se - + Rename fingerprint password Přejmenovat heslo zastupované otiskem prstu - + Password is required to perform this action Pro provedení této akce je zapotřebí zadat heslo - + Manage fingerprint passwords Spravovat hesla zastupovaná otiskem prstu diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_da.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_da.ts similarity index 66% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_da.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_da.ts index cd364cbf5..7f980006b 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_da.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_da.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Der kræves autentifikation for at tilføje fingeraftryksadgangskode - + Add fingerprint password Tilføj fingeraftryksadgangskode - + Authentication is required to clear fingerprint passwords Der kræves autentifikation for at rydde fingeraftryksadgangskoder - + Clear fingerprint passwords Ryd fingeraftryksadgangskoder - + Authentication is required to rename fingerprint password Der kræves autentifikation for at omdøbe fingeraftryksadgangskode - + Rename fingerprint password Omdøb fingeraftryksadgangskode - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_de.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_de.ts similarity index 68% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_de.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_de.ts index 420791545..720712006 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_de.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_de.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Zum Hinzufügen des Fingerabdruckpassworts ist eine Authentifizierung erforderlich - + Add fingerprint password Fingerabdruckpasswort hinzufügen - + Authentication is required to clear fingerprint passwords Zum Löschen von Fingerabdruckpasswörtern ist eine Authentifizierung erforderlich - + Clear fingerprint passwords Fingerabdruckpasswörter löschen - + Authentication is required to rename fingerprint password Zum Umbenennen des Fingerabdruckpassworts ist eine Authentifizierung erforderlich - + Rename fingerprint password Fingerabdruckpasswort umbenennen - + Password is required to perform this action Zur Durchführung dieser Aktion ist ein Passwort erforderlich - + Manage fingerprint passwords Fingerabdruckpasswörter verwalten diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_de_CH.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_de_CH.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_de_CH.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_de_CH.ts index ab08f08da..6330c61d0 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_de_CH.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_de_CH.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_de_DE.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_de_DE.ts similarity index 67% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_de_DE.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_de_DE.ts index 1bb90c194..8dfc2e688 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_de_DE.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_de_DE.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Sie müssen sich authentifizieren, um das Anmelden per Fingerabdruck hinzuzufügen - + Add fingerprint password Fingerabdruck-Daten hinzufügen - + Authentication is required to clear fingerprint passwords Sie müssen sich authentifizieren, um die Fingerabdruck-Daten zu löschen - + Clear fingerprint passwords Fingerabdruck-Daten löschen - + Authentication is required to rename fingerprint password Sie müssen sich authentifizieren, um Fingerabdruck-Daten neu zu benennen - + Rename fingerprint password Fingerabdruck-Daten neu benennen - + Password is required to perform this action Sie müssen das Passwort eingeben, um diese Aktion auszuführen - + Manage fingerprint passwords Fingerabdruck-Daten verwalten diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_el.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_el.ts similarity index 71% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_el.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_el.ts index dd623f477..eed9bdcb1 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_el.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_el.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Απαιτείται πιστοποίηση για προσθήκη κωδικού αποτυπώματος - + Add fingerprint password Προσθήκη κωδικού αποτυπώματος - + Authentication is required to clear fingerprint passwords Απαιτείται πιστοποίηση για διαγραφή κωδικών αποτυπώματος - + Clear fingerprint passwords Διαγραφή κωδικών αποτυπωμάτων - + Authentication is required to rename fingerprint password Απαιτείται πιστοποίηση για μετονομασία κωδικού αποτυπώματος - + Rename fingerprint password Μετονομασία κωδικού αποτυπώματος - + Password is required to perform this action Απαιτείται κωδικός για εκτέλεση αυτής της ενέργειας - + Manage fingerprint passwords Διαχείρηση κωδικών αποτυπωμάτων diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_el_GR.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_el_GR.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_el_GR.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_el_GR.ts index ab9b99743..4c6054be4 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_el_GR.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_el_GR.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_en_AU.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_en_AU.ts similarity index 66% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_en_AU.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_en_AU.ts index d8d54a4b2..50e7d9547 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_en_AU.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_en_AU.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Authentication is required to add fingerprint password - + Add fingerprint password Add fingerprint password - + Authentication is required to clear fingerprint passwords Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords Clear fingerprint passwords - + Authentication is required to rename fingerprint password Authentication is required to rename fingerprint password - + Rename fingerprint password Rename fingerprint password - + Password is required to perform this action Password is required to perform this action - + Manage fingerprint passwords Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_en_GB.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_en_GB.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_en_GB.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_en_GB.ts index ea703f575..1beedc81f 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_en_GB.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_en_GB.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_en_NO.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_en_NO.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_en_NO.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_en_NO.ts index c70fb702d..bb3d647ff 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_en_NO.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_en_NO.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_en_US.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_en_US.ts similarity index 66% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_en_US.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_en_US.ts index b0595cf62..c29aa7fad 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_en_US.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_en_US.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Authentication is required to add fingerprint password - + Add fingerprint password Add fingerprint password - + Authentication is required to clear fingerprint passwords Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords Clear fingerprint passwords - + Authentication is required to rename fingerprint password Authentication is required to rename fingerprint password - + Rename fingerprint password Rename fingerprint password - + Password is required to perform this action Password is required to perform this action - + Manage fingerprint passwords Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_eo.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_eo.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_eo.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_eo.ts index 7b3736f62..f63003848 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_eo.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_eo.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_es.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_es.ts similarity index 68% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_es.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_es.ts index 557405d51..d4e1e8597 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_es.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_es.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Se requiere autenticación para añadir contraseña de huella dactilar - + Add fingerprint password Añadir contraseña de huella dactilar - + Authentication is required to clear fingerprint passwords Se requiere autenticación para borrar contraseñas de huellas dactilares. - + Clear fingerprint passwords Borrar contraseñas de huellas dactilares - + Authentication is required to rename fingerprint password Se requiere autenticación para renombrar la contraseña huella dactilar - + Rename fingerprint password Renombrar contraseña de huella dactilar - + Password is required to perform this action Se requiere contraseña para realizar esta acción - + Manage fingerprint passwords Administrar contraseñas de huellas digitales diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_es_MX.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_es_MX.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_es_MX.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_es_MX.ts index 8933253d9..725288301 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_es_MX.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_es_MX.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_et.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_et.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_et.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_et.ts index da46fbb62..4c5b1cd3c 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_et.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_et.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_eu.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_eu.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_eu.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_eu.ts index 69b09357e..afd82886a 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_eu.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_eu.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_fa.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_fa.ts similarity index 66% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_fa.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_fa.ts index bf53a1b7c..c2a6b54aa 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_fa.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_fa.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password برای اضافه کردن رمزعبور اثر انگشت ، احراز هویت لازم است - + Add fingerprint password اضافه کردن رمزعبور اثر انگشت - + Authentication is required to clear fingerprint passwords برای پاک کردن رمزهای عبور اثر انگشت ، احراز هویت لازم است - + Clear fingerprint passwords رمزهای عبور اثر انگشت را پاک کن - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_fi.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_fi.ts similarity index 66% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_fi.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_fi.ts index 50d9ce184..373b74b95 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_fi.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_fi.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Sormenjälkitunnuksen lisääminen edellyttää todennusta - + Add fingerprint password Lisää sormenjälki salasanaksi - + Authentication is required to clear fingerprint passwords Sormenjälkien tyhjentäminen edellyttää todennusta - + Clear fingerprint passwords Tyhjennä sormenjäljet - + Authentication is required to rename fingerprint password Nimeä sormenjälki uudelleen, tämä vaatii tunnistautumisen - + Rename fingerprint password Nimeä sormenjäljen salasana uudelleen - + Password is required to perform this action Tämän suorittamiseen tarvitaan salasana - + Manage fingerprint passwords Hallitse sormenjälkien tunnuksia diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_fil.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_fil.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_fil.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_fil.ts index aed2473d3..dfbee5f23 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_fil.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_fil.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_fr.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_fr.ts similarity index 68% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_fr.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_fr.ts index dac5a03db..089f7bb81 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_fr.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_fr.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Une authentification est requise pour ajouter une empreinte digitale comme mot de passe - + Add fingerprint password Ajouter une empreinte digitale comme mot de passe - + Authentication is required to clear fingerprint passwords Une authentification est requise pour effacer les empreintes digitales enregistrées - + Clear fingerprint passwords Effacer les empreintes digitales enregistrées - + Authentication is required to rename fingerprint password Une authentification est requise pour changer le mot de passe d'une empreinte digitale - + Rename fingerprint password Changer le mot de passe d'une empreinte digitale - + Password is required to perform this action Mot de passe requis pour effectuer cette action - + Manage fingerprint passwords Gérer les empreintes digitales diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_gl.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_gl.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_gl.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_gl.ts index 913f05304..fa7b561c5 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_gl.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_gl.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_gl_ES.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_gl_ES.ts similarity index 68% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_gl_ES.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_gl_ES.ts index 376c5308e..d4ab6f0d3 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_gl_ES.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_gl_ES.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Requírese autenticación para engadir un contrasinal para a pegada dixital - + Add fingerprint password Engadir un contrasinal para a pegada dixital - + Authentication is required to clear fingerprint passwords Requírese autenticación para eliminar os contrasinais das pegadas dixitais - + Clear fingerprint passwords Eliminar os contrasinais das pegadas dixitais - + Authentication is required to rename fingerprint password Requírese autenticación para mudar o contrasinal da pegada dixital - + Rename fingerprint password Mudar o contrasinal da pegada dixital - + Password is required to perform this action Requírese un contrasinal para realizar esta acción - + Manage fingerprint passwords Xestionar contrasinais de pegadas dixitais diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_he.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_he.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_he.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_he.ts index fc0054359..99558abce 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_he.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_he.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_hi_IN.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_hi_IN.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_hi_IN.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_hi_IN.ts index d4b1c3bfe..284ed6b24 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_hi_IN.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_hi_IN.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_hr.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_hr.ts similarity index 66% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_hr.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_hr.ts index 98e797667..ab22a6eb6 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_hr.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_hr.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Potrebna je ovjera za dodavanje lozinke otiska prsta - + Add fingerprint password Dodaj lozinku otiska prsta - + Authentication is required to clear fingerprint passwords Potrebna je ovjera za čišćenje lozinki otiska prsta - + Clear fingerprint passwords Očisti lozinke otiska prsta - + Authentication is required to rename fingerprint password Potrebna je ovjera za preimenovanje lozinke otiska prsta - + Rename fingerprint password Preimenuj lozinku otiska prsta - + Password is required to perform this action Potrebna je lozinka da bi ste izveli ovu radnju - + Manage fingerprint passwords Upravljajte lozinkama otiska prsta diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_hu.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_hu.ts similarity index 67% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_hu.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_hu.ts index 6cfb510f6..bb87933d2 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_hu.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_hu.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Hitelesítés szükséges az ujjlenyomat azonosítók hozzáadásához - + Add fingerprint password Ujjlenyomat azonosító hozzáadása - + Authentication is required to clear fingerprint passwords Hitelesítés szükséges az ujjlenyomat azonosítók törléséhez - + Clear fingerprint passwords Ujjlenyomatok törlése - + Authentication is required to rename fingerprint password Hitelesítés szükséges az ujjlenyomat azonosító átnevezéséhez - + Rename fingerprint password Ujjlenyomat azonosító átnevezése - + Password is required to perform this action A művelet végrehajtásához jelszó szükséges - + Manage fingerprint passwords Ujjlenyomat azonosítók kezelése diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_hy.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_hy.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_hy.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_hy.ts index 6e77b3b22..47960a52e 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_hy.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_hy.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_id.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_id.ts similarity index 66% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_id.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_id.ts index de41779f3..72f6de7eb 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_id.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_id.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Otentikasi diperlukan untuk menambahkan password sidik jari - + Add fingerprint password Tambah password sidik jari - + Authentication is required to clear fingerprint passwords Otentikasi diperlukan untuk membersihkan password sidik jari - + Clear fingerprint passwords Bersihkan password sidik jari - + Authentication is required to rename fingerprint password Otentikasi diperlukan untuk mengganti nama password sidik jari - + Rename fingerprint password Ubah nama password sidik jari - + Password is required to perform this action Kata sandi diperlukan untuk melakukan tindakan ini - + Manage fingerprint passwords Kelola password sidik jari diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_id_ID.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_id_ID.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_id_ID.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_id_ID.ts index f2525da28..4676d00c1 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_id_ID.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_id_ID.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_it.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_it.ts similarity index 67% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_it.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_it.ts index de863d62d..d6622b2a1 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_it.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_it.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Autenticazione richiesta per aggiungere l'impronta digitale come password - + Add fingerprint password Aggiungi impronta digitale come password - + Authentication is required to clear fingerprint passwords Autenticazione richiesta per eliminare l'impronta digitale come password - + Clear fingerprint passwords Cancella impronte digitali utilizzare come password - + Authentication is required to rename fingerprint password Autenticazione richiesta per rinominare l'impronta digitale - + Rename fingerprint password Rinomina l'impronta digitale - + Password is required to perform this action Password richiesta per questa operazione - + Manage fingerprint passwords Gestisci le impronte digitali diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ja.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ja.ts similarity index 67% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ja.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ja.ts index c849a4a04..45209f007 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ja.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ja.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password 指紋パスワードを追加するには認証が必要です - + Add fingerprint password 指紋パスワードを追加 - + Authentication is required to clear fingerprint passwords 指紋パスワードを削除するには認証が必要です - + Clear fingerprint passwords 指紋パスワードを削除 - + Authentication is required to rename fingerprint password 指紋パスワードの名前を変更するには認証が必要です - + Rename fingerprint password 指紋パスワードの名前を変更 - + Password is required to perform this action この操作にはパスワードが必要です - + Manage fingerprint passwords 指紋パスワードを管理 diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ka.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ka.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ka.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ka.ts index 4c9ec0982..32fbd5b66 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ka.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ka.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_kab.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_kab.ts similarity index 66% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_kab.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_kab.ts index 841436618..4d6f7e510 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_kab.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_kab.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Asesteb yettusra i tmerna n wawal uffir n udsil umḍin - + Add fingerprint password Rnu awal uffir n udsil umḍin - + Authentication is required to clear fingerprint passwords Asesteb yettusra i usfaḍ n wawalen uffiren n udsil umḍin - + Clear fingerprint passwords Sfeḍ wawalen uffiren n udsil umḍin - + Authentication is required to rename fingerprint password Asesteb yettusra i ubeddel n yisem - + Rename fingerprint password Beddl isem i wawal uffir n udsil umḍin - + Password is required to perform this action Yettusra wawal uffir i uselken n tigawt-a - + Manage fingerprint passwords Sefrek awalen uffiren n udsil umḍin diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_kk.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_kk.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_kk.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_kk.ts index d2ce512de..579babc1d 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_kk.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_kk.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_km_KH.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_km_KH.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_km_KH.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_km_KH.ts index d6f2c0425..3edefba36 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_km_KH.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_km_KH.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_kn_IN.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_kn_IN.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_kn_IN.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_kn_IN.ts index 7546c5c38..6ae92ddd9 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_kn_IN.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_kn_IN.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ko.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ko.ts similarity index 66% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ko.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ko.ts index ec7f61d50..b6cb3f219 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ko.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ko.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password 지문 암호를 추가하려면 인증이 필요합니다 - + Add fingerprint password 지문 암호 추가 - + Authentication is required to clear fingerprint passwords 지문 암호를 지우려면 인증이 필요합니다 - + Clear fingerprint passwords 지문 암호 지우기 - + Authentication is required to rename fingerprint password 지문 암호의 이름을 변경하려면 인증이 필요함 - + Rename fingerprint password 지문 암호 이름 변경 - + Password is required to perform this action 이 작업을 수행하려면 암호가 필요함 - + Manage fingerprint passwords 지문 암호 관리 diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ku.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ku.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ku.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ku.ts index 76eedb64e..b7ab0e75b 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ku.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ku.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ku_IQ.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ku_IQ.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ku_IQ.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ku_IQ.ts index 1c687b0a2..f7048771f 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ku_IQ.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ku_IQ.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ky.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ky.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ky.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ky.ts index 54cf19cf6..801791138 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ky.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ky.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ky@Arab.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ky@Arab.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ky@Arab.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ky@Arab.ts index 7d72458e9..33073200e 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ky@Arab.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ky@Arab.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_la.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_la.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_la.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_la.ts index 390e9c88c..6e102ba94 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_la.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_la.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_lo.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_lo.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_lo.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_lo.ts index 796318289..a54d47921 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_lo.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_lo.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_lt.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_lt.ts similarity index 65% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_lt.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_lt.ts index ccbcca9d9..df512e50d 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_lt.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_lt.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Norint pridėti piršto atspaudo slaptažodį, reikalingas tapatybės nustatymas - + Add fingerprint password Pridėti piršto atspaudo slaptažodį - + Authentication is required to clear fingerprint passwords Norint išvalyti piršto atspaudo slaptažodžius, reikalingas tapatybės nustatymas - + Clear fingerprint passwords Išvalyti piršto atspaudo slaptažodžius - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_lv.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_lv.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_lv.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_lv.ts index 97748ced0..4b67bd2bd 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_lv.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_lv.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ml.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ml.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ml.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ml.ts index d63bb8a75..422b4d0c0 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ml.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ml.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_mn.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_mn.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_mn.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_mn.ts index 9b1bddd38..8ad8d7c44 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_mn.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_mn.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_mr.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_mr.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_mr.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_mr.ts index 34bedfc7e..6a9309f22 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_mr.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_mr.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ms.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ms.ts similarity index 67% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ms.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ms.ts index 625cec59f..419b6161f 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ms.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ms.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Pengesahihan diperlukan untuk menambah kata laluan cap jari - + Add fingerprint password Tambah kata laluan cap jari - + Authentication is required to clear fingerprint passwords Pengesahihan diperlukan untuk mengosongkan kata laluan cap jari - + Clear fingerprint passwords Kosongkan kata laluan cap jari - + Authentication is required to rename fingerprint password Pengesahihan diperlukan untuk menamakan semula kata laluan cap jari - + Rename fingerprint password Namakan semula kata laluan cap jari - + Password is required to perform this action Kata laluan diperlukan untuk membuat tindakan ini - + Manage fingerprint passwords Urus kata laluan cap jari diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_nb.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_nb.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_nb.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_nb.ts index b78dd034b..13bb14ace 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_nb.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_nb.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ne.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ne.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ne.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ne.ts index ebb914065..24a2b41cc 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ne.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ne.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_nl.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_nl.ts similarity index 66% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_nl.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_nl.ts index 706a5a59c..eab74e2f7 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_nl.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_nl.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Authenticatie vereist om vingerafdrukken toe te voegen - + Add fingerprint password Wachtwoord voor vingerafdrukken toevoegen - + Authentication is required to clear fingerprint passwords Authenticatie vereist om vingerafdrukken te wissen - + Clear fingerprint passwords Vingerafdrukken wissen - + Authentication is required to rename fingerprint password Authenticatie is vereist om vingerafdruknamen te wijzigen - + Rename fingerprint password Vingerafdruknamen wijzigen - + Password is required to perform this action Voer je wachtwoord in om deze actie uit te voeren - + Manage fingerprint passwords Vingerafdrukwachtwoorden beheren diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_pa.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_pa.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_pa.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_pa.ts index 5131c6702..124e57547 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_pa.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_pa.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_pam.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_pam.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_pam.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_pam.ts index cb2d6365b..649872860 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_pam.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_pam.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_pl.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_pl.ts similarity index 67% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_pl.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_pl.ts index d40ab33db..6adcc8d96 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_pl.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_pl.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Wymagane jest uwierzytelnienie do dodania hasła odcisku palca - + Add fingerprint password Dodaj hasło odcisku palca - + Authentication is required to clear fingerprint passwords Wymagane jest uwierzytelnienie do wyczyszczenia haseł odcisków palców - + Clear fingerprint passwords Wyczyść hasła odcisków palców - + Authentication is required to rename fingerprint password Wymagane jest uwierzytelnienie do zmiany nazwy hasła odcisku palca - + Rename fingerprint password Zmień nazwę hasła odcisku palca - + Password is required to perform this action Do wykonania tej czynności wymagane jest hasło - + Manage fingerprint passwords Zarządzaj hasłami odcisków palców diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ps.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ps.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ps.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ps.ts index d8ec15bca..ea0731003 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ps.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ps.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_pt.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_pt.ts similarity index 68% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_pt.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_pt.ts index 1a0f144f1..806683130 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_pt.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_pt.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password É necessária a autenticação para adicionar palavra-passe de impressão digital - + Add fingerprint password Adicionar palavra-passe de impressão digital - + Authentication is required to clear fingerprint passwords É necessária a autenticação para limpar palavras-passe de impressões digitais - + Clear fingerprint passwords Limpar palavras-passe de impressão digital - + Authentication is required to rename fingerprint password É necessária a autenticação para renomear a palavra-passe de impressão digital - + Rename fingerprint password Renomear a palavra-passe de impressão digital - + Password is required to perform this action Para realizar esta ação é necessária uma palavra-passe - + Manage fingerprint passwords Gerir as palavras-passe das impressões digitais diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_pt_BR.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_pt_BR.ts similarity index 67% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_pt_BR.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_pt_BR.ts index 378a230d8..9ec839ab5 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_pt_BR.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_pt_BR.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password A autenticação é necessária para adicionar a impressão digital - + Add fingerprint password Adicionar impressão digital - + Authentication is required to clear fingerprint passwords A autenticação é necessária para remover as impressões digitais - + Clear fingerprint passwords Remover as impressões digitais - + Authentication is required to rename fingerprint password A autenticação é necessária para renomear a impressão digital - + Rename fingerprint password Renomear impressão digital - + Password is required to perform this action A senha é necessária para executar esta ação - + Manage fingerprint passwords Gerenciar senhas por impressão digital diff --git a/misc/ts/org.deepin.dde.Fprintd1.policy/policy_qu.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_qu.ts new file mode 100644 index 000000000..75a0aab3f --- /dev/null +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_qu.ts @@ -0,0 +1,45 @@ + + + policy + + + Authentication is required to add fingerprint password + + + + + Add fingerprint password + + + + + Authentication is required to clear fingerprint passwords + + + + + Clear fingerprint passwords + + + + + Authentication is required to rename fingerprint password + + + + + Rename fingerprint password + + + + + Password is required to perform this action + + + + + Manage fingerprint passwords + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ro.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ro.ts similarity index 66% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ro.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ro.ts index 36a2bbad4..1d52070dc 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ro.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ro.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Autentificare necesară pentru adăugare parolă amprentă - + Add fingerprint password Adaugă parolă amprentă - + Authentication is required to clear fingerprint passwords Autentificare necesară pentru ştergere parolă amprentă - + Clear fingerprint passwords Ștergere parolă amprentă - + Authentication is required to rename fingerprint password Autentificare necesară pentru redenumire parolă amprentă - + Rename fingerprint password Redenumește parolă cu amprentă - + Password is required to perform this action Parolă necesară să efectuați această acțiune - + Manage fingerprint passwords Administrează parole cu amprentă diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ru.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ru.ts similarity index 72% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ru.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ru.ts index 6f9d5f04e..f77b65099 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ru.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ru.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Требуется аутентификация для добавления пароля по отпечатку пальца - + Add fingerprint password Добавить пароль по отпечатку пальца - + Authentication is required to clear fingerprint passwords Требуется аутентификация для очистки паролей по отпечатку пальца - + Clear fingerprint passwords Очистка паролей по отпечатку пальца - + Authentication is required to rename fingerprint password Требуется аутентификация для переименования пароля отпечатка пальца - + Rename fingerprint password Переименовать пароль отпечатка пальца - + Password is required to perform this action Необходим пароль для выполнения этого действия - + Manage fingerprint passwords Управление паролями отпечатков пальцев diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ru_UA.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ru_UA.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ru_UA.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ru_UA.ts index fa2f30bb2..5d03bf1c6 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ru_UA.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ru_UA.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_sc.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_sc.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_sc.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_sc.ts index b67fdf774..34ca6c1fd 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_sc.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_sc.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_si.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_si.ts similarity index 73% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_si.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_si.ts index 2e93c5960..77ddceb7b 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_si.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_si.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password ඇඟිලි සලකුණු මුරපදය එක් කිරීමට සත්‍යාපනය අවශ්‍ය වේ - + Add fingerprint password ඇඟිලි සලකුණු මුරපදය එක් කරන්න - + Authentication is required to clear fingerprint passwords ඇඟිලි සලකුණු මුරපදය ඉවත් කිරීමට සත්‍යාපනය අවශ්‍ය වේ - + Clear fingerprint passwords ඇඟිලි සලකුණු මුරපදය ඉවත් කරන්න - + Authentication is required to rename fingerprint password ඇඟිලි සලකුණු මුරපදය නැවත නම් කිරීම සඳහා සත්‍යාපනය අවශ්‍ය වේ - + Rename fingerprint password ඇඟිලි සලකුණු මුරපදය නැවත නම් කරන්න - + Password is required to perform this action මෙම ක්‍රියාව සිදු කිරීම සඳහා මුරපදය අවශ්‍ය වේ - + Manage fingerprint passwords ඇඟිලි සලකුණු මුරපද කළමනාකරණය කරන්න diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_sk.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_sk.ts similarity index 67% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_sk.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_sk.ts index 2f52b7a57..0ea88f4d8 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_sk.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_sk.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Na pridanie hesla pomocou odtlačku prsta je potrebné overenie - + Add fingerprint password Pridať heslo pomocou odtlačku prsta - + Authentication is required to clear fingerprint passwords Na vymazanie hesiel odtlačkov prstov je potrebné overenie - + Clear fingerprint passwords Vymazať heslá odtlačkov prstov - + Authentication is required to rename fingerprint password Na premenovanie hesla odtlačkov prstov sa vyžaduje overenie - + Rename fingerprint password Premenovať heslo odtlačku prstov - + Password is required to perform this action Na vykonanie tejto akcie je potrebné heslo - + Manage fingerprint passwords Spravovať heslá odtlačkov prstov diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_sl.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_sl.ts similarity index 65% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_sl.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_sl.ts index f3778a631..73f902f69 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_sl.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_sl.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Dodajanje prstnega odtisa zahteva overitev - + Add fingerprint password Dodaj prstni odtis - + Authentication is required to clear fingerprint passwords Odstranjevanje prstnega odtsia zahteva overitev - + Clear fingerprint passwords Odstrani prstni odtis - + Authentication is required to rename fingerprint password Preimenovanje prstnega odtisa zahteva overitev - + Rename fingerprint password Preimenuj prstni odtis - + Password is required to perform this action To dejanje zahteva overitev - + Manage fingerprint passwords Upravljanje prstnih odtisov diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_sq.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_sq.ts similarity index 67% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_sq.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_sq.ts index 3ead1a692..3062c87fb 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_sq.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_sq.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Që të shtoni fjalëkalim shenjash gishti, lypset mirëfilltësim - + Add fingerprint password Shtoni fjalëkalim shenjash gishti - + Authentication is required to clear fingerprint passwords Që të spastrohen fjalëkalime shenjash gishti, lypset mirëfilltësim - + Clear fingerprint passwords Spastro fjalëkalime shenjash gishti - + Authentication is required to rename fingerprint password Që të riemërtoni fjalëkalim shenjash gishti, lypset mirëfilltësim - + Rename fingerprint password Riemërtoni fjalëkalim shenjash gishti - + Password is required to perform this action Që të kryeni këtë veprim, lypset fjalëkalim - + Manage fingerprint passwords Administroni fjalëkalime shenjash gishtash diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_sr.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_sr.ts similarity index 69% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_sr.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_sr.ts index f085638bc..a6b39b83f 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_sr.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_sr.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Идентификација је неопходна да додате отисак лозинку - + Add fingerprint password Додај отисак лозинку - + Authentication is required to clear fingerprint passwords Идентификација је неопходна да обришете отисак лозинку - + Clear fingerprint passwords Обриши отисак лозинку - + Authentication is required to rename fingerprint password Идентификација је неопходна да преименујете отисак лозинку - + Rename fingerprint password Преименуј отисак лозинку - + Password is required to perform this action Лозинка је потребна за овај поступак - + Manage fingerprint passwords Управљај отисак лозинкама diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_sv.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_sv.ts similarity index 63% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_sv.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_sv.ts index 807057de2..662c0859d 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_sv.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_sv.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Autentisering krävs för att lägga till fingeravtryck - + Add fingerprint password Lägg till fingeravtryck - + Authentication is required to clear fingerprint passwords Autentisiering krävs för att radera fingeravtryck - + Clear fingerprint passwords Radera fingeravtryck - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_sv_SE.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_sv_SE.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_sv_SE.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_sv_SE.ts index faef7481a..0f1b63a45 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_sv_SE.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_sv_SE.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_sw.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_sw.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_sw.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_sw.ts index 647d07e5a..f1179796b 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_sw.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_sw.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ta.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ta.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ta.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ta.ts index 64b1a718e..11979be37 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ta.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ta.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_te.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_te.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_te.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_te.ts index 5217d5aca..32526b28b 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_te.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_te.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_th.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_th.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_th.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_th.ts index 874eae44c..593318c1b 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_th.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_th.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_tr.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_tr.ts similarity index 67% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_tr.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_tr.ts index 6b46e71b9..e3de59b71 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_tr.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_tr.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Parmak izi parolası eklemek için kimlik doğrulaması gerekli - + Add fingerprint password Parmak izi parolası ekle - + Authentication is required to clear fingerprint passwords Parmak izi parolalarını silmek için kimlik doğrulaması gerekli - + Clear fingerprint passwords Parmak izi parolalarını temizle - + Authentication is required to rename fingerprint password Parmak izi parolasını yeniden adlandırmak için kimlik doğrulaması gerekli - + Rename fingerprint password Parmak izi parolasını yeniden adlandır - + Password is required to perform this action Bu işlemi gerçekleştirmek için parola gerekli - + Manage fingerprint passwords Parmak izi parolalarını yönet diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_tzm.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_tzm.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_tzm.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_tzm.ts index e86e6cb4b..22c35269a 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_tzm.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_tzm.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ug.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ug.ts similarity index 70% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ug.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ug.ts index be7dce86e..4692d67b6 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ug.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ug.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password بارماق ئىزىنى قوشۇش دەلىللەشنى تەلەپ قىلىدۇ - + Add fingerprint password بارماق ئىزى پارولى قوشۇڭ - + Authentication is required to clear fingerprint passwords بارماق ئىزىنى ئېلىۋېتىش دەلىللەشنى تەلەپ قىلىدۇ - + Clear fingerprint passwords بارماق ئىزى پارولىنى ئېلىۋېتىش - + Authentication is required to rename fingerprint password بارماق ئىزىنىنىڭ نامىنى ئۆزگەرتىش دەلىللەشنى تەلەپ قىلىدۇ - + Rename fingerprint password بارماق ئىزى پارولىنىڭ نامىنى ئۆزگەرتىش - + Password is required to perform this action بۇ مەشغۇلاتنى قىلىش ئۈچۈن پارول كىرگۈزۈڭ - + Manage fingerprint passwords بارماق ئىزى پارولىنى باشقۇرۇش diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_uk.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_uk.ts similarity index 70% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_uk.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_uk.ts index bb5be74c4..55941602a 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_uk.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_uk.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Для додавання пароля до відбитка слід пройти розпізнавання - + Add fingerprint password Додавання пароля до відбитка - + Authentication is required to clear fingerprint passwords Для вилучення паролів до відбитків слід пройти розпізнавання - + Clear fingerprint passwords Вилучення паролів до відбитків - + Authentication is required to rename fingerprint password Для зміни пароля до відбитка слід пройти розпізнавання - + Rename fingerprint password Зміна пароля до відбитка - + Password is required to perform this action Для виконання цієї дії слід вказати пароль - + Manage fingerprint passwords Керування паролями до відбитків diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ur.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ur.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_ur.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_ur.ts index 4eee9ff1d..a5b944a81 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_ur.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_ur.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_uz.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_uz.ts similarity index 61% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_uz.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_uz.ts index 75b732c6c..57fa80c6d 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_uz.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_uz.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password - + Add fingerprint password - + Authentication is required to clear fingerprint passwords - + Clear fingerprint passwords - + Authentication is required to rename fingerprint password - + Rename fingerprint password - + Password is required to perform this action - + Manage fingerprint passwords diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_vi.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_vi.ts similarity index 66% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_vi.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_vi.ts index 6d8250462..fe0c08535 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_vi.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_vi.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password Yêu cầu xác thực để thêm vân tay - + Add fingerprint password Thêm dấu vân tay - + Authentication is required to clear fingerprint passwords Yêu cầu xác thực để xoá dấu vân tay - + Clear fingerprint passwords Xoá dấu vân tay - + Authentication is required to rename fingerprint password Yêu cầu xác thực để đổi tên mật khẩu vân tay - + Rename fingerprint password Đổi tên mật khẩu vân tay - + Password is required to perform this action Mật khẩu là cần thiết để thực hiện hành động này - + Manage fingerprint passwords Quản lý mật khẩu vân tay diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_zh_CN.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_zh_CN.ts similarity index 64% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_zh_CN.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_zh_CN.ts index a102e6b75..8833e41c0 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_zh_CN.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_zh_CN.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password 添加指纹需要认证 - + Add fingerprint password 添加指纹密码 - + Authentication is required to clear fingerprint passwords 清除指纹需要认证 - + Clear fingerprint passwords 清除指纹密码 - + Authentication is required to rename fingerprint password 重命名指纹需要认证 - + Rename fingerprint password 重命名指纹密码 - + Password is required to perform this action 请输入密码以执行该操作 - + Manage fingerprint passwords 管理指纹密码 diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_zh_HK.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_zh_HK.ts similarity index 64% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_zh_HK.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_zh_HK.ts index c33e650f3..8427c1e4b 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_zh_HK.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_zh_HK.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password 添加指紋需要認證 - + Add fingerprint password 添加指紋密碼 - + Authentication is required to clear fingerprint passwords 清除指紋需要認證 - + Clear fingerprint passwords 清除指紋密碼 - + Authentication is required to rename fingerprint password 重命名指紋需要認證 - + Rename fingerprint password 重命名指紋密碼 - + Password is required to perform this action 請輸入密碼以執行該操作 - + Manage fingerprint passwords 管理指紋密碼 diff --git a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_zh_TW.ts b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_zh_TW.ts similarity index 64% rename from misc/ts/com.deepin.daemon.Fprintd.policy/policy_zh_TW.ts rename to misc/ts/org.deepin.dde.Fprintd1.policy/policy_zh_TW.ts index 043a19edb..938b87b38 100644 --- a/misc/ts/com.deepin.daemon.Fprintd.policy/policy_zh_TW.ts +++ b/misc/ts/org.deepin.dde.Fprintd1.policy/policy_zh_TW.ts @@ -2,42 +2,42 @@ policy - + Authentication is required to add fingerprint password 需要身份驗證才可新增指紋密碼 - + Add fingerprint password 新增指紋密碼 - + Authentication is required to clear fingerprint passwords 需要身份驗證才可清除指紋密碼 - + Clear fingerprint passwords 清除指紋密碼 - + Authentication is required to rename fingerprint password 重命名指紋需要認證 - + Rename fingerprint password 重命名指紋密碼 - + Password is required to perform this action 請輸入密碼以執行該操作 - + Manage fingerprint passwords 管理指紋密碼 diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy.ts similarity index 66% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy.ts index 81851a3bb..0e51ddf68 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy.ts @@ -4,22 +4,22 @@ policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_ady.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ady.ts new file mode 100644 index 000000000..45ae97bcc --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ady.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_af.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_af.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_af.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_af.ts index 24395702b..53939e677 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_af.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_af.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_af_ZA.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_af_ZA.ts new file mode 100644 index 000000000..b3953f28e --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_af_ZA.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ak.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ak.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_ak.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_ak.ts index 95b5aca1c..a45609866 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ak.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ak.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_am.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_am.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_am.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_am.ts index 9cc17bd7f..ebeded23e 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_am.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_am.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_am_ET.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_am_ET.ts new file mode 100644 index 000000000..c3d24089e --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_am_ET.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ar.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ar.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_ar.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_ar.ts index 20756dbc3..d39279a47 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ar.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ar.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_ar_EG.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ar_EG.ts new file mode 100644 index 000000000..04c140601 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ar_EG.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_ast.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ast.ts new file mode 100644 index 000000000..4ba0064c6 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ast.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_az.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_az.ts new file mode 100644 index 000000000..9244a6af4 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_az.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + GRUB tənzimləmələrini dəyişdirmək üçün kimlik doğrulaması tələb olunur + + + + Change the grub configuration + GRUB tənzimləməsini dəyişmək + + + + Authentication is required to prepare grub display resolution detection + GRUB ekran icazəsini aşkarlamaq üçün kimlik doğrulaması tələb olunur + + + + Prepare grub display resolution detection + Ekran icazəsinin aşkarlanmasına hazırlıq + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_bg.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_bg.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_bg.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_bg.ts index 6380f3069..9313eb2e7 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_bg.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_bg.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_bn.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_bn.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_bn.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_bn.ts index cfc7b3207..ba7f3a50c 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_bn.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_bn.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_bo.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_bo.ts similarity index 81% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_bo.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_bo.ts index 09912044b..1ea084035 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_bo.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_bo.ts @@ -2,22 +2,22 @@ policy - + Authentication is required to change the grub configuration འགོ་སློང་འདེམས་བྱང་གི་སྒྲིག་འགོད་བཟོ་བཅོས་བྱེད་དགོས་ན་བདེན་དཔང་ར་སྤྲོད་བྱེད་དགོས། - + Change the grub configuration འགོ་སློང་འདེམས་བྱང་གི་སྒྲིག་འགོད་བཟོ་བཅོས། - + Authentication is required to prepare grub display resolution detection གྲ་སྒྲིག་འགོ་སློང་འདེམས་བྱང་གི་མངོན་སྟོན་འབྱེད་ཕྱོད་དཔྱད་འཇལ་བྱེད་ཚེ་ར་སྤྲོད་བྱེད་དགོས། - + Prepare grub display resolution detection གྲ་སྒྲིག་འགོ་སློང་འདེམས་བྱང་གི་མངོན་སྟོན་འབྱེད་ཕྱོད་དཔྱད་འཇལ། diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_bqi.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_bqi.ts new file mode 100644 index 000000000..b0f8a10a4 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_bqi.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_br.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_br.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_br.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_br.ts index 395b95e67..e223afec5 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_br.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_br.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_ca.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ca.ts new file mode 100644 index 000000000..880494911 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ca.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + Cal autenticació per canviar la configuració del grub. + + + + Change the grub configuration + Canvieu la configuració del grub + + + + Authentication is required to prepare grub display resolution detection + Cal autenticació per preparar la detecció de la resolució de pantalla per al grub. + + + + Prepare grub display resolution detection + Preparació de la detecció de la resolució de pantalla per al grub + + + \ No newline at end of file diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_cgg.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_cgg.ts new file mode 100644 index 000000000..60a6edde5 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_cgg.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_cs.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_cs.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_cs.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_cs.ts index 3a7906812..a6b14480c 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_cs.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_cs.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_da.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_da.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_da.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_da.ts index ad643cbf8..b203fe972 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_da.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_da.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_de.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_de.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_de.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_de.ts index ed3e54782..7cbe2694e 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_de.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_de.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_de_CH.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_de_CH.ts new file mode 100644 index 000000000..4a9694bce --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_de_CH.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_de_DE.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_de_DE.ts new file mode 100644 index 000000000..4a615614c --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_de_DE.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_el.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_el.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_el.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_el.ts index 9a712937e..afda14490 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_el.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_el.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_el_GR.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_el_GR.ts new file mode 100644 index 000000000..d3fe34126 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_el_GR.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_en_AU.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_en_AU.ts new file mode 100644 index 000000000..7047db530 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_en_AU.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_en_GB.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_en_GB.ts new file mode 100644 index 000000000..f3bcf77bc --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_en_GB.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_en_NO.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_en_NO.ts new file mode 100644 index 000000000..fb33a30c5 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_en_NO.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_en_US.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_en_US.ts new file mode 100644 index 000000000..8e08a5166 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_en_US.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_eo.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_eo.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_eo.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_eo.ts index 4438932db..28d0f86a4 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_eo.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_eo.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_es.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_es.ts new file mode 100644 index 000000000..ff86dca17 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_es.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + Se requiere autenticación para modificar la configuración del grub + + + + Change the grub configuration + Cambiar la configuración del grub + + + + Authentication is required to prepare grub display resolution detection + Se requiere autenticación para preparar la detección de resolución de pantalla del grub + + + + Prepare grub display resolution detection + Preparar detección de resolución de pantalla de grub + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_es_419.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_es_419.ts similarity index 69% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_es_419.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_es_419.ts index 4e2a38791..465e15f3d 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_es_419.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_es_419.ts @@ -2,22 +2,22 @@ policy - + Authentication is required to change the grub2 configuration Se requiere autenticación para cambiar la configuración de grub2 - + Change the grub2 configuration Cambiar la configuración del grub2 - + Authentication is required to prepare grub2 display resolution detection - + Prepare grub2 display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_es_MX.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_es_MX.ts similarity index 66% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_es_MX.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_es_MX.ts index b06b19f02..433ee9d1c 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_es_MX.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_es_MX.ts @@ -2,22 +2,22 @@ policy - + Authentication is required to change the grub2 configuration - + Change the grub2 configuration - + Authentication is required to prepare grub2 display resolution detection - + Prepare grub2 display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_et.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_et.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_et.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_et.ts index 664a62abc..4503930d7 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_et.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_et.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_eu.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_eu.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_eu.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_eu.ts index 07e7f4f7f..ea69ca6ac 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_eu.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_eu.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_fa.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_fa.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_fa.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_fa.ts index d7120d004..8385b4731 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_fa.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_fa.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_fi.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_fi.ts new file mode 100644 index 000000000..27e99dcb4 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_fi.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + Todennus vaaditaan grub-kokoonpanon muuttamiseen + + + + Change the grub configuration + Muuta grub-kokoonpanoa + + + + Authentication is required to prepare grub display resolution detection + Todennus vaaditaan grub-näytön resoluution tunnistamisen valmistelemiseksi + + + + Prepare grub display resolution detection + Valmistele grub-näytön resoluution tunnistus + + + \ No newline at end of file diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_fil.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_fil.ts new file mode 100644 index 000000000..d86184926 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_fil.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_fr.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_fr.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_fr.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_fr.ts index dad9d1599..549c22669 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_fr.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_fr.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_gl.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_gl.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_gl.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_gl.ts index 417487ecd..f7cc5bf5e 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_gl.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_gl.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_gl_ES.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_gl_ES.ts new file mode 100644 index 000000000..728d5e953 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_gl_ES.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_he.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_he.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_he.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_he.ts index 68b435ce8..081dd023d 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_he.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_he.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_hi_IN.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_hi_IN.ts new file mode 100644 index 000000000..ce83e2e98 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_hi_IN.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_hr.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_hr.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_hr.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_hr.ts index e5e6cf6bb..a6aec1b47 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_hr.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_hr.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_hu.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_hu.ts similarity index 72% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_hu.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_hu.ts index e038ec25a..0e92b4816 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_hu.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_hu.ts @@ -2,22 +2,22 @@ policy - + Authentication is required to change the grub configuration Hitelesítés szükséges a grub konfiguráció módosításához - + Change the grub configuration Módosítsa a grub konfigurációt - + Authentication is required to prepare grub display resolution detection Hitelesítés szükséges a grub képernyőfelbontás érzékeléshez - + Prepare grub display resolution detection Grub képernyőfelbontás érzékelése diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_hy.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_hy.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_hy.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_hy.ts index bde48e927..7c7375173 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_hy.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_hy.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_id.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_id.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_id.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_id.ts index 98d48b1bb..6d46de413 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_id.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_id.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_id_ID.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_id_ID.ts new file mode 100644 index 000000000..c468907bd --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_id_ID.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_it.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_it.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_it.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_it.ts index 9f69d8ada..f4f9a4b5f 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_it.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_it.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ja.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ja.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_ja.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_ja.ts index bd9707dd6..b2a04dec7 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ja.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ja.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ka.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ka.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_ka.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_ka.ts index 71e4dba7b..1c408548c 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ka.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ka.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_kab.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_kab.ts new file mode 100644 index 000000000..c8ddb3c89 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_kab.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_kk.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_kk.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_kk.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_kk.ts index 7b9bc29e8..8afb3d6f5 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_kk.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_kk.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_km_KH.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_km_KH.ts new file mode 100644 index 000000000..845c9d78d --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_km_KH.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_kn_IN.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_kn_IN.ts new file mode 100644 index 000000000..a67548631 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_kn_IN.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ko.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ko.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_ko.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_ko.ts index df0d47a9b..e4d4e4cbf 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ko.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ko.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ku.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ku.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_ku.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_ku.ts index f4f1e3f0b..a0c28ee77 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ku.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ku.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_ku_IQ.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ku_IQ.ts new file mode 100644 index 000000000..aeb0021bc --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ku_IQ.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ky.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ky.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_ky.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_ky.ts index 36ecc0ff5..9d71bf151 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ky.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ky.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_ky@Arab.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ky@Arab.ts new file mode 100644 index 000000000..3bf02eb99 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ky@Arab.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_la.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_la.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_la.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_la.ts index ae7cb685e..eb6788f15 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_la.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_la.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_lo.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_lo.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_lo.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_lo.ts index e4571e3a4..91be0eb2c 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_lo.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_lo.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_lt.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_lt.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_lt.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_lt.ts index 010a08118..67ea2e012 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_lt.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_lt.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_lv.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_lv.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_lv.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_lv.ts index e74fbf0f3..eff984a43 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_lv.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_lv.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ml.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ml.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_ml.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_ml.ts index fc5e45c94..7111c9951 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ml.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ml.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_mn.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_mn.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_mn.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_mn.ts index c59b834d8..e1729f22f 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_mn.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_mn.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_mr.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_mr.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_mr.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_mr.ts index 58da32e8f..3f881b5d6 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_mr.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_mr.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ms.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ms.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_ms.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_ms.ts index d44e21adf..e81c4a9a9 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ms.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ms.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_nb.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_nb.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_nb.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_nb.ts index 7e58dd276..20538454f 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_nb.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_nb.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ne.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ne.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_ne.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_ne.ts index e116becbe..179f217e0 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ne.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ne.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_nl.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_nl.ts similarity index 71% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_nl.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_nl.ts index b4658d0f3..3ca6bb448 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_nl.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_nl.ts @@ -2,22 +2,22 @@ policy - + Authentication is required to change the grub configuration Verificatie vereist om de grub-instellingen aan te passen - + Change the grub configuration Grub-instellingen aanpassen - + Authentication is required to prepare grub display resolution detection Verificatie vereist om de grub-schermresolutiedetectie voor te bereiden - + Prepare grub display resolution detection Grub-schermresolutiedetectie voorbereiden diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_pa.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_pa.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_pa.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_pa.ts index 8391b8904..b2fb08091 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_pa.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_pa.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_pam.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_pam.ts new file mode 100644 index 000000000..f4516175f --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_pam.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_pl.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_pl.ts similarity index 71% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_pl.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_pl.ts index cd606a909..97d9c440f 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_pl.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_pl.ts @@ -2,22 +2,22 @@ policy - + Authentication is required to change the grub configuration Wymagane jest uwierzytelnienie, aby zmienić konfigurację grub - + Change the grub configuration Zmień konfigurację grub - + Authentication is required to prepare grub display resolution detection Wymagane jest uwierzytelnienie do wykrywania rozdzielczości grub - + Prepare grub display resolution detection Wykrywanie rozdzielczości wyświetlacza grub2 diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ps.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ps.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_ps.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_ps.ts index bea483b26..212544d5d 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ps.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ps.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_pt.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_pt.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_pt.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_pt.ts index 0adb33c4d..c55c04395 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_pt.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_pt.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_pt_BR.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_pt_BR.ts new file mode 100644 index 000000000..d88f1100a --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_pt_BR.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + A autenticação é necessária para alterar a configuração do grub + + + + Change the grub configuration + Alterar configuração do grub + + + + Authentication is required to prepare grub display resolution detection + A autenticação é necessária para a detecção da resolução de exibição do grub + + + + Prepare grub display resolution detection + Prepare a detecção da resolução da tela do grub + + + \ No newline at end of file diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_qu.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_qu.ts new file mode 100644 index 000000000..d3cb43e83 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_qu.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ro.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ro.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_ro.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_ro.ts index 3a2c0e49a..bd0eee6c9 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ro.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ro.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ru.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ru.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_ru.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_ru.ts index e4d6b8238..41f743b9b 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ru.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ru.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_ru_UA.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ru_UA.ts new file mode 100644 index 000000000..0abef31a5 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ru_UA.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_sc.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_sc.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_sc.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_sc.ts index 4e06ef5ff..b80b85d00 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_sc.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_sc.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_si.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_si.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_si.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_si.ts index 5737c5d80..94d173f0d 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_si.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_si.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_sk.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_sk.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_sk.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_sk.ts index 0ddf52935..d81a1476b 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_sk.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_sk.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_sl.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_sl.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_sl.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_sl.ts index 7a12c79af..6a9c192e3 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_sl.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_sl.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_sq.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_sq.ts similarity index 72% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_sq.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_sq.ts index 405e92a24..f5d096f52 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_sq.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_sq.ts @@ -2,22 +2,22 @@ policy - + Authentication is required to change the grub configuration Që të ndryshoni formësim për grub, duhet bërë mirëfilltësimi - + Change the grub configuration Ndryshoni formësimin për grub - + Authentication is required to prepare grub display resolution detection Që të përgatitet pikasje qartësie ekrani nga grub, duhet bërë mirëfilltësimi - + Prepare grub display resolution detection Përgatit pikasje qartësie ekrani nga grub diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_sr.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_sr.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_sr.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_sr.ts index 1d4f30d78..364c4ad26 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_sr.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_sr.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_sv.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_sv.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_sv.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_sv.ts index 54ed3fe36..4d7343f46 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_sv.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_sv.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_sv_SE.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_sv_SE.ts new file mode 100644 index 000000000..7183a0169 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_sv_SE.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_sw.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_sw.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_sw.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_sw.ts index 2554b7e1f..1abf48fe6 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_sw.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_sw.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ta.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ta.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_ta.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_ta.ts index 32538f928..1342bc214 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ta.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ta.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_te.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_te.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_te.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_te.ts index 19ae7efb7..68eb04140 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_te.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_te.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_th.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_th.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_th.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_th.ts index 194e3931f..af6838b5a 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_th.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_th.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_tr.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_tr.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_tr.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_tr.ts index 1c218ff78..c1d135a26 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_tr.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_tr.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_tzm.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_tzm.ts new file mode 100644 index 000000000..c9d18ee74 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_tzm.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + + + + + Change the grub configuration + + + + + Authentication is required to prepare grub display resolution detection + + + + + Prepare grub display resolution detection + + + + \ No newline at end of file diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_ug.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ug.ts new file mode 100644 index 000000000..9bebc802c --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ug.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + قوزغىتىش تىزىملىكىنىڭ سەپلىمىسىنى ئۆزگەرتىش ئۈچۈن دەلىللىشىڭىز كېرەك + + + + Change the grub configuration + قوزغىتىش تىزىملىكىنىڭ سەپلىمىسىنى ئۆزگەرتىش + + + + Authentication is required to prepare grub display resolution detection + كۆرسىتىش ئېنىقلىق دەرىجىسىنى تەكشۈرۈشنى ئالدىن قوزغىتىش ئۈچۈن دەلىللىشىڭىز كېرەك + + + + Prepare grub display resolution detection + كۆرسىتىش ئېنىقلىق دەرىجىسىنى تەكشۈرۈشنى ئالدىن قوزغىتىش + + + \ No newline at end of file diff --git a/misc/ts/org.deepin.dde.Grub2.policy/policy_uk.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_uk.ts new file mode 100644 index 000000000..c5a4f11c5 --- /dev/null +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_uk.ts @@ -0,0 +1,25 @@ + + + policy + + + Authentication is required to change the grub configuration + Для зміни налаштувань grub слід пройти розпізнавання + + + + Change the grub configuration + Зміна налаштувань grub + + + + Authentication is required to prepare grub display resolution detection + Для приготування до виявлення роздільності дисплея у grub слід пройти розпізнавання + + + + Prepare grub display resolution detection + Приготування до виявлення роздільної здатності дисплея у grub + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ur.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_ur.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_ur.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_ur.ts index 744b48173..2caac1dea 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_ur.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_ur.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_uz.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_uz.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_uz.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_uz.ts index f348c5b4f..d6e11f6f8 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_uz.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_uz.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_vi.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_vi.ts similarity index 59% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_vi.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_vi.ts index 1e6f33023..6991af00b 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_vi.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_vi.ts @@ -1,23 +1,23 @@ - + policy - + Authentication is required to change the grub configuration - + Change the grub configuration - + Authentication is required to prepare grub display resolution detection - + Prepare grub display resolution detection diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_zh_CN.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_zh_CN.ts similarity index 70% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_zh_CN.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_zh_CN.ts index 8776ae3f9..4775f2528 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_zh_CN.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_zh_CN.ts @@ -2,22 +2,22 @@ policy - + Authentication is required to change the grub configuration 修改启动菜单配置需要认证 - + Change the grub configuration 修改启动菜单配置 - + Authentication is required to prepare grub display resolution detection 预备启动菜单显示分辨率探测需要认证 - + Prepare grub display resolution detection 预备启动菜单显示分辨率探测 diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_zh_HK.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_zh_HK.ts similarity index 70% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_zh_HK.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_zh_HK.ts index 6cd76a87b..c04a4fb37 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_zh_HK.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_zh_HK.ts @@ -2,22 +2,22 @@ policy - + Authentication is required to change the grub configuration 修改啟動菜單配置需要認證 - + Change the grub configuration 修改啟動菜單配置 - + Authentication is required to prepare grub display resolution detection 預備啟動菜單顯示解像度探測需要認證 - + Prepare grub display resolution detection 預備啟動菜單顯示解像度探測 diff --git a/misc/ts/com.deepin.daemon.Grub2.policy/policy_zh_TW.ts b/misc/ts/org.deepin.dde.Grub2.policy/policy_zh_TW.ts similarity index 70% rename from misc/ts/com.deepin.daemon.Grub2.policy/policy_zh_TW.ts rename to misc/ts/org.deepin.dde.Grub2.policy/policy_zh_TW.ts index a46ad0dde..f122e85e4 100644 --- a/misc/ts/com.deepin.daemon.Grub2.policy/policy_zh_TW.ts +++ b/misc/ts/org.deepin.dde.Grub2.policy/policy_zh_TW.ts @@ -2,22 +2,22 @@ policy - + Authentication is required to change the grub configuration 修改啟動選單配置需要認證 - + Change the grub configuration 修改啟動選單配置 - + Authentication is required to prepare grub display resolution detection 預備啟動選單顯示解析度探測需要認證 - + Prepare grub display resolution detection 預備啟動選單顯示解析度探測 diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy.ts similarity index 55% rename from misc/ts/com.deepin.daemon.accounts.policy/policy.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy.ts index dcc880669..f077e8475 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Authentication is required to change your own user data - + Change your own user data Change your own user data - + Authentication is required to change user data Authentication is required to change user data - + Manage user accounts Manage user accounts - + Authentication is required to enable auto login Authentication is required to enable auto login - + Enable Auto Login Enable Auto Login - + Authentication is required to disable auto login Authentication is required to disable auto login - + Disable Auto Login Disable Auto Login - + Authentication is required to enable quick login Authentication is required to enable quick login - + Enable Quick Login Enable Quick Login - + Authentication is required to disable quick login Authentication is required to disable quick login - + Disable Quick Login Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Authentication is required to enable login without password - + Enable Login without password Enable Login without password - + Authentication is required to disable login without password Authentication is required to disable login without password - + Disable Login without password Disable Login without password - + Authentication is required to set keyboard layout Authentication is required to set keyboard layout - + Set keyboard layout Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ady.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ady.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ady.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ady.ts index 01f1bef49..844f06e15 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ady.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ady.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_af.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_af.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_af.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_af.ts index a6c3af95c..e741189c1 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_af.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_af.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_af_ZA.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_af_ZA.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_af_ZA.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_af_ZA.ts index dcccef382..2392a60b3 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_af_ZA.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_af_ZA.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ak.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ak.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ak.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ak.ts index c8b01e4b4..7f63d56f0 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ak.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ak.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_am.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_am.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_am.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_am.ts index 39e30488c..3bfefe9c2 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_am.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_am.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_am_ET.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_am_ET.ts similarity index 52% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_am_ET.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_am_ET.ts index 5defc85aa..5bb4ea873 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_am_ET.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_am_ET.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data ማረጋገጫ ያስፈልጋል የ እርስዎን ተጠቃሚ ዳታ ማሰናጃ ለ መቀየር - + Change your own user data የ እርስዎን ተጠቃሚ ዳታ ማሰናጃ መቀየሪያ - + Authentication is required to change user data ማረጋገጫ ያስፈልጋል የ ተጠቃሚ ዳታ ማሰናጃ ለ መቀየር - + Manage user accounts የተጠቃሚ መግለጫዎች አስተዳዳሪ - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ar.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ar.ts similarity index 58% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ar.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ar.ts index 38fb95eea..629be0997 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ar.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ar.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data المصادقة مطلوبة لتغيير ملكية بيانات المستخدم الخاصة بك - + Change your own user data تغيير ملكية بيانات المستخدم الخاصة بك - + Authentication is required to change user data المصادقة مطلوبة لتغيير بيانات المستخدم - + Manage user accounts إدارة حسابات المستخدمين - + Authentication is required to enable auto login المصادقة مطلوبة لتمكين تسجيل الدخول التلقائي - + Enable Auto Login تمكين تسجيل الدخول التلقائي - + Authentication is required to disable auto login المصادقة مطلوبة لتعطيل تسجيل الدخول التلقائي - + Disable Auto Login تعطيل تسجيل الدخول التلقائي - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password المصادقة مطلوبة لتمكين تسجيل الدخول بدون كلمة المرور - + Enable Login without password تمكين تسجيل الدخول بدون كلمة المرور - + Authentication is required to disable login without password المصادقة مطلوبة لتعطيل تسجيل الدخول بدون كلمة المرور - + Disable Login without password تعطيل تسجيل الدخول بدون كلمة المرور - + Authentication is required to set keyboard layout المصادقة مطلوبة لإعداد تخطيط لوحة المفاتيح - + Set keyboard layout إعداد لوحة المفاتيح diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ar_EG.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ar_EG.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ar_EG.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ar_EG.ts index 1990b2fa9..711da02af 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ar_EG.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ar_EG.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ast.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ast.ts similarity index 51% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ast.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ast.ts index 110e0ed24..8ad25a239 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ast.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ast.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Ríquese l'autenticación pa camudar los tos datos d'usuariu - + Change your own user data Camudar los tos datos d'usuariu - + Authentication is required to change user data Ríquese l'autenticación pa camudar los datos d'usuariu - + Manage user accounts Xestionar cuentes d'usuariu - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_az.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_az.ts similarity index 57% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_az.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_az.ts index 856d63543..80cb536af 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_az.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_az.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Sizə aid istifadəçi məlumatlarınızı dəyişmək üçün doğrulama tələb edilir - + Change your own user data Öz istifadəçi məlumatlarınızı dəyişin - + Authentication is required to change user data İstifadəçi məlumatlarını dəyişmək üçün doğrulama tələb edilir - + Manage user accounts İstifadəçi hesablarının idarə edilməsi - + Authentication is required to enable auto login Avtomatik giriş üçün doğrulama tələb edilir - + Enable Auto Login Avtomatik girişi aktiv etmək - + Authentication is required to disable auto login Avtomatik girişi söndürmək üçün doğrulama tələb edilir - + Disable Auto Login Avtomatik girişi söndürmək - + Authentication is required to enable quick login Kimlik doğrulaması avtomatik girişi aktiv etmək üçün tələb olunur - + Enable Quick Login Sürətli girişi aktiv edin - + Authentication is required to disable quick login Kimlik doğrulaması avtomatik girişi söndürmək üçün tələb olunur - + Disable Quick Login Sürətli girişi söndürün - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Şifrəsiz girişi aktiv etmək üçün doğrulama tələb edilir - + Enable Login without password Şifrəsiz girişi aktiv etmək - + Authentication is required to disable login without password Şifrəsiz girişi söndürmək üçün doğrulama tələb edilir - + Disable Login without password Şifrəsiz girişi söndürmək - + Authentication is required to set keyboard layout Klaviatura qatını təyin etmək üçün doğrulama tələb edilir - + Set keyboard layout Klaviatura qatını təyin etmək diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_bg.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_bg.ts similarity index 60% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_bg.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_bg.ts index 5ff703ac8..54a386966 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_bg.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_bg.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Удостоверяването изисква да смените вашите потребителски данни - + Change your own user data Променете вашите потребителски данни - + Authentication is required to change user data Удостоверяването изисква промяна на потребителските данни - + Manage user accounts Управление на потребителските акаунти - + Authentication is required to enable auto login Необходима е идентификация за включване на автоматичното влизане - + Enable Auto Login Включи автоматично влизане - + Authentication is required to disable auto login Необходима е идентификация за изключване на автоматичното влизане - + Disable Auto Login Изключи автоматичното влизане - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Необходима е идентификация за разрешаване на влизане без парола - + Enable Login without password Разрешаване на влизане без парола - + Authentication is required to disable login without password Необходима е идентификация за изключване на влизането без парола - + Disable Login without password Изключване на влизането без парола - + Authentication is required to set keyboard layout Изисква се идентификация за да зададете клавиатурна подредба - + Set keyboard layout Задаване на клавиатурна подредба diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_bn.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_bn.ts similarity index 62% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_bn.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_bn.ts index 61da55d4e..e59aef171 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_bn.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_bn.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data আপনার নিজস্ব ব্যবহারকারী তথ্যাবলী পরিবর্তন করার জন্য প্রমাণীকরণের প্রয়োজন - + Change your own user data আপনার নিজস্ব ব্যবহারকারী তথ্যাবলী পরিবর্তন করুন - + Authentication is required to change user data ব্যবহারকারী তথ্যাবলী পরিবর্তন করার জন্য প্রমাণীকরণের প্রয়োজন - + Manage user accounts ব্যবহারকারী অ্যাকাউন্টগুলি ব্যবস্থাপনা করুন - + Authentication is required to enable auto login স্বয়ংক্রিয় লগইন চালু করার জন্য প্রমাণীকরণের প্রয়োজন - + Enable Auto Login স্বয়ংক্রিয় লগইন চালু করুন - + Authentication is required to disable auto login স্বয়ংক্রিয় লগইন বন্ধ করতে প্রমাণীকরণ প্রয়োজন - + Disable Auto Login স্বয়ংক্রিয় লগইন বন্ধ করুন - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password পাসওয়ার্ড ছাড়া লগইন চালু করার জন্য প্রমাণীকরণ প্রয়োজন - + Enable Login without password পাসওয়ার্ড ছাড়া লগইন চালু করুন - + Authentication is required to disable login without password পাসওয়ার্ড ছাড়া লগইন বন্ধ করার জন্য প্রমাণীকরণ প্রয়োজন - + Disable Login without password পাসওয়ার্ড ছাড়া লগইন বন্ধ করুন - + Authentication is required to set keyboard layout কীবোর্ড লেআউট সেট করতে প্রমাণীকরণের প্রয়োজন - + Set keyboard layout কীবোর্ড লেআউট সেট করুন diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_bo.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_bo.ts similarity index 62% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_bo.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_bo.ts index c1c3e2276..f86bcf9a2 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_bo.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_bo.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data ཁྱོད་ཀྱི་སྤྱོད་མཁན་གཞི་གྲངས་བཟོ་བཅོས་བྱེད་ཚེ་ར་སྤྲོད་བྱེད་དགོས། - + Change your own user data ཁྱོད་ཀྱི་སྤྱོད་མཁན་གཞི་གྲངས་བཟོ་བཅོས་བྱེད་པ། - + Authentication is required to change user data སྤྱོད་མཁན་གཞི་གྲངས་བཟོ་བཅོས་བྱེད་ཚེ་ར་སྤྲོད་བྱེད་དགོས། - + Manage user accounts སྤྱོད་མཁན་གྱི་རྩིས་ཁྲ་དོ་དམ། - + Authentication is required to enable auto login ཐོ་རང་འཇུག་བྱེད་པར་ར་སྤྲོད་བྱེད་དགོས། - + Enable Auto Login ཐོ་རང་འཇུག་བྱེད་པ། - + Authentication is required to disable auto login ཐོ་རང་འཇུག་སྒོ་རྒྱག་ཚེ་ར་སྤྲོད་བྱེད་དགོས། - + Disable Auto Login ཐོ་རང་འཇུག་སྒོ་རྒྱག་པ། - + Authentication is required to enable quick login འཕྲལ་དུ་ཐོ་འཇུག་པར་ར་སྤྲོད་བྱེད་དགོས། - + Enable Quick Login འཕྲུལ་དུ་ཐོ་འཇུག - + Authentication is required to disable quick login འཕྲལ་དུ་ཐོ་འཇུག་པར་ར་སྤྲོད་བྱེད་མི་དགོས། - + Disable Quick Login འཕྲུལ་དུ་ཐོ་འཇུག་ཅེས་པ་སྒོ་རྒྱག་པ། - + + Authentication is required to enable WeChat code login + སྐད་འཕྲིན་བཤེར་ནས་ཐོ་འཇུག་པར་ར་སྤྲོད་བྱེད་དགོས། + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + སྐད་འཕྲིན་བཤེར་ནས་ཐོ་འཇུག་པར་ར་སྤྲོད་བྱེད་དགོས། + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password གསང་ཨང་མེད་པར་ཐོ་འཇུག་བྱེད་ཚེ་ར་སྤྲོད་བྱེད་དགོས། - + Enable Login without password གསང་ཨང་མེད་པར་ཐོ་འཇུག་བྱེད་པ། - + Authentication is required to disable login without password གསང་ཨང་མེད་པར་ཐོ་འཇུག་བྱེད་པ་སྒོ་རྒྱག་ཚེ་ར་སྤྲོད་བྱེད་དགོས། - + Disable Login without password གསང་ཨང་མེད་པར་ཐོ་འཇུག་བྱེད་པ་སྒོ་རྒྱག་པ། - + Authentication is required to set keyboard layout མཐེབ་གཞོང་བཀོད་པ་སྒྲིག་འགོད་བྱེད་ཚེ་ར་སྤྲོད་བྱེད་དགོས། - + Set keyboard layout མཐེབ་གཞོང་བཀོད་པ་སྒྲིག་འགོད་བྱེད་པ། diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_bqi.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_bqi.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_bqi.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_bqi.ts index 866eef0e4..02fa94a4b 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_bqi.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_bqi.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_br.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_br.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_br.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_br.ts index a7466a865..107d66245 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_br.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_br.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ca.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ca.ts similarity index 55% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ca.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ca.ts index 20c16c9e6..e9b2574be 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ca.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ca.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Cal autenticació per canviar les dades d'usuari pròpies. - + Change your own user data Canvieu les dades d'usuari pròpies - + Authentication is required to change user data Cal autenticació per canviar les dades d'usuari. - + Manage user accounts Gestioneu els comptes d'usuari - + Authentication is required to enable auto login Cal autenticació per habilitar l'entrada automàtica. - + Enable Auto Login Habilita l'entrada automàtica. - + Authentication is required to disable auto login Cal autenticació per inhabilitar l'entrada automàtica. - + Disable Auto Login Inhabilita l'entrada automàtica. - + Authentication is required to enable quick login Cal autenticació per habilitar l'inici de sessió ràpid. - + Enable Quick Login Activa l'inici de sessió ràpid - + Authentication is required to disable quick login Cal autenticació per desactivar l'inici de sessió ràpid. - + Disable Quick Login Desactiva l'inici de sessió ràpid - + + Authentication is required to enable WeChat code login + Cal autenticació per habilitar l'entrada amb el codi de WeChat. + + + + Enable WeChat Code Login + Habilita el codi d'inici de sessió del WeChat + + + + Authentication is required to disable WeChat code login + Cal autenticació per inhabilitar l'entrada amb el codi de WeChat. + + + + Disable WeChat Code Login + Inhabilita el codi d'inici de sessió del WeChat + + + Authentication is required to enable login without password Cal autenticació per habilitar l'entrada sense contrasenya. - + Enable Login without password Habilita l'entrada sense contrasenya. - + Authentication is required to disable login without password Cal autenticació per inhabilitar l'entrada sense contrasenya. - + Disable Login without password Inhabilita l'entrada sense contrasenya. - + Authentication is required to set keyboard layout Cal autenticació per establir la disposició del teclat. - + Set keyboard layout Establiu la disposició del teclat. diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_cgg.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_cgg.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_cgg.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_cgg.ts index 52395713f..fafcfaf6b 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_cgg.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_cgg.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_cs.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_cs.ts similarity index 56% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_cs.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_cs.ts index 45a1da45c..226892c2c 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_cs.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_cs.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Pro změnu svých vlastních údajů je vyžadováno ověření se - + Change your own user data Změnit si své vlastní údaje - + Authentication is required to change user data Pro změnu údajů o uživateli je vyžadováno ověření se - + Manage user accounts Spravovat uživatelské účty - + Authentication is required to enable auto login Pro povolení automatického přihlašování je požadováno ověření se - + Enable Auto Login Povolit automatické přihlašování - + Authentication is required to disable auto login Pro zakázání automatického přihlašování je požadováno ověření se - + Disable Auto Login Zakázat automatické přihlašování - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Pro povolení přihlašování bez hesla je požadováno ověření se - + Enable Login without password Povolit přihlašování bez hesla - + Authentication is required to disable login without password Pro zakázání přihlašování bez hesla je požadováno ověření se - + Disable Login without password Zakázat přihlašování bez hesla - + Authentication is required to set keyboard layout Pro nastavení rozložení klávesnice je vyžadováno ověření se - + Set keyboard layout Nastavit rozložení klávesnice diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_da.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_da.ts similarity index 55% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_da.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_da.ts index 889c9bd68..103bad088 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_da.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_da.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Der kræves autentifikation for at ændre dine egne brugerdata - + Change your own user data Ændr dine egne brugerdata - + Authentication is required to change user data Der kræves autentifikation for at ændre brugerdata - + Manage user accounts Håndter brugerkonti - + Authentication is required to enable auto login Der kræves autentifikation for at aktivere automatisk login - + Enable Auto Login Aktivér automatisk login - + Authentication is required to disable auto login Der kræves autentifikation for at deaktivere automatisk login - + Disable Auto Login Deaktivér automatisk login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Der kræves autentifikation for at aktivere login uden adgangskode - + Enable Login without password Aktivér login uden adgangskode - + Authentication is required to disable login without password Der kræves autentifikation for at deaktivere login uden adgangskode - + Disable Login without password Deaktivér login uden adgangskode - + Authentication is required to set keyboard layout Der kræves autentifikation for at sætte tastaturlayout - + Set keyboard layout Sæt tastaturlayout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_de.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_de.ts similarity index 56% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_de.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_de.ts index 421109cbe..3fe1bc022 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_de.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_de.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Zum Ändern Ihrer eigenen Benutzerdaten ist eine Authentifizierung erforderlich - + Change your own user data Ändern Ihrer eigenen Benutzerdaten - + Authentication is required to change user data Zum Ändern von Benutzerdaten ist eine Authentifizierung erforderlich - + Manage user accounts Benutzerkonten verwalten - + Authentication is required to enable auto login Zum Aktivieren der automatischen Anmeldung ist eine Authentifizierung erforderlich - + Enable Auto Login Automatische Anmeldung aktivieren - + Authentication is required to disable auto login Zum Deaktivieren der automatischen Anmeldung ist eine Authentifizierung erforderlich - + Disable Auto Login Automatische Anmeldung deaktivieren - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Zum Aktivieren der Anmeldung ohne Passwort ist eine Authentifizierung erforderlich - + Enable Login without password Anmeldung ohne Passwort aktivieren - + Authentication is required to disable login without password Zum Deaktivieren der Anmeldung ohne Passwort ist eine Authentifizierung erforderlich - + Disable Login without password Anmeldung ohne Passwort deaktivieren - + Authentication is required to set keyboard layout Zum Festlegen der Tastaturbelegung ist eine Authentifizierung erforderlich - + Set keyboard layout Tastaturbelegung festlegen diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_de_CH.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_de_CH.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_de_CH.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_de_CH.ts index 58ac0d972..b4bdb5bad 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_de_CH.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_de_CH.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_de_DE.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_de_DE.ts similarity index 55% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_de_DE.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_de_DE.ts index 97c1a2df8..eef8bff13 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_de_DE.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_de_DE.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Sie müssen sich authentifizieren, um ihre Benutzerdaten zu ändern - + Change your own user data Ändern Sie ihre Benutzerdaten - + Authentication is required to change user data Sie müssen sich authentifizieren, um Benutzerdaten zu ändern - + Manage user accounts Benutzerkonten verwalten - + Authentication is required to enable auto login Sie müssen sich authentifizieren, um Auto-LogIn einzurichten - + Enable Auto Login Auto-LogIn Einrichten - + Authentication is required to disable auto login Sie müssen sich authentifizieren, um Auto-LogIn abzuschalten - + Disable Auto Login Auto-LogIn abschalten - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Sie müssen sich authentifizieren, um LogIn ohne Passwort einzurichten - + Enable Login without password LogIn ohne Passwort einrichten - + Authentication is required to disable login without password Sie müssen sich authentifizieren, um LogIn ohne Passwort abzuschalten - + Disable Login without password LogIn ohne Passwort abschalten - + Authentication is required to set keyboard layout Sie müssen sich authentifizieren, um das Tastatur-Layout einzustellen - + Set keyboard layout Tastatur-Layout einstellen diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_el.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_el.ts similarity index 59% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_el.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_el.ts index ae863c074..a7993b0f6 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_el.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_el.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Απαιτείται πιστοποίηση για αλλαγή των δικών σας δεδομένων χρήστη - + Change your own user data Αλλάξτε τα δεδομένα χρήστη σας - + Authentication is required to change user data Απαιτείται πιστοποίηση για αλλαγή των δεδομένων χρήστη - + Manage user accounts Διαχείριση λογαριασμών χρηστών - + Authentication is required to enable auto login Απαιτείται πιστοποίηση για ενεργοποίηση αυτόματης εισόδου - + Enable Auto Login Ενεργοποίηση Αυτόματης Εισόδου - + Authentication is required to disable auto login Απαιτείται πιστοποίηση για απενεργοποίηση αυτόματης εισόδου - + Disable Auto Login Απενεργοποίηση Αυτόματης Εισόδου - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Απαιτείται πιστοποίηση για ενεργοποίηση εισόδου χωρίς κωδικό - + Enable Login without password Ενεργοποίηση Εισόδου χωρίς κωδικό - + Authentication is required to disable login without password Απαιτείται πιστοποίηση για απενεργοποίηση εισόδου χωρίς κωδικό - + Disable Login without password Απενεργοποίηση Εισόδου χωρίς κωδικό - + Authentication is required to set keyboard layout Απαιτείται πιστοποίηση για να θέσετε τη διάταξη του πληκτρολογίου - + Set keyboard layout Θέστε διάταξης πληκτρολογίου diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_el_GR.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_el_GR.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_el_GR.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_el_GR.ts index 6a99783b0..8d020b326 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_el_GR.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_el_GR.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_en_AU.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_en_AU.ts similarity index 54% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_en_AU.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_en_AU.ts index a3aa11f77..0a9723ccb 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_en_AU.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_en_AU.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Authentication is required to change your own user data - + Change your own user data Change your own user data - + Authentication is required to change user data Authentication is required to change user data - + Manage user accounts Manage user accounts - + Authentication is required to enable auto login Authentication is required to enable auto-login - + Enable Auto Login Enable Auto Login - + Authentication is required to disable auto login Authentication is required to disable auto-login - + Disable Auto Login Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Authentication is required to enable login without password - + Enable Login without password Enable Login without password - + Authentication is required to disable login without password Authentication is required to disable login without password - + Disable Login without password Disable Login without password - + Authentication is required to set keyboard layout Authentication is required to set keyboard layout - + Set keyboard layout Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_en_GB.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_en_GB.ts similarity index 54% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_en_GB.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_en_GB.ts index 607514a56..d10a6da3f 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_en_GB.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_en_GB.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Authentication is required to change your own user data - + Change your own user data Change your own user data - + Authentication is required to change user data Authentication is required to change user data - + Manage user accounts Manage user accounts - + Authentication is required to enable auto login Authentication is required to enable auto login - + Enable Auto Login Enable auto login - + Authentication is required to disable auto login Authentication is required to disable auto login - + Disable Auto Login Disable auto login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Authentication is required to enable logging in without a password - + Enable Login without password Enable logging in without a password - + Authentication is required to disable login without password Authentication is required to disable logging in without a password - + Disable Login without password Disable logging in without a password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_en_NO.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_en_NO.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_en_NO.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_en_NO.ts index bbacfc954..4b51d850f 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_en_NO.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_en_NO.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_en_US.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_en_US.ts similarity index 54% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_en_US.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_en_US.ts index 5c8ed3972..a40c694c9 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_en_US.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_en_US.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Authentication is required to change your own user data - + Change your own user data Change your own user data - + Authentication is required to change user data Authentication is required to change user data - + Manage user accounts Manage user accounts - + Authentication is required to enable auto login Authentication is required to enable auto login - + Enable Auto Login Enable Auto Login - + Authentication is required to disable auto login Authentication is required to disable auto login - + Disable Auto Login Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Authentication is required to enable login without password - + Enable Login without password Enable Login without password - + Authentication is required to disable login without password Authentication is required to disable login without password - + Disable Login without password Disable Login without password - + Authentication is required to set keyboard layout Authentication is required to set keyboard layout - + Set keyboard layout Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_eo.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_eo.ts similarity index 51% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_eo.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_eo.ts index ebbbbab19..3fa6984b5 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_eo.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_eo.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Aŭtentigo bezonatas por ŝanĝi viajn proprajn uzantodatumojn - + Change your own user data Ŝanĝi viajn proprajn uzantodatumojn - + Authentication is required to change user data Aŭtentigo bezonatas por ŝanĝi uzantodatumojn - + Manage user accounts Administri uzantokontojn - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_es.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_es.ts similarity index 57% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_es.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_es.ts index 3b995a0a7..a5982002d 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_es.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_es.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Se requiere autenticación para cambiar sus datos de usuario - + Change your own user data Cambiar sus datos de usuario - + Authentication is required to change user data Se requiere autenticación para cambiar datos de usuario - + Manage user accounts Gestionar cuentas de usuario - + Authentication is required to enable auto login Se requiere autenticación para habilitar el inicio de sesión automático - + Enable Auto Login Habilitar inicio de sesión automático - + Authentication is required to disable auto login Se requiere autenticación para desactivar el inicio de sesión automático - + Disable Auto Login Desactivar inicio de sesión automático - + Authentication is required to enable quick login Se requiere autenticación para permitir el inicio de sesión rápido - + Enable Quick Login Habilitar inicio de sesión rápido - + Authentication is required to disable quick login Se requiere autenticación para deshabilitar el inicio de sesión rápido - + Disable Quick Login Deshabilitar el inicio de sesión rápido - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Se requiere autenticación para habilitar el inicio de sesión sin contraseña - + Enable Login without password Habilitar inicio de sesión sin contraseña - + Authentication is required to disable login without password Se requiere autenticación para desactivar el inicio de sesión sin contraseña - + Disable Login without password Desactivar inicio de sesión sin contraseña - + Authentication is required to set keyboard layout Se requiere autenticación para establecer la distribución del teclado - + Set keyboard layout Establecer distribución del teclado diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_es_419.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_es_419.ts similarity index 68% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_es_419.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_es_419.ts index f33847915..6e2babfe3 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_es_419.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_es_419.ts @@ -2,72 +2,72 @@ policy - + Authentication is required to change your own user data Se requiere autenticación para modificar su propia data de usuario - + Change your own user data Modifique su propia data de usuario - + Authentication is required to change user data Se requiere autenticación para modificar la data de usuario - + Manage user accounts Administrar las cuentas de usuario - + Authentication is required to enable auto login Se requiere autenticación para habilitar inicio de sesión automático - + Enable Auto Login Habilitar inicio de sesión automático - + Authentication is required to disable auto login Se requiere autenticación para deshabilitar inicio de sesión automático - + Disable Auto Login Deshabilitar inicio de sesión automático - + Authentication is required to enable login without password Se requiere autenticación para habilitar inicio de sesión sin contraseña - + Enable Login without password Habilitar inicio de sesión sin contraseña - + Authentication is required to disable login without password Se requiere autenticación para deshabilitar inicio de sesión sin contraseña - + Disable Login without password Deshabilitar inicio de sesión sin contraseña - + Authentication is required to set keyboard layout Se requiere autenticación para establecer distribución del teclado - + Set keyboard layout Establecer distribución del teclado diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_es_MX.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_es_MX.ts similarity index 61% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_es_MX.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_es_MX.ts index 4e962ea17..40daf39f4 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_es_MX.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_es_MX.ts @@ -2,72 +2,72 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_et.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_et.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_et.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_et.ts index 85cd8de8e..a8f62e393 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_et.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_et.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_eu.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_eu.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_eu.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_eu.ts index ed66fa4a3..64624d87d 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_eu.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_eu.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_fa.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_fa.ts similarity index 57% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_fa.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_fa.ts index 82843dc51..b0824157b 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_fa.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_fa.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data احراز هویت برای تغییر اطلاعات کاربری شما لازم است - + Change your own user data تغییر اطلاعات کاربری شما - + Authentication is required to change user data احراز هویت برای تغییر اطلاعات کاربر لازم است - + Manage user accounts مدیریت حساب کاربران - + Authentication is required to enable auto login احراز هویت برای فعالسازی ورود خودکار لازم است - + Enable Auto Login فعالسازی ورود خودکار - + Authentication is required to disable auto login احراز هویت برای غیرفعالسازی ورود خودکار لازم است - + Disable Auto Login غیرفعالسازی ورود خودکار - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password احراز هویت برای فعالسازی ورود بدون رمزعبور لازم است - + Enable Login without password فعالسازی ورود بدون رمزعبور - + Authentication is required to disable login without password احراز هویت برای غیرفعالسازی ورود بدون رمزعبور لازم است - + Disable Login without password غیرفعالسازی ورود بدون رمز - + Authentication is required to set keyboard layout احراز هویت برای انتخاب طرح بندی صفحه کلید لازم است - + Set keyboard layout انتخاب طرح بندی صفحه کلید diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_fi.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_fi.ts similarity index 56% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_fi.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_fi.ts index c7888e299..b16b0126e 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_fi.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_fi.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Omien käyttäjätietojen muuttaminen vaatii tunnistautumisen - + Change your own user data Muuta omia käyttäjätietojasi - + Authentication is required to change user data Käyttäjätietojen muuttaminen vaatii tunnistautumisen - + Manage user accounts Hallitse käyttäjätilejä - + Authentication is required to enable auto login Automaattisen kirjautumisen käyttöönotto vaatii tunnistautumisen - + Enable Auto Login Käytä automaattista kirjautumista - + Authentication is required to disable auto login Automaattisen kirjautumisen poisto vaatii tunnistautumisen - + Disable Auto Login Poista automaattinen kirjautuminen - + Authentication is required to enable quick login Tunnistautuminen vaaditaan nopeaan kirjautumiseen - + Enable Quick Login Käytä nopeaa kirjautumista - + Authentication is required to disable quick login Tunnistautuminen vaaditaan nopean kirjautumisen poistamiseksi - + Disable Quick Login Poista nopea kirjautuminen - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Kirjautumisen käyttöönotto ilman salasanaa vaatii tunnistautumisen - + Enable Login without password Salli kirjautuminen ilman salasanaa - + Authentication is required to disable login without password Kirjautumisen käytöstäpoisto ilman salasanaa vaatii tunnistautumisen - + Disable Login without password Poista kirjautuminen ilman salasanaa - + Authentication is required to set keyboard layout Näppäimistön asetukset vaatii tunnistautumisen - + Set keyboard layout Aseta näppäimistöasettelu diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_fil.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_fil.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_fil.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_fil.ts index d8d24acfc..1856c4da7 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_fil.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_fil.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_fr.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_fr.ts similarity index 56% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_fr.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_fr.ts index b0853098d..40ba83b99 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_fr.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_fr.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Vous devez vous authentifier pour modifier vos données utilisateur - + Change your own user data Modifier vos données utilisateur - + Authentication is required to change user data Il est nécessaire de s'authentifier pour modifier des données utilisateur - + Manage user accounts Gérer les comptes des utilisateurs - + Authentication is required to enable auto login Il est nécessaire de s'authentifier pour activer la connexion automatique - + Enable Auto Login Activer la connexion automatique - + Authentication is required to disable auto login Il est nécessaire de s'authentifier pour désactiver la connexion automatique - + Disable Auto Login Désactiver la connexion automatique - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Il est nécessaire de s'authentifier pour activer la connexion sans mot de passe - + Enable Login without password Activer la connexion sans mot de passe - + Authentication is required to disable login without password Il est nécessaire de s'authentifier pour désactiver la connexion sans mot de passe - + Disable Login without password Désactiver la connexion sans mot de passe - + Authentication is required to set keyboard layout L'authentification est nécessaire pour définir la disposition du clavier - + Set keyboard layout Définir la disposition du clavier diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_gl.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_gl.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_gl.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_gl.ts index 8e6b78eec..fe89d12f1 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_gl.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_gl.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_gl_ES.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_gl_ES.ts similarity index 55% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_gl_ES.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_gl_ES.ts index bfef63667..37bdb2959 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_gl_ES.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_gl_ES.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Requírese autenticación para cambiar os seus datos de usuario - + Change your own user data Cambiar os seus datos de usuario - + Authentication is required to change user data Requírese autenticación para cambiar os datos de usuario - + Manage user accounts Xestionar as contas de usuario - + Authentication is required to enable auto login Requírese autenticación para habilitar o inicio automático - + Enable Auto Login Habilitar o inicio automático - + Authentication is required to disable auto login Requírese autenticación para inhabilitar o inicio automático - + Disable Auto Login Inhabilitar o inicio automático - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Requírese autenticación para habilitar o inicio sen contrasinal - + Enable Login without password Habilitar o inicio sen contrasinal - + Authentication is required to disable login without password Requírese autenticación para inhabilitar o inicio sen contrasinal - + Disable Login without password Inhabilitar o incio sen contrasinal - + Authentication is required to set keyboard layout Requírese autenticación para establecer a disposición do teclado - + Set keyboard layout Establecer a disposición do teclado diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_he.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_he.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_he.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_he.ts index a08196e7a..db8782461 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_he.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_he.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_hi_IN.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_hi_IN.ts similarity index 62% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_hi_IN.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_hi_IN.ts index 366866ba7..e0dada2aa 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_hi_IN.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_hi_IN.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data अपने उपयोक्ता डेटा को बदलने हेतु प्रमाणीकरण आवश्यक है - + Change your own user data अपना उपयोक्ता डेटा बदलें - + Authentication is required to change user data उपयोक्ता डेटा को बदलने हेतु प्रमाणीकरण आवश्यक है - + Manage user accounts उपयोक्ता खातों का प्रबंधन करें - + Authentication is required to enable auto login स्वतः लॉगिन को सक्रिय करने हेतु प्रमाणीकरण आवश्यक है - + Enable Auto Login स्वतः लॉगिन सक्रिय करें - + Authentication is required to disable auto login स्वतः लॉगिन को निष्क्रिय करने हेतु प्रमाणीकरण आवश्यक है - + Disable Auto Login स्वतः लॉगिन निष्क्रिय करें - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password बिना कूटशब्द के लॉगिन को सक्रिय करने हेतु प्रमाणीकरण आवश्यक है - + Enable Login without password बिना कूटशब्द के लॉगिन को सक्रिय करें - + Authentication is required to disable login without password बिना कूटशब्द के लॉगिन को निष्क्रिय करने हेतु प्रमाणीकरण आवश्यक है - + Disable Login without password बिना कूटशब्द के लॉगिन को निष्क्रिय करें - + Authentication is required to set keyboard layout कुंजीपटल अभिन्यास सेट करने हेतु प्रमाणीकरण आवश्यक है - + Set keyboard layout कुंजीपटल अभिन्यास सेट करें diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_hr.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_hr.ts similarity index 55% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_hr.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_hr.ts index f819206fd..f64166439 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_hr.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_hr.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Potrebna je ovjera za promjenu vaših vlastitih korisničkih podataka - + Change your own user data Promijenite vaše vlastite korisničke podatke - + Authentication is required to change user data Potrebna je ovjera za promjenu korisničkih podataka - + Manage user accounts Upravlja računima korisnika - + Authentication is required to enable auto login Potrebna je ovjera za omogućavanje automatske prijave - + Enable Auto Login Omogući automatsku prijavu - + Authentication is required to disable auto login Potrebna je ovjera za onemogućavanje automatske prijave - + Disable Auto Login Onemogući automatsku prijavu - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Potrebna je ovjera za omogućavanje prijave bez lozinke - + Enable Login without password Omogući prijavu bez lozinke - + Authentication is required to disable login without password Potrebna je ovjera za onemogućavanje prijave bez lozinke - + Disable Login without password Onemogući prijavu bez lozinke - + Authentication is required to set keyboard layout Potrebna je ovjera za postavljanje rasporeda tipkovnice - + Set keyboard layout Postavi raspored tipkovnice diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_hu.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_hu.ts similarity index 58% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_hu.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_hu.ts index bb03cf395..70051e32d 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_hu.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_hu.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Hitelesítés szükséges a felhasználói adatainak módosításához - + Change your own user data Saját felhasználói adatainak módosítása - + Authentication is required to change user data Hitelesítés szükséges a felhasználói adatok módosításához - + Manage user accounts Felhasználói fiókok kezelése - + Authentication is required to enable auto login Hitelesítés szükséges az automatikus bejelentkezés engedélyezéséhez - + Enable Auto Login Automatikus bejelentkezés engedélyezése - + Authentication is required to disable auto login Hitelesítés szükséges az automatikus bejelentkezés kikapcsolásához - + Disable Auto Login Automatikus bejelentkezés kikapcsolása - + Authentication is required to enable quick login Hitelesítés szükséges a gyors bejelentkezés engedélyezéséhez - + Enable Quick Login Gyors bejelentkezés engedélyezése - + Authentication is required to disable quick login Hitelesítés szükséges a gyors bejelentkezés letiltásához - + Disable Quick Login Gyors bejelentkezés letiltása - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Hitelesítés szükséges a jelszó nélküli bejelentkezés engedélyezéséhez - + Enable Login without password Jelszó nélküli bejelentkezés engedélyezése - + Authentication is required to disable login without password Hitelesítés szükséges a jelszó nélküli bejelentkezés kikapcsolásához - + Disable Login without password Jelszó nélküli bejelentkezés kikapcsolása - + Authentication is required to set keyboard layout Hitelesítés szükséges a billentyűzetkiosztás beállításához - + Set keyboard layout Billentyűzetkiosztás beállítása diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_hy.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_hy.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_hy.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_hy.ts index 647d07e0e..0149d1f76 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_hy.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_hy.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_id.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_id.ts similarity index 55% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_id.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_id.ts index 6e2159057..000346179 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_id.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_id.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Otentikasi diperlukan untuk mengubah data pengguna milikmu - + Change your own user data Ubah data penggunamu sendiri - + Authentication is required to change user data Otentikasi diperlukan untuk mengubah data pengguna - + Manage user accounts Kelola akun pengguna - + Authentication is required to enable auto login Otentikasi diperlukan untuk mengaktifkan masuk otomatis - + Enable Auto Login Aktifkan masuk otomatis - + Authentication is required to disable auto login Otentikasi diperlukan untuk menonaktifkan masuk otomatis - + Disable Auto Login Nonaktifkan masuk otomatis - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Otentikasi diperlukan untuk mengaktifkan masuk otomatis tanpa dengan sandi lewat - + Enable Login without password Aktifkan masuk tanpa dengan kata sandi - + Authentication is required to disable login without password Otentikasi diperlukan untuk menonaktifkan masuk otomatis tanpa dengan kata sandi - + Disable Login without password Nonaktifkan masuk otomatis tanpa dengan kata sandi - + Authentication is required to set keyboard layout Otentikasi diperlukan untuk set tata letak papan ketik - + Set keyboard layout Atur tata letak papan ketik diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_id_ID.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_id_ID.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_id_ID.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_id_ID.ts index 70e372da6..b90395848 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_id_ID.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_id_ID.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_it.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_it.ts similarity index 56% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_it.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_it.ts index 31762f4fb..61815d6a1 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_it.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_it.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data È necessario autenticarsi per cambiare i propri dati utente - + Change your own user data Cambia i dati dell'utente - + Authentication is required to change user data È necessario autenticarsi per cambiare i dati utente - + Manage user accounts Gestisci gli account utente - + Authentication is required to enable auto login Autenticazione richiesta per abilitare il login automatico - + Enable Auto Login Abilita Login automatico - + Authentication is required to disable auto login Autenticazione richiesta per disabilitare il login automatico - + Disable Auto Login Disabilita Login automatico - + Authentication is required to enable quick login Autenticazione richiesta per abilitare l'accesso rapido. - + Enable Quick Login Abilita l'accesso rapido - + Authentication is required to disable quick login L'autenticazione è richiesta per disabilitare l'accesso rapido. - + Disable Quick Login Disabilita accesso rapido - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Autenticazione richiesta per abilitare il login privo di password - + Enable Login without password Abilita Login senza password - + Authentication is required to disable login without password Autenticazione richiesta per disabilitare il login privo di password - + Disable Login without password Disabilita Login senza password - + Authentication is required to set keyboard layout Autenticazione necessaria per modificare il layout della tastiera - + Set keyboard layout Imposta il layout della tastiera diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ja.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ja.ts similarity index 56% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ja.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ja.ts index b58e285a5..e2c1c2f23 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ja.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ja.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data 自分自身のユーザーデータを変更するには認証が必要です - + Change your own user data 自分自身のユーザーデータを変更 - + Authentication is required to change user data ユーザーのデータを変更するには認証が必要です - + Manage user accounts ユーザーアカウントを管理 - + Authentication is required to enable auto login 自動ログインを有効にするには認証が必要です - + Enable Auto Login 自動ログインを有効にする - + Authentication is required to disable auto login 自動ログインを無効にするには認証が必要です - + Disable Auto Login 自動ログインを無効にする - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password パスワードなしでのログインを有効にするには認証が必要です - + Enable Login without password パスワードなしでのログインを有効にする - + Authentication is required to disable login without password パスワードなしでのログインを無効にするには認証が必要です - + Disable Login without password パスワードなしでのログインを無効にする - + Authentication is required to set keyboard layout キーボードレイアウトを設定するには認証が必要です - + Set keyboard layout キーボードレイアウトを設定 diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ka.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ka.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ka.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ka.ts index 6015c725c..69008dccc 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ka.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ka.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_kab.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_kab.ts similarity index 54% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_kab.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_kab.ts index 3d1a1198e..22c0113d5 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_kab.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_kab.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Yetwasra usesteb akken ad tbeddeleḍ isefka udmawanen-inek m. - + Change your own user data Beddel isefka udmawanen inek m - + Authentication is required to change user data Yetwasra usesteb akken ad tbeddeleḍ isefka udmawanen n useqdac - + Manage user accounts sefrek isefka n useqdac - + Authentication is required to enable auto login Yettwasra usesteb akken ad tesremdeḍ anekcum awurman - + Enable Auto Login Sermed anekcum awurman - + Authentication is required to disable auto login Yettwasra usesteb akken ad tsenseḍ anekcum awurman - + Disable Auto Login Sens anekcum awurman - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Yettwasra usesteb akken ad tesremdeḍ anekcum war awal uffir - + Enable Login without password Sermed anekcum war awal uffir - + Authentication is required to disable login without password Yettwasra usesteb akken ad tsenseḍ anekcum war awal uffir - + Disable Login without password Sens anekcum war awal uffir - + Authentication is required to set keyboard layout Yettwasra usesteb akken ad tesremdeḍ taneɣuft n unasiw - + Set keyboard layout Sbadu taneɣruft n unasiw diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_kk.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_kk.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_kk.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_kk.ts index 8cabe996c..0d8cf109c 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_kk.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_kk.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_km_KH.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_km_KH.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_km_KH.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_km_KH.ts index a6e22db5c..813c97518 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_km_KH.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_km_KH.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_kn_IN.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_kn_IN.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_kn_IN.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_kn_IN.ts index cbdedb176..84c288757 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_kn_IN.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_kn_IN.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ko.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ko.ts similarity index 55% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ko.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ko.ts index 4abd1a1df..663bd26d3 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ko.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ko.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data 자신의 사용자 데이터를 변경하려면 인증이 필요합니다 - + Change your own user data 사용자 데이터 변경 - + Authentication is required to change user data 사용자 데이터를 변경하려면 인증이 필요합니다 - + Manage user accounts 사용자 계정 - + Authentication is required to enable auto login 자동 로그인을 활성화하려면 인증이 필요 합니다 - + Enable Auto Login 자동 로그인 사용 - + Authentication is required to disable auto login 자동 로그인을 비활성화하려면 인증이 필요합니다 - + Disable Auto Login 자동 로그인 사용 중지 - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password 비밀번호 없는 로그인을 사용하려면 인증이 필요합니다 - + Enable Login without password 비밀번호 없는 로그인 활성화 - + Authentication is required to disable login without password 비밀번호 없는 로그인을 비활성화 하려면 인증이 필요 합니다 - + Disable Login without password 비밀번호 없는 로그인 비활성화 - + Authentication is required to set keyboard layout 키보드 레이아웃을 설정하려면 인증이 필요합니다 - + Set keyboard layout 키보드 레이아웃 설정 diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ku.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ku.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ku.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ku.ts index b5247c4bb..78d900066 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ku.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ku.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ku_IQ.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ku_IQ.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ku_IQ.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ku_IQ.ts index 943ef7ae6..b4ffb8b49 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ku_IQ.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ku_IQ.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ky.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ky.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ky.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ky.ts index 54aa42653..8378f7562 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ky.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ky.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ky@Arab.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ky@Arab.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ky@Arab.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ky@Arab.ts index 5f2039d75..44338eea7 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ky@Arab.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ky@Arab.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_la.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_la.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_la.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_la.ts index 992e165e6..68ab24dfa 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_la.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_la.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_lo.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_lo.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_lo.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_lo.ts index b9c0bcf4d..303de3161 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_lo.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_lo.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_lt.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_lt.ts similarity index 56% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_lt.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_lt.ts index 98bfe4ab8..834cd01c8 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_lt.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_lt.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Norint keisti asmeninio naudotojo duomenis, reikalingas tapatybės nustatymas - + Change your own user data Keisti asmeninio naudotojo duomenis - + Authentication is required to change user data Norint keisti naudotojo duomenis, reikalingas tapatybės nustatymas - + Manage user accounts Tvarkyti naudotojų paskyras - + Authentication is required to enable auto login Norint įjungti automatinį prisijungimą, reikalingas tapatybės nustatymas - + Enable Auto Login Įjungti automatinį prisijungimą - + Authentication is required to disable auto login Norint išjungti automatinį prisijungimą, reikalingas tapatybės nustatymas - + Disable Auto Login Išjungti automatinį prisijungimą - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Norint įjungti prisijungimą be slaptažodžio, reikalingas tapatybės nustatymas - + Enable Login without password Įjungti prisijungimą be slaptažodžio - + Authentication is required to disable login without password Norint išjungti prisijungimą be slaptažodžio, reikalingas tapatybės nustatymas - + Disable Login without password Išjungti prisijungimą be slaptažodžio - + Authentication is required to set keyboard layout Norint nustatyti klaviatūros išdėstymą, reikalingas tapatybės nustatymas - + Set keyboard layout Nustatyti klaviatūros išdėstymą diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_lv.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_lv.ts similarity index 51% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_lv.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_lv.ts index 6bcbe0a63..f8fb15787 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_lv.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_lv.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Nepieciešama autentifikācija, lai mainītu pats savus lietotāja datus - + Change your own user data Mainīt pašam savus lietotāja datus - + Authentication is required to change user data Nepieciešama autentifikācija, lai mainītu lietotāja datus - + Manage user accounts Pārvaldīt lietotāju kontus - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ml.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ml.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ml.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ml.ts index b559ea8a9..3c7404a7b 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ml.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ml.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_mn.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_mn.ts similarity index 61% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_mn.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_mn.ts index 6be771d22..32f1f5e38 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_mn.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_mn.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Өөрийн хэрэглэгчийн өгөгдлийг өөрчлөхөд баталгаажуулалт шаардлагатай - + Change your own user data Өөрийн хэрэглэгчийн өгөгдлийг өөрчлөх - + Authentication is required to change user data Хэрэглэгчийн өгөгдлийг өөрчлөхийн тулд баталгаажуулалт шаардлагатай - + Manage user accounts Хэрэглэгчийн бүртгэлийн зохицуулах - + Authentication is required to enable auto login Автоматаар нэвтрэхийг идэвхжүүлэхийн тулд баталгаажуулалт шаардлагатай - + Enable Auto Login Автоматаар нэвтэрхийг идэвхжүүлэх - + Authentication is required to disable auto login Автоматаар нэвтрэхийг цуцлахын тулд баталгаажуулалт шаардлагатай - + Disable Auto Login Автоматаар нэвтэрхийг цуцлах - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Нууц үг ашиглалгүйгээр нэвтэрхийг идэвхжүүлэхийн тулд баталгаажуулалт шаардлагатай - + Enable Login without password Нууц үг ашиглахгүйгээр нэвтрэхийг идэвхжүүлэх - + Authentication is required to disable login without password Нууц үг ашиглалгүйгээр нэвтэрхийг цуцлахын тулд баталгаажуулалт шаардлагатай - + Disable Login without password Нууц үг ашиглахгүйгээр нэвтрэхийг цуцлах - + Authentication is required to set keyboard layout Гарын байрлалыг тохируулхын тулд баталгаажуулалт шаардлагатай - + Set keyboard layout Гарын байрлал тохируулах diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_mr.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_mr.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_mr.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_mr.ts index 4fe5da665..cb833d9d1 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_mr.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_mr.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ms.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ms.ts similarity index 55% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ms.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ms.ts index 27f8abd26..b2596d7a4 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ms.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ms.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Pengesahihan diperlukan untuk mengubah data pengguna anda sendiri - + Change your own user data Ubah data pengguna anda sendiri - + Authentication is required to change user data Pengesahihan diperlukan untuk mengubah data pengguna - + Manage user accounts Urus akaun pengguna - + Authentication is required to enable auto login Pengesahihan diperlukan untuk membolehkan daftar masuk automatik - + Enable Auto Login Benarkan Daftar Masuk Automatik - + Authentication is required to disable auto login Pengesahihan diperlukan untuk melumpuhkan daftar masuk automatik - + Disable Auto Login Lumpuhkan Daftar Masuk Automatik - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Pengesahihan diperlukan untuk membolehkan daftar masuk tanpa kata laluan - + Enable Login without password Benarkan Daftar masuk tanpa kata laluan - + Authentication is required to disable login without password Pengesahihan diperlukan untuk melumpuhkan daftar masuk tanpa kata laluan - + Disable Login without password Lumpuhkan Daftar masuk tanpa kata laluan - + Authentication is required to set keyboard layout Pengesahihan diperlukan untuk menetapkan bentangan papan kekunci - + Set keyboard layout Tetapkan bentangan papan kekunci diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_nb.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_nb.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_nb.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_nb.ts index c8ba364cd..552d8e143 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_nb.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_nb.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ne.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ne.ts similarity index 61% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ne.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ne.ts index c8664d4a6..a196bf8a9 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ne.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ne.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data तपाईंको प्रयोगकर्ता डेटा परिवर्तन गर्न प्रमाणीकरण आवश्यक छ - + Change your own user data आफ्नो प्रयोगकर्ता डेटा परिवर्तन गर्नुहोस् - + Authentication is required to change user data प्रयोगकर्ता डेटा परिवर्तन गर्न प्रमाणीकरण आवश्यक छ - + Manage user accounts प्रयोगकर्ता खाताहरू व्यवस्थापन गर्नुहोस् - + Authentication is required to enable auto login स्वत: लगइन एनबल गर्न प्रमाणीकरण आवश्यक छ - + Enable Auto Login स्वत: लगइन सक्षम गर्नुहोस् - + Authentication is required to disable auto login स्वत: लगइन असक्षम गर्न प्रमाणीकरण आवश्यक छ - + Disable Auto Login स्वत: लगइन अक्षम गर्नुहोस् - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password पासवर्ड बिना लगइन सक्षम गर्न प्रमाणीकरण आवश्यक छ - + Enable Login without password पासवर्ड बिना लगइन सक्षम गर्नुहोस् - + Authentication is required to disable login without password पासवर्ड बिना लगइन असक्षम गर्न प्रमाणीकरण आवश्यक छ - + Disable Login without password पासवर्ड बिना लगइन असक्षम पार्नुहोस् - + Authentication is required to set keyboard layout किबोर्ड लेआउट सेट गर्न प्रमाणीकरण आवश्यक छ - + Set keyboard layout किबोर्ड लेआउट सेट गर्नुहोस् diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_nl.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_nl.ts similarity index 55% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_nl.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_nl.ts index c94d176f1..9be666458 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_nl.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_nl.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Authenticatie vereist om je eigen gebruikersgegevens aan te passen - + Change your own user data Eigen gebruikersgegevens aanpassen - + Authentication is required to change user data Authenticatie vereist om gebruikersgegevens aan te passen - + Manage user accounts Gebruikersaccounts beheren - + Authentication is required to enable auto login Authenticatie vereist om automatisch aanmelden in te schakelen - + Enable Auto Login Automatisch aanmelden inschakelen - + Authentication is required to disable auto login Authenticatie vereist om automatisch aanmelden uit te schakelen - + Disable Auto Login Automatisch aanmelden uitschakelen - + Authentication is required to enable quick login Verificatie vereist om snel aanmelden in te schakelen - + Enable Quick Login Snel aanmelden inschakelen - + Authentication is required to disable quick login Verificatie vereist om snel aanmelden uit te schakelen - + Disable Quick Login Snel aanmelden uitschakelen - + + Authentication is required to enable WeChat code login + Verificatie vereist om inloggen met WeChat-code in te schakelen + + + + Enable WeChat Code Login + Inloggen met WeChat-code inschakelen + + + + Authentication is required to disable WeChat code login + Verificatie vereist om inloggen met WeChat-code uit te schakelen + + + + Disable WeChat Code Login + Inloggen met WeChat-code uitschakelen + + + Authentication is required to enable login without password Authenticatie vereist om aanmelden zonder wachtwoord in te schakelen - + Enable Login without password Aanmelden zonder wachtwoord inschakelen - + Authentication is required to disable login without password Authenticatie vereist om aanmelden zonder wachtwoord uit te schakelen - + Disable Login without password Aanmelden zonder wachtwoord uitschakelen - + Authentication is required to set keyboard layout Authenticatie vereist om de toetsenbordindeling te wijzigen - + Set keyboard layout Toetsenbordindeling instellen diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_pa.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_pa.ts similarity index 53% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_pa.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_pa.ts index 703daa6b1..6f41c11cc 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_pa.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_pa.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data ਤੁਹਾਡਾ ਯੂਜ਼ਰ ਡਾਟਾ ਬਦਲਣ ਲਈ ਪਰਮਾਣਿਤ ਹੋਣ ਦੀ ਲੋੜ ਹੈ - + Change your own user data ਆਪਣਾ ਯੂਜ਼ਰ ਡਾਟਾ ਬਦਲੋ - + Authentication is required to change user data ਯੂਜ਼ਰ ਡਾਟਾ ਬਦਲਣ ਲਈ ਪਰਮਾਣਿਤ ਹੋਣ ਦੀ ਲੋੜ ਹੈ - + Manage user accounts ਯੂਜ਼ਰ ਅਕਾਊਂਟ ਪਰਬੰਧ - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_pam.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_pam.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_pam.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_pam.ts index 9f2d18aea..51c3abff1 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_pam.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_pam.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_pl.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_pl.ts similarity index 55% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_pl.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_pl.ts index e82a95fd4..557facf23 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_pl.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_pl.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Wymagane jest uwierzytelnienie, aby zmienić własne dane - + Change your own user data Zmiana własnych danych - + Authentication is required to change user data Wymagane jest uwierzytelnienie, aby zmienić dane użytkownika - + Manage user accounts Zarządzanie kontami użytkowników - + Authentication is required to enable auto login Wymagane jest uwierzytelnienie, aby włączyć automatyczne logowanie - + Enable Auto Login Włącz automatyczne logowanie - + Authentication is required to disable auto login Wymagane jest uwierzytelnienie, aby wyłączyć automatyczne logowanie - + Disable Auto Login Wyłącz automatyczne logowanie - + Authentication is required to enable quick login Wymagane jest uwierzytelnienie, aby włączyć szybkie logowanie - + Enable Quick Login Włącz szybkie logowanie - + Authentication is required to disable quick login Wymagane jest uwierzytelnienie, aby wyłączyć szybkie logowanie - + Disable Quick Login Wyłącz szybkie logowanie - + + Authentication is required to enable WeChat code login + Wymagane jest uwierzytelnienie, aby włączyć logowanie kodem WeChat + + + + Enable WeChat Code Login + Włącz logowanie kodem WeChat + + + + Authentication is required to disable WeChat code login + Wymagane jest uwierzytelnienie, aby wyłączyć logowanie kodem WeChat + + + + Disable WeChat Code Login + Wyłącz logowanie kodem WeChat + + + Authentication is required to enable login without password Wymagane jest uwierzytelnienie, aby włączyć logowanie bez podawania hasła - + Enable Login without password Włącz logowanie bez podawania hasła - + Authentication is required to disable login without password Wymagane jest uwierzytelnienie, aby wyłączyć logowanie bez podawania hasła - + Disable Login without password Wyłącz logowanie bez podawania hasła - + Authentication is required to set keyboard layout Wymagane jest uwierzytelnienie, aby ustawić układ klawiatury - + Set keyboard layout Ustaw układ klawiatury diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ps.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ps.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ps.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ps.ts index 7b4a86b5d..17cf4a629 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ps.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ps.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_pt.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_pt.ts similarity index 58% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_pt.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_pt.ts index b8215a2e4..2cbe338b0 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_pt.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_pt.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data É necessária a autenticação para alterar os seus próprios dados de utilizador - + Change your own user data Alterar os seus próprios dados de utilizador - + Authentication is required to change user data É necessária a autenticação para alterar os dados de utilizador - + Manage user accounts Gerir contas de utilizador - + Authentication is required to enable auto login É necessária a autenticação para ativar o início de sessão automático - + Enable Auto Login Ativar o início de sessão automático - + Authentication is required to disable auto login É necessária a autenticação para desativar o início de sessão automático - + Disable Auto Login Desativar o início de sessão automático - + Authentication is required to enable quick login É necessária autenticação para ativar o início de sessão rápido - + Enable Quick Login Ativar o início de sessão rápido - + Authentication is required to disable quick login É necessária autenticação para desativar o início de sessão rápido - + Disable Quick Login Desativar o início de sessão rápido - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password É necessária a autenticação para ativar o início de sessão sem palavra-passe - + Enable Login without password Ativar o início de sessão sem palavra-passe - + Authentication is required to disable login without password É necessária a autenticação para desativar o início de sessão sem palavra-passe - + Disable Login without password Desativar o início de sessão sem palavra-passe - + Authentication is required to set keyboard layout É necessária a autenticação para definir o esquema do teclado - + Set keyboard layout Definir esquema do teclado diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_pt_BR.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_pt_BR.ts similarity index 52% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_pt_BR.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_pt_BR.ts index 0634a1579..9c414f5c3 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_pt_BR.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_pt_BR.ts @@ -2,94 +2,114 @@ policy - + Authentication is required to change your own user data A autenticação é necessária para alterar os dados do usuário - + Change your own user data Alterar seus próprios dados de usuário - + Authentication is required to change user data A autenticação é necessária para alterar os dados do usuário - + Manage user accounts Gerenciar Contas de Usuário - + Authentication is required to enable auto login A autenticação é necessária para ativar o login automático - + Enable Auto Login Login automático - + Authentication is required to disable auto login A autenticação é necessária para desativar o login automático - + Disable Auto Login Login automático - + Authentication is required to enable quick login - + A autenticação é necessária para ativar o login rápido - + Enable Quick Login - + Ativar login rápido - + Authentication is required to disable quick login - + A autenticação é necessária para desativar o login rápido - + Disable Quick Login + Desativar login rápido + + + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login - + Authentication is required to enable login without password A autenticação é necessária para ativar o login sem senha - + Enable Login without password Login sem senha - + Authentication is required to disable login without password A autenticação é necessária para desativar o login sem senha - + Disable Login without password Login sem senha - + Authentication is required to set keyboard layout A autenticação é necessária para alterar o layout de teclado - + Set keyboard layout - Definir o layout de teclado + Definir layout de teclado \ No newline at end of file diff --git a/misc/ts/org.deepin.dde.accounts1.policy/policy_qu.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_qu.ts new file mode 100644 index 000000000..8afad9be3 --- /dev/null +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_qu.ts @@ -0,0 +1,115 @@ + + + policy + + + Authentication is required to change your own user data + + + + + Change your own user data + + + + + Authentication is required to change user data + + + + + Manage user accounts + + + + + Authentication is required to enable auto login + + + + + Enable Auto Login + + + + + Authentication is required to disable auto login + + + + + Disable Auto Login + + + + + Authentication is required to enable quick login + + + + + Enable Quick Login + + + + + Authentication is required to disable quick login + + + + + Disable Quick Login + + + + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + + Authentication is required to enable login without password + + + + + Enable Login without password + + + + + Authentication is required to disable login without password + + + + + Disable Login without password + + + + + Authentication is required to set keyboard layout + + + + + Set keyboard layout + + + + \ No newline at end of file diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ro.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ro.ts similarity index 56% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ro.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ro.ts index 060bda56b..5697f0f36 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ro.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ro.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Autentificarea este necesară pentru a vă schimba propriile date de utilizator - + Change your own user data Modificați-vă datele de utilizator - + Authentication is required to change user data Autentificarea este necesară pentru a modifica date de utilizator - + Manage user accounts Administrați conturile de utilizator - + Authentication is required to enable auto login Autentificarea este necesară pentru a activa autentificarea automată - + Enable Auto Login Activați autentificarea automată - + Authentication is required to disable auto login Autentificarea este necesară pentru a dezactiva autentificarea automată - + Disable Auto Login Dezactivați autentificarea automată - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Autentificarea este necesară pentru a activa autentificarea fără parolă - + Enable Login without password Activați autentificarea fără parolă - + Authentication is required to disable login without password Autentificarea este necesară pentru a dezactiva autentificarea fără parolă - + Disable Login without password Dezactivați autentificarea fără parolă - + Authentication is required to set keyboard layout Autentificarea este necesară pentru a modifica aspectul tastaturii - + Set keyboard layout Modificați aspectul tastaturii diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ru.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ru.ts similarity index 60% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ru.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ru.ts index 36e754091..5c3b7b6ff 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ru.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ru.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Для изменения личных пользовательских данных требуется аутентификация - + Change your own user data Изменить личные пользовательские данные - + Authentication is required to change user data Для изменения пользовательских данных требуется аутентификация - + Manage user accounts Управление учётными записями пользователей - + Authentication is required to enable auto login Для активации автоматического входа требуется аутентификация - + Enable Auto Login Активировать автоматический вход - + Authentication is required to disable auto login Для отключения автоматического входа требуется аутентификация - + Disable Auto Login Отключить Автоматический Вход - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Для активации входа без ввода пароля требуется аутентификация - + Enable Login without password Активировать Вход без ввода пароля - + Authentication is required to disable login without password Для отключения входа без ввода пароля требуется аутентификация - + Disable Login without password Отключить Вход без ввода пароля - + Authentication is required to set keyboard layout Для того чтобы задать раскладку клавиатуры требуется аутентификация - + Set keyboard layout Задать раскладку клавиатуры diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ru_UA.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ru_UA.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ru_UA.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ru_UA.ts index e1b329bbd..47d6b1d48 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ru_UA.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ru_UA.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_sc.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_sc.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_sc.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_sc.ts index c1c8d4e44..5890985f3 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_sc.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_sc.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_si.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_si.ts similarity index 62% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_si.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_si.ts index d88de362f..feaf216f8 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_si.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_si.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data ඔබේ පරිශීලක දත්ත වෙනස් කිරීමට සත්‍යාපනය අවශ්‍ය වේ - + Change your own user data ඔබේ පරිශීලක දත්ත වෙනස් කරන්න - + Authentication is required to change user data පරිශීලක දත්ත වෙනස් කිරීම සඳහා සත්‍යාපනය අවශ්‍ය වේ - + Manage user accounts පරිශීලක ගිණුම් කළමනාකරණය කරන්න - + Authentication is required to enable auto login ස්වයංක්‍රීය පිවිසුම සක්‍රීය කිරීම සඳහා සත්‍යාපනය අවශ්‍ය වේ - + Enable Auto Login ස්වයංක්‍රීය පිවිසුම සක්‍රීය කරන්න - + Authentication is required to disable auto login ස්වයංක්‍රීය පිවිසුම අක්‍රිය කිරීමට සත්‍යාපනය අවශ්‍ය වේ - + Disable Auto Login ස්වයංක්‍රීය පිවිසුම අක්‍රීය කරන්න - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password මුරපදය නොමැතිව පිවිසීම සක්‍රිය කිරීම සඳහා සත්‍යාපනය අවශ්‍ය වේ - + Enable Login without password මුරපදය නොමැතිව පිවිසීම සක්‍රීය කරන්න - + Authentication is required to disable login without password මුරපදය නොමැතිව පිවීසීම අක්‍රිය කිරීමට සත්‍යාපනය අවශ්‍ය වේ - + Disable Login without password මුරපදය නොමැතිව පිවිසීම අක්‍රීය කරන්න - + Authentication is required to set keyboard layout යතුරු පුවරුවේ පිරිවිතර සැකසීමට සත්‍යාපනය අවශ්‍ය වේ - + Set keyboard layout යතුරු පුවරුවේ පිරිවිතර සකසන්න diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_sk.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_sk.ts similarity index 56% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_sk.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_sk.ts index a2e44d327..c7f51e9d0 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_sk.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_sk.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Na zmenu vlastných používateľských údajov je potrebné overenie totožnosti - + Change your own user data Zmeniť svoje vlastné používateľské údaje - + Authentication is required to change user data Na zmenu používateľských údajov je potrebné overenie totožnosti - + Manage user accounts Spravovať používateľské účty - + Authentication is required to enable auto login Na automatické prihlásenie sa vyžaduje overenie - + Enable Auto Login Povoliť automatické prihlásenie - + Authentication is required to disable auto login Na zakázanie automatického prihlásenia sa vyžaduje overenie - + Disable Auto Login Zakázať automatické prihlásenie - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Na povolenie automatického prihlásenia bez hesla sa vyžaduje overenie - + Enable Login without password Povoliť prihlásenie bez hesla - + Authentication is required to disable login without password Na zakázanie automatického prihlásenia bez hesla sa vyžaduje overenie - + Disable Login without password Zakázať prihlásenie bez hesla - + Authentication is required to set keyboard layout Na nastavenie rozloženia klávesnice je potrebné overenie - + Set keyboard layout Nastavte rozloženie klávesnice diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_sl.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_sl.ts similarity index 54% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_sl.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_sl.ts index ff4d3bb36..31b940bda 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_sl.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_sl.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Za spremembo lastnih podatkov je zahtevana overitev - + Change your own user data Spremenite uporabniške podatke - + Authentication is required to change user data Srememba podatkov uporabnika zahteva overitev - + Manage user accounts Upravljanje uporabniških računov - + Authentication is required to enable auto login Vklop samodejne prijave zahteva overitev - + Enable Auto Login Vklopi samodejno prijavo - + Authentication is required to disable auto login Izklop samodejne prijave zahteva overitev - + Disable Auto Login Izklopi samodejno prijavo - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Prijava brez gesla zahteva overitev - + Enable Login without password Vklopi prijavo brez gesla - + Authentication is required to disable login without password Izklop prijave brez gesla zahteva overitev - + Disable Login without password Izklopi prijavo brez gesla - + Authentication is required to set keyboard layout Sprememba razporeda tipkovnice zahteva overitev - + Set keyboard layout Določi razpored tipkovnice diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_sq.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_sq.ts similarity index 55% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_sq.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_sq.ts index c3ccadb86..1561f363d 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_sq.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_sq.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Që të ndryshoni të dhënat tuaja të përdoruesit, lypset mirëfilltësim - + Change your own user data Ndryshoni të dhënat tuaja të përdoruesit - + Authentication is required to change user data Që të ndryshoni të dhëna përdoruesi, lypset mirëfilltësim - + Manage user accounts Administroni llogari përdoruesish - + Authentication is required to enable auto login Që të aktivizoni hyrje të automatizuara, lypset mirëfilltësim - + Enable Auto Login Aktivizoni Hyrje të Automatizuara - + Authentication is required to disable auto login Që të çaktivizoni hyrje të automatizuara, lypset mirëfilltësim - + Disable Auto Login Çaktivizoni Hyrje të Automatizuara - + Authentication is required to enable quick login Që të aktivizohet hyrje e shpejtë, lypset mirëfilltësim - + Enable Quick Login Aktivizo Hyrje të Shpejtë - + Authentication is required to disable quick login Që të çaktivizohet hyrje e shpejtë, lypset mirëfilltësim - + Disable Quick Login Çaktivizo Hyrje të Shpejtë - + + Authentication is required to enable WeChat code login + Që të aktivizohet hyrje me kod WeChat, lypset të bëhet mirëfilltësimi + + + + Enable WeChat Code Login + Aktivizo Hyrje me Kod WeChat + + + + Authentication is required to disable WeChat code login + Që të çaktivizohet hyrje me kod WeChat, lypset të bëhet mirëfilltësimi + + + + Disable WeChat Code Login + Çaktivizo Hyrje me Kod WeChat + + + Authentication is required to enable login without password Që të aktivizoni hyrje pa fjalëkalim, lypset mirëfilltësim - + Enable Login without password Aktivizoni Hyrje pa fjalëkalim - + Authentication is required to disable login without password Që të çaktivizoni hyrje pa fjalëkalim, lypset mirëfilltësim - + Disable Login without password Çaktivizoni Hyrje pa fjalëkalim - + Authentication is required to set keyboard layout Që të caktoni skemë tastiere, lypset mirëfilltësim - + Set keyboard layout Caktoni skemë tastiere diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_sr.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_sr.ts similarity index 60% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_sr.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_sr.ts index b964c119f..fda4b7143 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_sr.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_sr.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Идентификација је неопходна за промену сопствених корисничких података - + Change your own user data Промените сопствене корисничке податке - + Authentication is required to change user data Идентификација је неопходна за промену корисничких података - + Manage user accounts Управљај корисничким налозима - + Authentication is required to enable auto login Идентификација је неопходна да се омогући аутоматско пријављивање - + Enable Auto Login Омогући аутоматско пријављивање - + Authentication is required to disable auto login Идентификација је неопходна да се онемогући аутоматско пријављивање - + Disable Auto Login Онемогући аутоматско пријављивање - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Идентификација је неопходна да се омогући пријављивање без лозинке - + Enable Login without password Омогући пријављивање без лозинке - + Authentication is required to disable login without password Идентификација је неопходна да се онемогући пријављивање без лозинке - + Disable Login without password Онемогући пријављивање без лозинке - + Authentication is required to set keyboard layout Идентификација је неопходна за подешавање распореда тастатуре - + Set keyboard layout Подеси распоред тастатуре diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_sv.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_sv.ts similarity index 55% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_sv.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_sv.ts index 74b9751ff..8accda582 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_sv.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_sv.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Autentisering krävs för att ändra ditt egna användardata - + Change your own user data Ändra ditt egna användardata - + Authentication is required to change user data Autentisering krävs för att ändra användardata - + Manage user accounts Hantera användarkonton - + Authentication is required to enable auto login Autentisering krävs för att aktivera automatisk inloggning - + Enable Auto Login Aktivera automatisk inloggning - + Authentication is required to disable auto login Autentisering krävs för att inaktivera automatisk inloggning - + Disable Auto Login Inaktivera automatisk inloggning - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Autentisering krävs för att aktivera inloggning utan lösenord - + Enable Login without password Aktivera inloggning utan lösenord - + Authentication is required to disable login without password Autentisering krävs för att inaktivera inloggning utan lösenord - + Disable Login without password Inaktivera inloggning utan lösenord - + Authentication is required to set keyboard layout Autentisering krävs för att ändra tangentbordslayout - + Set keyboard layout Ändra tangentbordslayout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_sv_SE.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_sv_SE.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_sv_SE.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_sv_SE.ts index d84e6f51f..78e08eb4c 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_sv_SE.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_sv_SE.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_sw.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_sw.ts similarity index 54% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_sw.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_sw.ts index 33d44cba3..2f5f3112e 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_sw.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_sw.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Thibitisha inahitaji kugeuza taarifa ya mtumiaji yako - + Change your own user data Geuza taarifa ya mtumiaji yako - + Authentication is required to change user data Thibitisha inahitaji kugeuza taarifa za mtumiaji - + Manage user accounts Simamia akaunti za mtumiaji - + Authentication is required to enable auto login Thibitisha inahitaji kuwezesha kuingia moja kwa moja - + Enable Auto Login Wezesha kuingia moja kwa moja - + Authentication is required to disable auto login Thibitisha inahitaji kulemaza kuingia moja kwa moja - + Disable Auto Login Lemaza kuingia moja kwa moja - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Thibitisha inahitaji kuwezesha kuingia bila nywila - + Enable Login without password Wezesha kuingia bila nywila - + Authentication is required to disable login without password Thibitisha inahitaji kulemaza kuingia bila nywila - + Disable Login without password Lemaza kuingia bila nywila - + Authentication is required to set keyboard layout Thibitisha inahitaji kuchagua mpangilio wa kibodi - + Set keyboard layout Chagua mpangilio wa kibodi diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ta.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ta.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ta.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ta.ts index 5bc17ad24..5879c1efa 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ta.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ta.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_te.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_te.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_te.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_te.ts index 794ed5471..8367ecd35 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_te.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_te.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_th.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_th.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_th.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_th.ts index 3a2399164..bb6ecfad2 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_th.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_th.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_tr.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_tr.ts similarity index 56% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_tr.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_tr.ts index 7a5ee9ae5..108ee0014 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_tr.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_tr.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Kullanıcı verilerinizi değiştirmek için kimlik doğrulaması gerekli - + Change your own user data Kullanıcı bilgilerinizi değiştirin - + Authentication is required to change user data Kullanıcı verilerini değiştirmek için kimlik doğrulaması gerekli - + Manage user accounts Kullanıcı hesaplarını yönet - + Authentication is required to enable auto login Otomatik oturum açmayı etkinleştirmek için kimlik doğrulaması gerekli - + Enable Auto Login Otomatik Girişi Etkinleştir - + Authentication is required to disable auto login Otomatik girişi devre dışı bırakmak için kimlik doğrulaması gerekli - + Disable Auto Login Otomatik Giriş Devre Dışı - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Parola olmadan oturum açmak için kimlik doğrulaması gerekli - + Enable Login without password Parola olmadan oturum açmayı etkinleştir - + Authentication is required to disable login without password Parola olmadan oturum açmayı devre dışı bırakmak için kimlik doğrulaması gerekli - + Disable Login without password Parola olmadan oturum açma devre dışı - + Authentication is required to set keyboard layout Klavye düzenini ayarlamak için kimlik doğrulaması gerekli - + Set keyboard layout Klavye düzenini ayarla diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_tzm.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_tzm.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_tzm.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_tzm.ts index 6767afc3b..5194bd98f 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_tzm.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_tzm.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ug.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ug.ts similarity index 60% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ug.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ug.ts index 0fd06e846..375fb4f2d 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ug.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ug.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data ئۆزىڭىزنىڭ ئابونت سانلىق مەلۇماتىنى ئۆزگەرتىش ئۈچۈن سالاھىيىتىڭىزنى دەلىللەشكە توغرا كېلىدۇ - + Change your own user data ئۆزىڭىزنىڭ ئابونت سانلىق مەلۇماتىنى ئۆزگەرتىڭ - + Authentication is required to change user data ئابونىت سانلىق مەلۇماتىنى ئۆزگەرتىش ئۈچۈن سالاھىيەت سالاھىتىڭىزنى دەلىىللەڭ - + Manage user accounts ئابونىت ھېسابات نۇمىرىنى باشقۇرۇش - + Authentication is required to enable auto login ئاپتۇماتىك تىزىملاش ئۈچۈن سالاھىتىڭىزنى دەللىللەشكە توغرا كىلىدۇ - + Enable Auto Login ئاپتۇماتىك كىرىشنى ئېچىش - + Authentication is required to disable auto login ئاپتۇماتىك كىرىشنى تاقاش ئۈچۈن سالاھىيەت دەلىللەش كېرەك - + Disable Auto Login ئاپتۇماتىك تىزىملاپ كىرىشنى چەكلەش - + Authentication is required to enable quick login تېزلەتمە كىرىشنى ئېچىش ئۈچۈن سالاھىيەت دەلىللەش كېرەك - + Enable Quick Login تېزلەتمە كىرىشنى ئېچىش - + Authentication is required to disable quick login تېزلەتمە كىرىشنى تاقاش ئۈچۈن سالاھىيەت دەلىللەش كېرەك - + Disable Quick Login تېزلەتمە كىرىشنى تاقاش - + + Authentication is required to enable WeChat code login + ئۈندىداردا سايىلەپ كىرىشنى ئېچىش ئۈچۈن سالاھىيەت دەلىللەش كېرەك + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + ئۈندىداردا سايىلەپ كىرىشنى تاقاش ئۈچۈن سالاھىيەت دەلىللەش كېرەك + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password مەخپى نۇمۇرسىز كىرىش ئۈچۈن سالاھىيەت دەلىللەشكە توغرا كىلىدۇ - + Enable Login without password ئابونىت مەخپى شىفىرسىز كىرىش - + Authentication is required to disable login without password مەخپى شىفىرسىز كىرىشنى توىتىتىش ئۈچۈن سالاھىيەت دەللىللەش كېرەك - + Disable Login without password مەخپى شىفىرسىز كىرىشنى چەكلەش - + Authentication is required to set keyboard layout كۇنۇپكا تاختىسى ئورۇنلاشتۇرۇش ئۈچۈن سالاھىيىتىنى تەكشۈرۈشكە توغرا كېلىدۇ - + Set keyboard layout كونۇپكا تاختىىسى تەڭشەش diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_uk.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_uk.ts similarity index 61% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_uk.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_uk.ts index dfaace0a6..a6b3176ee 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_uk.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_uk.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Для зміни даних вашого користувача потрібно пройти розпізнавання - + Change your own user data Зміна даних вашого користувача - + Authentication is required to change user data Для зміни даних користувача потрібно пройти розпізнавання - + Manage user accounts Керування обліковими записами - + Authentication is required to enable auto login Для вмикання автоматично входу слід пройти розпізнавання - + Enable Auto Login Вмикання автоматичного входу - + Authentication is required to disable auto login Для вимикання автоматичного входу слід пройти розпізнавання - + Disable Auto Login Вимикання автоматичного входу - + Authentication is required to enable quick login Для вмикання швидкого входу слід пройти розпізнавання - + Enable Quick Login Вмикання швидкого входу - + Authentication is required to disable quick login Для вимикання швидкого входу слід пройти розпізнавання - + Disable Quick Login Вимикання швидкого входу - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Для вмикання можливості входу без пароля слід пройти розпізнавання - + Enable Login without password Вмикання входу без пароля - + Authentication is required to disable login without password Для вимикання можливості входу без пароля слід пройти розпізнавання - + Disable Login without password Вимикання входу без пароля - + Authentication is required to set keyboard layout Для встановлення розкладки клавіатури слід пройти розпізнавання - + Set keyboard layout Встановлення розкладки клавіатури diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_ur.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_ur.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_ur.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_ur.ts index fcaef563b..17ee7727a 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_ur.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_ur.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_uz.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_uz.ts similarity index 50% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_uz.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_uz.ts index 49f8a6ef9..31c1ffaa2 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_uz.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_uz.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data - + Change your own user data - + Authentication is required to change user data - + Manage user accounts - + Authentication is required to enable auto login - + Enable Auto Login - + Authentication is required to disable auto login - + Disable Auto Login - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password - + Enable Login without password - + Authentication is required to disable login without password - + Disable Login without password - + Authentication is required to set keyboard layout - + Set keyboard layout diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_vi.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_vi.ts similarity index 56% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_vi.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_vi.ts index 291aa4db1..904f381e3 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_vi.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_vi.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data Cần xác thực để thay đổi dữ liệu người dùng của chính mình - + Change your own user data Thay đổi dữ liệu người dùng của chính mình - + Authentication is required to change user data Cần xác thực để thay đổi dữ liệu người dùng - + Manage user accounts Quản lý tài khoản người dùng - + Authentication is required to enable auto login Cần xác thực để cho phép tự động đăng nhập - + Enable Auto Login Cho phép Tự động Đăng nhập - + Authentication is required to disable auto login Cần xác thực để vô hiệu hóa tự động đăng nhập - + Disable Auto Login Vô hiệu hóa Tự động Đăng nhập - + Authentication is required to enable quick login - + Enable Quick Login - + Authentication is required to disable quick login - + Disable Quick Login - + + Authentication is required to enable WeChat code login + + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password Cần xác thực để cho phép đăng nhập mà không cần mật mã - + Enable Login without password Kích hoạt đăng nhập không cần mật khẩu - + Authentication is required to disable login without password Cần có xác thực để vô hiệu hóa đăng nhập mà không cần mật khẩu - + Disable Login without password Vô hiệu hóa Đăng nhập mà không cần mật khẩu - + Authentication is required to set keyboard layout Cần xác thực để đặt bố cục bàn phím - + Set keyboard layout Cài đặt bố cục bàn phím diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_zh_CN.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_zh_CN.ts similarity index 53% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_zh_CN.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_zh_CN.ts index 73ff01973..0f3dcae8e 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_zh_CN.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_zh_CN.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data 修改您的用户数据需要认证 - + Change your own user data 修改您的用户数据 - + Authentication is required to change user data 修改用户数据需要认证 - + Manage user accounts 管理用户帐户 - + Authentication is required to enable auto login 开启自动登录需要认证 - + Enable Auto Login 开启自动登录 - + Authentication is required to disable auto login 关闭自动登录需要认证 - + Disable Auto Login 关闭自动登录 - + Authentication is required to enable quick login 开启快速登录需要认证 - + Enable Quick Login 开启快速登录 - + Authentication is required to disable quick login 关闭快速登录需要认证 - + Disable Quick Login 关闭快速登录 - + + Authentication is required to enable WeChat code login + 开启微信扫码登录需要认证 + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + 关闭微信扫码登录需要认证 + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password 开启无密码登录需要认证 - + Enable Login without password 开启无密码登录 - + Authentication is required to disable login without password 关闭无密码登录需要认证 - + Disable Login without password 关闭无密码登录 - + Authentication is required to set keyboard layout 设置键盘布局需要认证 - + Set keyboard layout 设置键盘布局 diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_zh_HK.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_zh_HK.ts similarity index 53% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_zh_HK.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_zh_HK.ts index 178d0d291..8825949a7 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_zh_HK.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_zh_HK.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data 修改您的用戶數據需要認證 - + Change your own user data 修改您的用戶數據 - + Authentication is required to change user data 修改用戶數據需要認證 - + Manage user accounts 管理用戶帳戶 - + Authentication is required to enable auto login 開啟自動登錄需要認證 - + Enable Auto Login 開啟自動登錄 - + Authentication is required to disable auto login 關閉自動登錄需要認證 - + Disable Auto Login 關閉自動登錄 - + Authentication is required to enable quick login 開啟快速登錄需要認證 - + Enable Quick Login 開啟快速登錄 - + Authentication is required to disable quick login 關閉快速登錄需要認證 - + Disable Quick Login 關閉快速登錄 - + + Authentication is required to enable WeChat code login + 開啟微信掃碼登錄需要認證 + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + 關閉微信掃碼登錄需要認證 + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password 開啟無密碼登錄需要認證 - + Enable Login without password 開啟無密碼登錄 - + Authentication is required to disable login without password 關閉無密碼登錄需要認證 - + Disable Login without password 關閉無密碼登錄 - + Authentication is required to set keyboard layout 設置鍵盤佈局需要認證 - + Set keyboard layout 設置鍵盤佈局 diff --git a/misc/ts/com.deepin.daemon.accounts.policy/policy_zh_TW.ts b/misc/ts/org.deepin.dde.accounts1.policy/policy_zh_TW.ts similarity index 53% rename from misc/ts/com.deepin.daemon.accounts.policy/policy_zh_TW.ts rename to misc/ts/org.deepin.dde.accounts1.policy/policy_zh_TW.ts index 9601c1aaa..3a249d3c9 100644 --- a/misc/ts/com.deepin.daemon.accounts.policy/policy_zh_TW.ts +++ b/misc/ts/org.deepin.dde.accounts1.policy/policy_zh_TW.ts @@ -2,92 +2,112 @@ policy - + Authentication is required to change your own user data 若要變更您自身的使用者資料需要通過認證 - + Change your own user data 變更您自身的使用者資料 - + Authentication is required to change user data 若要變更使用者資料需要通過認證 - + Manage user accounts 管理使用者帳戶 - + Authentication is required to enable auto login 啟用自動登入需要身份核對 - + Enable Auto Login 啟用自動登入 - + Authentication is required to disable auto login 停用自動登入需要身份核對 - + Disable Auto Login 停用自動登入 - + Authentication is required to enable quick login 開啟快速登入需要認證 - + Enable Quick Login 開啟快速登入 - + Authentication is required to disable quick login 關閉快速登入需要認證 - + Disable Quick Login 關閉快速登入 - + + Authentication is required to enable WeChat code login + 開啟微信掃碼登入需要認證 + + + + Enable WeChat Code Login + + + + + Authentication is required to disable WeChat code login + 關閉微信掃碼登入需要認證 + + + + Disable WeChat Code Login + + + + Authentication is required to enable login without password 啟用無密碼登入需要身份核對 - + Enable Login without password 啟用無密碼登入 - + Authentication is required to disable login without password 停用無密碼登入需要身份核對 - + Disable Login without password 停用無密碼登入 - + Authentication is required to set keyboard layout 設定鍵盤配置需要身份核對 - + Set keyboard layout 設定鍵盤配置 diff --git a/misc/udev-rules/80-deepin-fprintd.rules b/misc/udev-rules/80-deepin-fprintd.rules index d3d3554ab..7063a40c9 100644 --- a/misc/udev-rules/80-deepin-fprintd.rules +++ b/misc/udev-rules/80-deepin-fprintd.rules @@ -1 +1 @@ -SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_interface", ACTION=="add|remove", ENV{LIBFPRINT_DRIVER}!="" RUN+="/usr/bin/dbus-send --system --dest=com.deepin.daemon.Fprintd --print-reply /com/deepin/daemon/Fprintd com.deepin.daemon.Fprintd.TriggerUDevEvent" +SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_interface", ACTION=="add|remove", ENV{LIBFPRINT_DRIVER}!="", RUN+="/usr/bin/dbus-send --system --dest=org.deepin.dde.Fprintd1 --print-reply /org/deepin/dde/Fprintd1 org.deepin.dde.Fprintd1.TriggerUDevEvent" diff --git a/network/README.md b/network1/README.md similarity index 96% rename from network/README.md rename to network1/README.md index 959b8e6a6..7eb5bd25c 100644 --- a/network/README.md +++ b/network1/README.md @@ -165,7 +165,7 @@ VPN(已支持 L2TP, PPTP, OpenConnect, OpenVPN, StrongSwan, VPNC等至少6 - `xxxJSON`: JSON string 类型, 为了方便前后端交互, 同时减少 DBus 参数数 量, deepin 网络后端用了很多 JSON string 类型的参数 -### com.deepin.daemon.Network +### org.deepin.dde.Network1 - 当前网络状态 - `GetActiveConnectionInfo() (acinfosJSON string)` @@ -223,7 +223,7 @@ VPN(已支持 L2TP, PPTP, OpenConnect, OpenVPN, StrongSwan, VPNC等至少6 - `SetProxyIgnoreHosts(ignoreHosts string)` - `SetProxyMethod(proxyMode string)` -### com.deepin.daemon.Network.ConnectionSession +### org.deepin.dde.Network1.ConnectionSession - DBus 属性 - **prop** `ConnectionPath dbus.ObjectPath` @@ -415,26 +415,26 @@ VPN(已支持 L2TP, PPTP, OpenConnect, OpenVPN, StrongSwan, VPNC等至少6 1. 获取 deepin 网络后端提供的所有网络设备信息 ```sh - dbus-send --print-reply --dest=com.deepin.daemon.Network \ - /com/deepin/daemon/Network org.freedesktop.DBus.Properties.Get \ - string:"com.deepin.daemon.Network" string:"Devices" + dbus-send --print-reply --dest=org.deepin.dde.Network1 \ + /org/deepin/dde/Network1 org.freedesktop.DBus.Properties.Get \ + string:"org.deepin.dde.Network1" string:"Devices" ``` 1. 设置 deepin 网络后端提供的 WiFi 无线, VPN 等开关状态 ```sh dbus-send --print-reply --type=method_call \ - --dest=com.deepin.daemon.Network /com/deepin/daemon/Network \ + --dest=org.deepin.dde.Network1 /org/deepin/dde/Network1 \ org.freedesktop.DBus.Properties.Set \ - string:"com.deepin.daemon.Network" string:"NetworkingEnabled" variant:boolean:"true" + string:"org.deepin.dde.Network1" string:"NetworkingEnabled" variant:boolean:"true" dbus-send --print-reply --type=method_call \ - --dest=com.deepin.daemon.Network /com/deepin/daemon/Network \ + --dest=org.deepin.dde.Network1 /org/deepin/dde/Network1 \ org.freedesktop.DBus.Properties.Set \ - string:"com.deepin.daemon.Network" string:"WirelessEnabled" variant:boolean:"true" + string:"org.deepin.dde.Network1" string:"WirelessEnabled" variant:boolean:"true" dbus-send --print-reply --type=method_call \ - --dest=com.deepin.daemon.Network /com/deepin/daemon/Network \ + --dest=org.deepin.dde.Network1 /org/deepin/dde/Network1 \ org.freedesktop.DBus.Properties.Set \ - string:"com.deepin.daemon.Network" string:"VpnEnabled" variant:boolean:"true" + string:"org.deepin.dde.Network1" string:"VpnEnabled" variant:boolean:"true" ``` ## 相关网络配置文件 @@ -555,7 +555,7 @@ VPN(已支持 L2TP, PPTP, OpenConnect, OpenVPN, StrongSwan, VPNC等至少6 1. 获取 deepin 网络后端 DBus 接口 XML 配置 ```sh - dbus-send --type=method_call --print-reply --dest=com.deepin.daemon.Network /com/deepin/daemon/Network org.freedesktop.DBus.Introspectable.Introspect | sed 1d | sed -e '1s/^ string "//' | sed '$s/"$//' + dbus-send --type=method_call --print-reply --dest=org.deepin.dde.Network1 /org/deepin/dde/Network1 org.freedesktop.DBus.Introspectable.Introspect | sed 1d | sed -e '1s/^ string "//' | sed '$s/"$//' ``` 1. 监听 WiFi 热点信号强度变化 diff --git a/network/decode_ssid.go b/network1/decode_ssid.go similarity index 100% rename from network/decode_ssid.go rename to network1/decode_ssid.go diff --git a/network/examples/python/README.md b/network1/examples/python/README.md similarity index 100% rename from network/examples/python/README.md rename to network1/examples/python/README.md diff --git a/network/examples/python/dbus_gen/com_deepin_daemon_Network.py b/network1/examples/python/dbus_gen/com_deepin_daemon_Network.py similarity index 99% rename from network/examples/python/dbus_gen/com_deepin_daemon_Network.py rename to network1/examples/python/dbus_gen/com_deepin_daemon_Network.py index bd64f2e79..f3c315a55 100644 --- a/network/examples/python/dbus_gen/com_deepin_daemon_Network.py +++ b/network1/examples/python/dbus_gen/com_deepin_daemon_Network.py @@ -22,7 +22,7 @@ class Network(object): ''' - com.deepin.daemon.Network + org.deepin.dde.Network1 Usage: ------ @@ -35,7 +35,7 @@ class Network(object): def __init__(self, bus_name, object_path, interface=None, bus=None): '''Constructor''' - self._dbus_interface_name = interface or "com.deepin.daemon.Network" + self._dbus_interface_name = interface or "org.deepin.dde.Network1" self._dbus_object_path = object_path self._dbus_name = bus_name diff --git a/network/examples/python/dbus_gen/com_deepin_daemon_Network_ConnectionSession.py b/network1/examples/python/dbus_gen/com_deepin_daemon_Network_ConnectionSession.py similarity index 100% rename from network/examples/python/dbus_gen/com_deepin_daemon_Network_ConnectionSession.py rename to network1/examples/python/dbus_gen/com_deepin_daemon_Network_ConnectionSession.py diff --git a/network/examples/python/dbus_gen/dbus_dde_daemon_network.xml b/network1/examples/python/dbus_gen/dbus_dde_daemon_network.xml similarity index 99% rename from network/examples/python/dbus_gen/dbus_dde_daemon_network.xml rename to network1/examples/python/dbus_gen/dbus_dde_daemon_network.xml index be9a7a259..5ac5364d7 100644 --- a/network/examples/python/dbus_gen/dbus_dde_daemon_network.xml +++ b/network1/examples/python/dbus_gen/dbus_dde_daemon_network.xml @@ -1,5 +1,5 @@ - + diff --git a/network/examples/python/dbus_gen/dbus_dde_daemon_network_connectionsession.xml b/network1/examples/python/dbus_gen/dbus_dde_daemon_network_connectionsession.xml similarity index 100% rename from network/examples/python/dbus_gen/dbus_dde_daemon_network_connectionsession.xml rename to network1/examples/python/dbus_gen/dbus_dde_daemon_network_connectionsession.xml diff --git a/network/examples/python/gen_dbus_code.sh b/network1/examples/python/gen_dbus_code.sh similarity index 52% rename from network/examples/python/gen_dbus_code.sh rename to network1/examples/python/gen_dbus_code.sh index 23343145b..7d3a66c9a 100755 --- a/network/examples/python/gen_dbus_code.sh +++ b/network1/examples/python/gen_dbus_code.sh @@ -3,8 +3,8 @@ output_dir="./dbus_gen" mkdir -p "${output_dir}" -# com.deepin.daemon.Network -dbus-send --type=method_call --print-reply --dest=com.deepin.daemon.Network /com/deepin/daemon/Network org.freedesktop.DBus.Introspectable.Introspect | sed 1d | sed -e '1s/^ string "//' | sed '$s/"$//' > "${output_dir}"/dbus_dde_daemon_network.xml +# org.deepin.dde.Network1 +dbus-send --type=method_call --print-reply --dest=org.deepin.dde.Network1 /org/deepin/dde/Network1 org.freedesktop.DBus.Introspectable.Introspect | sed 1d | sed -e '1s/^ string "//' | sed '$s/"$//' > "${output_dir}"/dbus_dde_daemon_network.xml python3 -m dbus2any -t pydbusclient.tpl -x "${output_dir}"/dbus_dde_daemon_network.xml > "${output_dir}"/com_deepin_daemon_Network.py if [ $? -ne 0 ]; then @@ -16,9 +16,9 @@ if [ $? -ne 0 ]; then fi # com.deepin.daemon.ConnectionSession -session_path=$(dbus-send --type=method_call --print-reply --dest=com.deepin.daemon.Network /com/deepin/daemon/Network com.deepin.daemon.Network.CreateConnection string:"vpn-openvpn" objpath:"/" | sed 1d | sed -e 's/ object path "//' | sed -e 's/"$//') -dbus-send --type=method_call --print-reply --dest=com.deepin.daemon.Network ${session_path} org.freedesktop.DBus.Introspectable.Introspect | sed 1d | sed -e '1s/^ string "//' | sed '$s/"$//' > "${output_dir}"/dbus_dde_daemon_network_connectionsession.xml +session_path=$(dbus-send --type=method_call --print-reply --dest=org.deepin.dde.Network1 /org/deepin/dde/Network1 org.deepin.dde.Network1.CreateConnection string:"vpn-openvpn" objpath:"/" | sed 1d | sed -e 's/ object path "//' | sed -e 's/"$//') +dbus-send --type=method_call --print-reply --dest=org.deepin.dde.Network1 ${session_path} org.freedesktop.DBus.Introspectable.Introspect | sed 1d | sed -e '1s/^ string "//' | sed '$s/"$//' > "${output_dir}"/dbus_dde_daemon_network_connectionsession.xml python3 -m dbus2any -t pydbusclient.tpl -x "${output_dir}"/dbus_dde_daemon_network_connectionsession.xml > "${output_dir}"/com_deepin_daemon_Network_ConnectionSession.py -dbus-send --type=method_call --print-reply --dest=com.deepin.daemon.Network ${session_path} com.deepin.daemon.ConnectionSession.Close +dbus-send --type=method_call --print-reply --dest=org.deepin.dde.Network1 ${session_path} com.deepin.daemon.ConnectionSession.Close echo 'Done' diff --git a/network/examples/python/main.py b/network1/examples/python/main.py similarity index 85% rename from network/examples/python/main.py rename to network1/examples/python/main.py index b4914103c..7e0e71e9b 100755 --- a/network/examples/python/main.py +++ b/network1/examples/python/main.py @@ -10,7 +10,7 @@ from dbus_gen.com_deepin_daemon_Network import Network from dbus_gen.com_deepin_daemon_Network_ConnectionSession import ConnectionSession -dbus_network = Network('com.deepin.daemon.Network', '/com/deepin/daemon/Network') +dbus_network = Network('org.deepin.dde.Network1', '/org/deepin/dde/Network1') wifi_ssid = "test" wifi_psk = "12345678" @@ -19,7 +19,7 @@ dbus_network.EnableDevice(utils_dbus.get_default_wireless_device(), True) session_path = utils_dbus.create_connection('wireless', utils_dbus.get_default_wireless_device()) -dbus_session = ConnectionSession('com.deepin.daemon.Network', session_path) +dbus_session = ConnectionSession('org.deepin.dde.Network1', session_path) uuid = dbus_session.Uuid dbus_session.SetKey('802-11-wireless', 'ssid', json.dump(wifi_ssid)) dbus_session.SetKey('802-11-wireless-security', 'vk-key-mgmt', json.dumps("wpa-psk")) diff --git a/network/examples/python/utils_dbus.py b/network1/examples/python/utils_dbus.py similarity index 96% rename from network/examples/python/utils_dbus.py rename to network1/examples/python/utils_dbus.py index 109367d28..81274f930 100644 --- a/network/examples/python/utils_dbus.py +++ b/network1/examples/python/utils_dbus.py @@ -8,7 +8,7 @@ from dbus_gen.com_deepin_daemon_Network import Network from dbus_gen.com_deepin_daemon_Network_ConnectionSession import ConnectionSession -dbus_network = Network('com.deepin.daemon.Network', '/com/deepin/daemon/Network') +dbus_network = Network('org.deepin.dde.Network1', '/org/deepin/dde/Network1') def get_network_devices(): return json.loads(dbus_network.Devices) diff --git a/network/examples/set_wired_static_ip.sh b/network1/examples/set_wired_static_ip.sh similarity index 93% rename from network/examples/set_wired_static_ip.sh rename to network1/examples/set_wired_static_ip.sh index dab57c7d7..d0cea06d1 100755 --- a/network/examples/set_wired_static_ip.sh +++ b/network1/examples/set_wired_static_ip.sh @@ -3,8 +3,8 @@ # 设置第一块有线网卡的IP地址为10.1.11.231、掩码为255.255.255.0、网关为 # 10.1.11.1、域名服务器为8.8.8.8 -dbus_name="com.deepin.daemon.Network" -dbus_path="/com/deepin/daemon/Network" +dbus_name="org.deepin.dde.Network1" +dbus_path="/org/deepin/dde/Network1" dev_name="/org/freedesktop/NetworkManager/Devices/0" ip_addr='"10.1.11.231"' diff --git a/network/exported_methods_auto.go b/network1/exported_methods_auto.go similarity index 100% rename from network/exported_methods_auto.go rename to network1/exported_methods_auto.go diff --git a/network/manager.go b/network1/manager.go similarity index 93% rename from network/manager.go rename to network1/manager.go index ce0878fe5..431ba8180 100644 --- a/network/manager.go +++ b/network1/manager.go @@ -11,19 +11,19 @@ import ( "sync" "time" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/common/dsync" - "github.com/linuxdeepin/dde-daemon/network/nm" - "github.com/linuxdeepin/dde-daemon/network/proxychains" + "github.com/linuxdeepin/dde-daemon/network1/nm" + "github.com/linuxdeepin/dde-daemon/network1/proxychains" "github.com/linuxdeepin/dde-daemon/session/common" - airplanemode "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.airplanemode" - sessionmanager "github.com/linuxdeepin/go-dbus-factory/com.deepin.sessionmanager" - ipwatchd "github.com/linuxdeepin/go-dbus-factory/com.deepin.system.ipwatchd" - sysNetwork "github.com/linuxdeepin/go-dbus-factory/com.deepin.system.network" configManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" - nmdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.networkmanager" - secrets "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.secrets" + sessionmanager "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.sessionmanager1" + secrets "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.secrets" + airplanemode "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.airplanemode1" + ipwatchd "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.ipwatchd1" + sysNetwork "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.network1" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" + nmdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.networkmanager" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/proxy" "github.com/linuxdeepin/go-lib/keyfile" @@ -32,9 +32,9 @@ import ( ) const ( - dbusServiceName = "com.deepin.daemon.Network" - dbusPath = "/com/deepin/daemon/Network" - dbusInterface = "com.deepin.daemon.Network" + dbusServiceName = "org.deepin.dde.Network1" + dbusPath = "/org/deepin/dde/Network1" + dbusInterface = dbusServiceName ) const ( @@ -44,11 +44,11 @@ const ( dsettingsResetWifiOSDEnableTimeout = "resetWifiOSDEnableTimeout" dsettingsDisableFailureNotify = "disableFailureNotify" - networkCoreDsgConfigPath = "/usr/share/dsg/configs/org.deepin.dde.network/org.deepin.dde.network.json" - networkCoreConfigPath = "org.deepin.dde.network" - ddeNetworkCoreConfigPath = networkCoreConfigPath - dsettingsLoadServiceFromNM = "LoadServiceFromNM" - dsettingsEnableConnectivity= "enableConnectivity" + networkCoreDsgConfigPath = "/usr/share/dsg/configs/org.deepin.dde.network/org.deepin.dde.network.json" + networkCoreConfigPath = "org.deepin.dde.network" + ddeNetworkCoreConfigPath = networkCoreConfigPath + dsettingsLoadServiceFromNM = "LoadServiceFromNM" + dsettingsEnableConnectivity = "enableConnectivity" ) const checkRepeatTime = 1 * time.Second @@ -136,7 +136,7 @@ type Manager struct { delayShowWifiOSD *time.Timer // dsg config : org.deepin.dde.network : LoadServiceFromNM - loadServiceFromNM bool + loadServiceFromNM bool enableLocalConnectivity bool //nolint @@ -235,7 +235,7 @@ func (m *Manager) init() { // register secret agent nmAgentManager := nmdbus.NewAgentManager(systemBus) - err = nmAgentManager.Register(0, "com.deepin.daemon.network.SecretAgent") + err = nmAgentManager.Register(0, "org.deepin.dde.Network1.SecretAgent") if err != nil { logger.Debug("failed to register secret agent:", err) } else { @@ -487,13 +487,13 @@ func (m *Manager) loadEnableConnectivity(ds configManager.ConfigManager) { networkCoreConfigManagerPath, err := ds.AcquireManager(0, networkCoreConfigPath, ddeNetworkCoreConfigPath, "") if err != nil { logger.Warning(err) - return; + return } networkCoreConfigManager, err := configManager.NewManager(m.sysSigLoop.Conn(), networkCoreConfigManagerPath) if err != nil { logger.Warning(err) - return; + return } getDEnableLocalConnectivity := func() bool { @@ -510,10 +510,10 @@ func (m *Manager) loadEnableConnectivity(ds configManager.ConfigManager) { networkCoreConfigManager.InitSignalExt(m.sysSigLoop, true) _, err = networkCoreConfigManager.ConnectValueChanged(func(key string) { if key == dsettingsEnableConnectivity { - m.enableLocalConnectivity = getDEnableLocalConnectivity() - logger.Info("DConfig data changed of enableConnectivity : ", m.enableLocalConnectivity) - } - }) + m.enableLocalConnectivity = getDEnableLocalConnectivity() + logger.Info("DConfig data changed of enableConnectivity : ", m.enableLocalConnectivity) + } + }) if err != nil { logger.Warning(err) diff --git a/network/manager_accesspoint.go b/network1/manager_accesspoint.go similarity index 98% rename from network/manager_accesspoint.go rename to network1/manager_accesspoint.go index 249c278fa..c207c8ecd 100644 --- a/network/manager_accesspoint.go +++ b/network1/manager_accesspoint.go @@ -9,9 +9,9 @@ import ( "fmt" "time" - dbus "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/network/nm" - nmdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.networkmanager" + dbus "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/network1/nm" + nmdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.networkmanager" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/utils" ) @@ -28,7 +28,7 @@ const ( const scanWifiDelayTime = 10 * time.Second const channelAutoChangeThreshold = 65 -//frequency range +// frequency range const ( frequency5GUpperlimit = 5825 frequency5GLowerlimit = 4915 @@ -540,7 +540,7 @@ func (m *Manager) activateAccessPoint(uuid string, apPath, devPath dbus.ObjectPa // need to set macAddress var hwAddr string hwAddr, err = nmGeneralGetDeviceHwAddr(devPath, true) - if (err != nil) { + if err != nil { logger.Warning("failed to get mac", err) } data := newWirelessConnectionData(decodeSsid(ssid), uuid, ssid, keymgmt, hwAddr) diff --git a/network/manager_active_conn.go b/network1/manager_active_conn.go similarity index 98% rename from network/manager_active_conn.go rename to network1/manager_active_conn.go index 0f95a5c75..132158941 100644 --- a/network/manager_active_conn.go +++ b/network1/manager_active_conn.go @@ -8,8 +8,8 @@ import ( "strconv" "strings" - dbus "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/network/nm" + dbus "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/network1/nm" "github.com/linuxdeepin/go-lib/dbusutil" . "github.com/linuxdeepin/go-lib/gettext" ) @@ -99,7 +99,7 @@ type hotspotConnectionInfo struct { } func (i ipv4Info) toDeprecatedStruct() ip4ConnectionInfoDeprecated { - ip4ConnectionInfoDeprecatedInfo := ip4ConnectionInfoDeprecated { + ip4ConnectionInfoDeprecatedInfo := ip4ConnectionInfoDeprecated{ Gateways: []string{i.Gateway}, Dnses: i.Nameservers, } @@ -111,7 +111,7 @@ func (i ipv4Info) toDeprecatedStruct() ip4ConnectionInfoDeprecated { } func (i ipv6Info) toDeprecatedStruct() ip6ConnectionInfoDeprecated { - ip6ConnectionInfoDeprecatedInfo := ip6ConnectionInfoDeprecated { + ip6ConnectionInfoDeprecatedInfo := ip6ConnectionInfoDeprecated{ Gateways: []string{i.Gateway}, Dnses: i.Nameservers, } diff --git a/network/manager_connection.go b/network1/manager_connection.go similarity index 99% rename from network/manager_connection.go rename to network1/manager_connection.go index 341f121ee..cc6016d48 100644 --- a/network/manager_connection.go +++ b/network1/manager_connection.go @@ -10,11 +10,11 @@ import ( "strconv" "strings" - dbus "github.com/godbus/dbus" - nmdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.networkmanager" + dbus "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/network1/nm" + nmdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.networkmanager" "github.com/linuxdeepin/go-lib/dbusutil" . "github.com/linuxdeepin/go-lib/gettext" - "github.com/linuxdeepin/dde-daemon/network/nm" ) type connectionSlice []*connection diff --git a/network/manager_dbusutil.go b/network1/manager_dbusutil.go similarity index 100% rename from network/manager_dbusutil.go rename to network1/manager_dbusutil.go diff --git a/network/manager_device.go b/network1/manager_device.go similarity index 95% rename from network/manager_device.go rename to network1/manager_device.go index 9d10ea1ec..144f8bd1f 100644 --- a/network/manager_device.go +++ b/network1/manager_device.go @@ -10,10 +10,10 @@ import ( "strings" "time" - dbus "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/network/nm" - mmdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.modemmanager1" - nmdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.networkmanager" + dbus "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/network1/nm" + mmdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.modemmanager1" + nmdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.networkmanager" "github.com/linuxdeepin/go-lib/dbusutil" ) @@ -189,31 +189,6 @@ func (m *Manager) newDevice(devPath dbus.ObjectPath) (dev *device, err error) { if err != nil { logger.Warningf("connect to ActivateConnection failed, err: %v", err) } - - if nmHasSystemSettingsModifyPermission() { - carrierChanged := func(hasValue, value bool) { - if !hasValue || !value { - return - } - - logger.Info("wired plugin", dev.Path) - logger.Debug("ensure wired connection exists", dev.Path) - _, _, err = m.ensureWiredConnectionExists(dev.Path, true) - if err != nil { - logger.Warning(err) - } - } - - err = nmDev.Wired().Carrier().ConnectChanged(carrierChanged) - if err != nil { - logger.Warning("failed to monitor Wired-Carrier's change:", err) - } - - carrier, _ := nmDev.Wired().Carrier().Get(0) - carrierChanged(true, carrier) - } else { - logger.Debug("do not have modify permission") - } case nm.NM_DEVICE_TYPE_WIFI: nmDevWireless := nmDev.Wireless() dev.ClonedAddress, _ = nmDevWireless.HwAddress().Get(0) diff --git a/network/manager_ip_conflict.go b/network1/manager_ip_conflict.go similarity index 80% rename from network/manager_ip_conflict.go rename to network1/manager_ip_conflict.go index 5dee68d3e..ecf736790 100644 --- a/network/manager_ip_conflict.go +++ b/network1/manager_ip_conflict.go @@ -8,9 +8,9 @@ import ( "context" "time" - dbus "github.com/godbus/dbus" - ipwatchd "github.com/linuxdeepin/go-dbus-factory/com.deepin.system.ipwatchd" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" + dbus "github.com/godbus/dbus/v5" + ipwatchd "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.ipwatchd1" + ofdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.dbus" "github.com/linuxdeepin/go-lib/dbusutil" ) @@ -64,7 +64,7 @@ func (m *Manager) RequestIPConflictCheck(ip, ifc string) *dbus.Error { defer cancel() var mac string - err = conn.Object("com.deepin.system.IPWatchD", "/com/deepin/system/IPWatchD").CallWithContext(ctx, "com.deepin.system.IPWatchD.RequestIPConflictCheck", 0, ip, ifc).Store(&mac) + err = conn.Object("com.deepin.dde.IPWatchD1", "org/deepin/dde/IPWatchD1").CallWithContext(ctx, "org.deepin.dde.IPWatchD1.RequestIPConflictCheck", 0, ip, ifc).Store(&mac) if err != nil { logger.Warning(err) } diff --git a/network/manager_proxy.go b/network1/manager_proxy.go similarity index 99% rename from network/manager_proxy.go rename to network1/manager_proxy.go index 68ca2728a..85ea55492 100644 --- a/network/manager_proxy.go +++ b/network1/manager_proxy.go @@ -9,7 +9,7 @@ import ( "strconv" "strings" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil" "golang.org/x/xerrors" diff --git a/network/manager_stub.go b/network1/manager_stub.go similarity index 96% rename from network/manager_stub.go rename to network1/manager_stub.go index cb6e3f174..33c83a40a 100644 --- a/network/manager_stub.go +++ b/network1/manager_stub.go @@ -7,8 +7,8 @@ package network import ( "errors" - dbus "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/network/nm" + dbus "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/network1/nm" "github.com/linuxdeepin/go-lib/dbusutil" ) diff --git a/network/module.go b/network1/module.go similarity index 98% rename from network/module.go rename to network1/module.go index 82c45c61e..e78044994 100644 --- a/network/module.go +++ b/network1/module.go @@ -7,10 +7,10 @@ package network import ( "time" + "github.com/linuxdeepin/dde-daemon/loader" + "github.com/linuxdeepin/dde-daemon/network1/proxychains" "github.com/linuxdeepin/go-lib/log" libnotify "github.com/linuxdeepin/go-lib/notify" - "github.com/linuxdeepin/dde-daemon/loader" - "github.com/linuxdeepin/dde-daemon/network/proxychains" ) var ( diff --git a/network/nm/README.md b/network1/nm/README.md similarity index 100% rename from network/nm/README.md rename to network1/nm/README.md diff --git a/network/nm/nm_consts_gen.go b/network1/nm/nm_consts_gen.go similarity index 100% rename from network/nm/nm_consts_gen.go rename to network1/nm/nm_consts_gen.go diff --git a/network/nm/nm_extends_consts.go b/network1/nm/nm_extends_consts.go similarity index 100% rename from network/nm/nm_extends_consts.go rename to network1/nm/nm_extends_consts.go diff --git a/network/nm_custom_type.go b/network1/nm_custom_type.go similarity index 98% rename from network/nm_custom_type.go rename to network1/nm_custom_type.go index dde1666ab..9b9f10e5f 100644 --- a/network/nm_custom_type.go +++ b/network1/nm_custom_type.go @@ -5,8 +5,8 @@ package network import ( + "github.com/linuxdeepin/dde-daemon/network1/nm" _ "github.com/linuxdeepin/go-lib/gettext" - "github.com/linuxdeepin/dde-daemon/network/nm" ) // Custom device types, use string instead of number, used by front-end diff --git a/network/nm_generator/Makefile b/network1/nm_generator/Makefile similarity index 100% rename from network/nm_generator/Makefile rename to network1/nm_generator/Makefile diff --git a/network/nm_generator/README.md b/network1/nm_generator/README.md similarity index 100% rename from network/nm_generator/README.md rename to network1/nm_generator/README.md diff --git a/network/nm_generator/gen_nm_consts.py b/network1/nm_generator/gen_nm_consts.py similarity index 100% rename from network/nm_generator/gen_nm_consts.py rename to network1/nm_generator/gen_nm_consts.py diff --git a/network/nm_generator/main.go b/network1/nm_generator/main.go similarity index 100% rename from network/nm_generator/main.go rename to network1/nm_generator/main.go diff --git a/network/nm_generator/nm_consts_gen.yml b/network1/nm_generator/nm_consts_gen.yml similarity index 100% rename from network/nm_generator/nm_consts_gen.yml rename to network1/nm_generator/nm_consts_gen.yml diff --git a/network/nm_generator/nm_consts_keys_override.yml b/network1/nm_generator/nm_consts_keys_override.yml similarity index 100% rename from network/nm_generator/nm_consts_keys_override.yml rename to network1/nm_generator/nm_consts_keys_override.yml diff --git a/network/nm_generator/nm_docs/NetworkManager.conf.html b/network1/nm_generator/nm_docs/NetworkManager.conf.html similarity index 100% rename from network/nm_generator/nm_docs/NetworkManager.conf.html rename to network1/nm_generator/nm_docs/NetworkManager.conf.html diff --git a/network/nm_generator/nm_docs/NetworkManager.devhelp2 b/network1/nm_generator/nm_docs/NetworkManager.devhelp2 similarity index 100% rename from network/nm_generator/nm_docs/NetworkManager.devhelp2 rename to network1/nm_generator/nm_docs/NetworkManager.devhelp2 diff --git a/network/nm_generator/nm_docs/NetworkManager.html b/network1/nm_generator/nm_docs/NetworkManager.html similarity index 100% rename from network/nm_generator/nm_docs/NetworkManager.html rename to network1/nm_generator/nm_docs/NetworkManager.html diff --git a/network/nm_generator/nm_docs/dbus-types.html b/network1/nm_generator/nm_docs/dbus-types.html similarity index 100% rename from network/nm_generator/nm_docs/dbus-types.html rename to network1/nm_generator/nm_docs/dbus-types.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.AccessPoint.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.AccessPoint.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.AccessPoint.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.AccessPoint.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.AgentManager.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.AgentManager.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.AgentManager.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.AgentManager.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Connection.Active.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Connection.Active.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Connection.Active.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Connection.Active.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.DHCP4Config.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.DHCP4Config.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.DHCP4Config.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.DHCP4Config.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.DHCP6Config.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.DHCP6Config.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.DHCP6Config.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.DHCP6Config.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Adsl.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Adsl.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Adsl.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Adsl.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Bluetooth.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Bluetooth.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Bluetooth.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Bluetooth.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Bond.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Bond.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Bond.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Bond.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Bridge.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Bridge.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Bridge.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Bridge.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Generic.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Generic.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Generic.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Generic.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.IPTunnel.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.IPTunnel.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.IPTunnel.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.IPTunnel.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Infiniband.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Infiniband.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Infiniband.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Infiniband.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Macvlan.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Macvlan.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Macvlan.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Macvlan.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Modem.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Modem.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Modem.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Modem.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.OlpcMesh.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.OlpcMesh.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.OlpcMesh.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.OlpcMesh.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Statistics.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Statistics.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Statistics.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Statistics.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Team.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Team.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Team.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Team.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Tun.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Tun.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Tun.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Tun.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Veth.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Veth.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Veth.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Veth.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Vlan.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Vlan.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Vlan.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Vlan.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Vxlan.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Vxlan.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Vxlan.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Vxlan.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.WiMax.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.WiMax.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.WiMax.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.WiMax.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Wired.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Wired.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Wired.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Wired.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Wireless.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Wireless.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Wireless.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.Wireless.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Device.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.IP4Config.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.IP4Config.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.IP4Config.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.IP4Config.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.IP6Config.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.IP6Config.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.IP6Config.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.IP6Config.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.PPP.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.PPP.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.PPP.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.PPP.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.SecretAgent.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.SecretAgent.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.SecretAgent.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.SecretAgent.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Settings.Connection.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Settings.Connection.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Settings.Connection.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Settings.Connection.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Settings.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Settings.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Settings.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.Settings.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.VPN.Connection.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.VPN.Connection.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.VPN.Connection.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.VPN.Connection.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.VPN.Plugin.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.VPN.Plugin.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.VPN.Plugin.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.VPN.Plugin.html diff --git a/network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.html b/network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.html similarity index 100% rename from network/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.html rename to network1/nm_generator/nm_docs/gdbus-org.freedesktop.NetworkManager.html diff --git a/network/nm_generator/nm_docs/home.png b/network1/nm_generator/nm_docs/home.png similarity index 100% rename from network/nm_generator/nm_docs/home.png rename to network1/nm_generator/nm_docs/home.png diff --git a/network/nm_generator/nm_docs/index.html b/network1/nm_generator/nm_docs/index.html similarity index 100% rename from network/nm_generator/nm_docs/index.html rename to network1/nm_generator/nm_docs/index.html diff --git a/network/nm_generator/nm_docs/ix01.html b/network1/nm_generator/nm_docs/ix01.html similarity index 100% rename from network/nm_generator/nm_docs/ix01.html rename to network1/nm_generator/nm_docs/ix01.html diff --git a/network/nm_generator/nm_docs/left-insensitive.png b/network1/nm_generator/nm_docs/left-insensitive.png similarity index 100% rename from network/nm_generator/nm_docs/left-insensitive.png rename to network1/nm_generator/nm_docs/left-insensitive.png diff --git a/network/nm_generator/nm_docs/left.png b/network1/nm_generator/nm_docs/left.png similarity index 100% rename from network/nm_generator/nm_docs/left.png rename to network1/nm_generator/nm_docs/left.png diff --git a/network/nm_generator/nm_docs/license.html b/network1/nm_generator/nm_docs/license.html similarity index 100% rename from network/nm_generator/nm_docs/license.html rename to network1/nm_generator/nm_docs/license.html diff --git a/network/nm_generator/nm_docs/manpages.html b/network1/nm_generator/nm_docs/manpages.html similarity index 100% rename from network/nm_generator/nm_docs/manpages.html rename to network1/nm_generator/nm_docs/manpages.html diff --git a/network/nm_generator/nm_docs/nm-dbus-types.html b/network1/nm_generator/nm_docs/nm-dbus-types.html similarity index 100% rename from network/nm_generator/nm_docs/nm-dbus-types.html rename to network1/nm_generator/nm_docs/nm-dbus-types.html diff --git a/network/nm_generator/nm_docs/nm-online.html b/network1/nm_generator/nm_docs/nm-online.html similarity index 100% rename from network/nm_generator/nm_docs/nm-online.html rename to network1/nm_generator/nm_docs/nm-online.html diff --git a/network/nm_generator/nm_docs/nm-settings-keyfile.html b/network1/nm_generator/nm_docs/nm-settings-keyfile.html similarity index 100% rename from network/nm_generator/nm_docs/nm-settings-keyfile.html rename to network1/nm_generator/nm_docs/nm-settings-keyfile.html diff --git a/network/nm_generator/nm_docs/nm-settings.html b/network1/nm_generator/nm_docs/nm-settings.html similarity index 100% rename from network/nm_generator/nm_docs/nm-settings.html rename to network1/nm_generator/nm_docs/nm-settings.html diff --git a/network/nm_generator/nm_docs/nm-vpn-dbus-types.html b/network1/nm_generator/nm_docs/nm-vpn-dbus-types.html similarity index 100% rename from network/nm_generator/nm_docs/nm-vpn-dbus-types.html rename to network1/nm_generator/nm_docs/nm-vpn-dbus-types.html diff --git a/network/nm_generator/nm_docs/nmcli-examples.html b/network1/nm_generator/nm_docs/nmcli-examples.html similarity index 100% rename from network/nm_generator/nm_docs/nmcli-examples.html rename to network1/nm_generator/nm_docs/nmcli-examples.html diff --git a/network/nm_generator/nm_docs/nmcli.html b/network1/nm_generator/nm_docs/nmcli.html similarity index 100% rename from network/nm_generator/nm_docs/nmcli.html rename to network1/nm_generator/nm_docs/nmcli.html diff --git a/network/nm_generator/nm_docs/nmtui.html b/network1/nm_generator/nm_docs/nmtui.html similarity index 100% rename from network/nm_generator/nm_docs/nmtui.html rename to network1/nm_generator/nm_docs/nmtui.html diff --git a/network/nm_generator/nm_docs/ref-settings.html b/network1/nm_generator/nm_docs/ref-settings.html similarity index 100% rename from network/nm_generator/nm_docs/ref-settings.html rename to network1/nm_generator/nm_docs/ref-settings.html diff --git a/network/nm_generator/nm_docs/right-insensitive.png b/network1/nm_generator/nm_docs/right-insensitive.png similarity index 100% rename from network/nm_generator/nm_docs/right-insensitive.png rename to network1/nm_generator/nm_docs/right-insensitive.png diff --git a/network/nm_generator/nm_docs/right.png b/network1/nm_generator/nm_docs/right.png similarity index 100% rename from network/nm_generator/nm_docs/right.png rename to network1/nm_generator/nm_docs/right.png diff --git a/network/nm_generator/nm_docs/secrets-flags.html b/network1/nm_generator/nm_docs/secrets-flags.html similarity index 100% rename from network/nm_generator/nm_docs/secrets-flags.html rename to network1/nm_generator/nm_docs/secrets-flags.html diff --git a/network/nm_generator/nm_docs/spec.html b/network1/nm_generator/nm_docs/spec.html similarity index 100% rename from network/nm_generator/nm_docs/spec.html rename to network1/nm_generator/nm_docs/spec.html diff --git a/network/nm_generator/nm_docs/style.css b/network1/nm_generator/nm_docs/style.css similarity index 100% rename from network/nm_generator/nm_docs/style.css rename to network1/nm_generator/nm_docs/style.css diff --git a/network/nm_generator/nm_docs/up-insensitive.png b/network1/nm_generator/nm_docs/up-insensitive.png similarity index 100% rename from network/nm_generator/nm_docs/up-insensitive.png rename to network1/nm_generator/nm_docs/up-insensitive.png diff --git a/network/nm_generator/nm_docs/up.png b/network1/nm_generator/nm_docs/up.png similarity index 100% rename from network/nm_generator/nm_docs/up.png rename to network1/nm_generator/nm_docs/up.png diff --git a/network/nm_generator/nm_girs/NM-1.0_1.10.0.gir b/network1/nm_generator/nm_girs/NM-1.0_1.10.0.gir similarity index 100% rename from network/nm_generator/nm_girs/NM-1.0_1.10.0.gir rename to network1/nm_generator/nm_girs/NM-1.0_1.10.0.gir diff --git a/network/nm_generator/nm_girs/NM-1.0_1.2.4.gir b/network1/nm_generator/nm_girs/NM-1.0_1.2.4.gir similarity index 100% rename from network/nm_generator/nm_girs/NM-1.0_1.2.4.gir rename to network1/nm_generator/nm_girs/NM-1.0_1.2.4.gir diff --git a/network/nm_generator/nm_girs/NM-1.0_1.4.2.gir b/network1/nm_generator/nm_girs/NM-1.0_1.4.2.gir similarity index 100% rename from network/nm_generator/nm_girs/NM-1.0_1.4.2.gir rename to network1/nm_generator/nm_girs/NM-1.0_1.4.2.gir diff --git a/network/nm_generator/nm_girs/NM-1.0_1.6.0.gir b/network1/nm_generator/nm_girs/NM-1.0_1.6.0.gir similarity index 100% rename from network/nm_generator/nm_girs/NM-1.0_1.6.0.gir rename to network1/nm_generator/nm_girs/NM-1.0_1.6.0.gir diff --git a/network/nm_generator/nm_girs/NM-1.0_1.8.2.gir b/network1/nm_generator/nm_girs/NM-1.0_1.8.2.gir similarity index 100% rename from network/nm_generator/nm_girs/NM-1.0_1.8.2.gir rename to network1/nm_generator/nm_girs/NM-1.0_1.8.2.gir diff --git a/network/nm_generator/nm_logicset_keys.yml b/network1/nm_generator/nm_logicset_keys.yml similarity index 100% rename from network/nm_generator/nm_logicset_keys.yml rename to network1/nm_generator/nm_logicset_keys.yml diff --git a/network/nm_generator/nm_virtual_sections.yml b/network1/nm_generator/nm_virtual_sections.yml similarity index 100% rename from network/nm_generator/nm_virtual_sections.yml rename to network1/nm_generator/nm_virtual_sections.yml diff --git a/network/nm_generator/nm_vpn_alias_settings.yml b/network1/nm_generator/nm_vpn_alias_settings.yml similarity index 100% rename from network/nm_generator/nm_vpn_alias_settings.yml rename to network1/nm_generator/nm_vpn_alias_settings.yml diff --git a/network/nm_generator/tpl.go b/network1/nm_generator/tpl.go similarity index 100% rename from network/nm_generator/tpl.go rename to network1/nm_generator/tpl.go diff --git a/network/nm_generator/utils.go b/network1/nm_generator/utils.go similarity index 100% rename from network/nm_generator/utils.go rename to network1/nm_generator/utils.go diff --git a/network/nm_key_converter.go b/network1/nm_key_converter.go similarity index 98% rename from network/nm_key_converter.go rename to network1/nm_key_converter.go index 89d303286..7495cec00 100644 --- a/network/nm_key_converter.go +++ b/network1/nm_key_converter.go @@ -18,7 +18,7 @@ func interfaceToString(v interface{}) (d string) { return } -//nolint +// nolint func interfaceToByte(v interface{}) (d byte) { if isInterfaceNil(v) { return @@ -55,7 +55,7 @@ func interfaceToUint32(v interface{}) (d uint32) { return } -//nolint +// nolint func interfaceToInt64(v interface{}) (d int64) { if isInterfaceNil(v) { return @@ -68,7 +68,7 @@ func interfaceToInt64(v interface{}) (d int64) { return } -//nolint +// nolint func interfaceToUint64(v interface{}) (d uint64) { if isInterfaceNil(v) { return @@ -117,7 +117,7 @@ func interfaceToArrayString(v interface{}) (d []string) { return } -//nolint +// nolint func interfaceToArrayUint32(v interface{}) (d []uint32) { if isInterfaceNil(v) { return @@ -130,7 +130,7 @@ func interfaceToArrayUint32(v interface{}) (d []uint32) { return } -//nolint +// nolint func interfaceToArrayArrayByte(v interface{}) (d [][]byte) { if isInterfaceNil(v) { return @@ -143,7 +143,7 @@ func interfaceToArrayArrayByte(v interface{}) (d [][]byte) { return } -//nolint +// nolint func interfaceToArrayArrayUint32(v interface{}) (d [][]uint32) { if isInterfaceNil(v) { return diff --git a/network/nm_key_converter_test.go b/network1/nm_key_converter_test.go similarity index 99% rename from network/nm_key_converter_test.go rename to network1/nm_key_converter_test.go index 20fa17c03..5a8d05517 100644 --- a/network/nm_key_converter_test.go +++ b/network1/nm_key_converter_test.go @@ -135,4 +135,4 @@ func (*testWrapper) TestInterfaceToArrayUint32(c *C.C) { for _, d := range data { c.Check(interfaceToArrayUint32(d.test), C.DeepEquals, d.result) } -} \ No newline at end of file +} diff --git a/network/nm_key_edit.go b/network1/nm_key_edit.go similarity index 98% rename from network/nm_key_edit.go rename to network1/nm_key_edit.go index 8c9dd04ef..1e7fdd4e4 100644 --- a/network/nm_key_edit.go +++ b/network1/nm_key_edit.go @@ -5,7 +5,7 @@ package network import ( - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" ) func getSettingKey(data connectionData, section, key string) (value interface{}) { diff --git a/network/nm_key_type.go b/network1/nm_key_type.go similarity index 100% rename from network/nm_key_type.go rename to network1/nm_key_type.go diff --git a/network/nm_setting_802_1x.go b/network1/nm_setting_802_1x.go similarity index 98% rename from network/nm_setting_802_1x.go rename to network1/nm_setting_802_1x.go index 758c49cfa..bce5f5cdf 100644 --- a/network/nm_setting_802_1x.go +++ b/network1/nm_setting_802_1x.go @@ -7,7 +7,7 @@ package network import ( "fmt" - "github.com/linuxdeepin/dde-daemon/network/nm" + "github.com/linuxdeepin/dde-daemon/network1/nm" ) // Logic setter diff --git a/network/nm_setting_beans_gen.go b/network1/nm_setting_beans_gen.go similarity index 99% rename from network/nm_setting_beans_gen.go rename to network1/nm_setting_beans_gen.go index ff34d6f1a..466ffdb77 100644 --- a/network/nm_setting_beans_gen.go +++ b/network1/nm_setting_beans_gen.go @@ -1,5 +1,5 @@ // Generated by nm-generator -//nolint +// nolint package network // General get setting key default value diff --git a/network/nm_setting_ip4_config.go b/network1/nm_setting_ip4_config.go similarity index 88% rename from network/nm_setting_ip4_config.go rename to network1/nm_setting_ip4_config.go index a88819504..c1afab54c 100644 --- a/network/nm_setting_ip4_config.go +++ b/network1/nm_setting_ip4_config.go @@ -5,7 +5,7 @@ package network import ( - "github.com/linuxdeepin/dde-daemon/network/nm" + "github.com/linuxdeepin/dde-daemon/network1/nm" ) func initSettingSectionIpv4(data connectionData) { diff --git a/network/nm_setting_ip6_config.go b/network1/nm_setting_ip6_config.go similarity index 87% rename from network/nm_setting_ip6_config.go rename to network1/nm_setting_ip6_config.go index 9787bfa1d..149ec4548 100644 --- a/network/nm_setting_ip6_config.go +++ b/network1/nm_setting_ip6_config.go @@ -5,7 +5,7 @@ package network import ( - "github.com/linuxdeepin/dde-daemon/network/nm" + "github.com/linuxdeepin/dde-daemon/network1/nm" ) func initSettingSectionIpv6(data connectionData) { diff --git a/network/nm_setting_vpn.go b/network1/nm_setting_vpn.go similarity index 100% rename from network/nm_setting_vpn.go rename to network1/nm_setting_vpn.go diff --git a/network/nm_setting_wired.go b/network1/nm_setting_wired.go similarity index 94% rename from network/nm_setting_wired.go rename to network1/nm_setting_wired.go index 70c77ecfe..8b59d9d61 100644 --- a/network/nm_setting_wired.go +++ b/network1/nm_setting_wired.go @@ -5,8 +5,8 @@ package network import ( - dbus "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/network/nm" + dbus "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/network1/nm" ) func newWiredConnectionForDevice(id, uuid string, devPath dbus.ObjectPath, active bool) (cpath dbus.ObjectPath, err error) { @@ -56,6 +56,6 @@ func initSettingSectionWired(data connectionData, devPath dbus.ObjectPath) { // need to set macAddress hwAddr, err := nmGeneralGetDeviceHwAddr(devPath, true) if err == nil { - setSettingWiredMacAddress(data, convertMacAddressToArrayByte(hwAddr)); + setSettingWiredMacAddress(data, convertMacAddressToArrayByte(hwAddr)) } } diff --git a/network/nm_setting_wireless.go b/network1/nm_setting_wireless.go similarity index 96% rename from network/nm_setting_wireless.go rename to network1/nm_setting_wireless.go index 6ea64453a..5aee0f8c2 100644 --- a/network/nm_setting_wireless.go +++ b/network1/nm_setting_wireless.go @@ -7,8 +7,8 @@ package network import ( "os" - dbus "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/network/nm" + dbus "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/network1/nm" ) func newWirelessHotspotConnectionForDevice(id, uuid string, devPath dbus.ObjectPath, active bool) (cpath dbus.ObjectPath, err error) { @@ -50,7 +50,7 @@ func newWirelessConnectionData(id, uuid string, ssid []byte, keymgmt, macAddress } if macAddress != "" { - setSettingWirelessMacAddress(data, convertMacAddressToArrayByte(macAddress)); + setSettingWirelessMacAddress(data, convertMacAddressToArrayByte(macAddress)) } initSettingSectionIpv4(data) diff --git a/network/nm_setting_wireless_security.go b/network1/nm_setting_wireless_security.go similarity index 98% rename from network/nm_setting_wireless_security.go rename to network1/nm_setting_wireless_security.go index faa024878..13f0b391c 100644 --- a/network/nm_setting_wireless_security.go +++ b/network1/nm_setting_wireless_security.go @@ -8,7 +8,7 @@ import ( "errors" "fmt" - "github.com/linuxdeepin/dde-daemon/network/nm" + "github.com/linuxdeepin/dde-daemon/network1/nm" ) // Virtual key getter and setter diff --git a/network/proxychains/check.go b/network1/proxychains/check.go similarity index 100% rename from network/proxychains/check.go rename to network1/proxychains/check.go diff --git a/network/proxychains/config.go b/network1/proxychains/config.go similarity index 97% rename from network/proxychains/config.go rename to network1/proxychains/config.go index 8bb281c59..8060a808a 100644 --- a/network/proxychains/config.go +++ b/network1/proxychains/config.go @@ -10,7 +10,7 @@ import ( ) type Config struct { - Enable bool + Enable bool Type string IP string Port uint32 diff --git a/network/proxychains/exported_methods_auto.go b/network1/proxychains/exported_methods_auto.go similarity index 100% rename from network/proxychains/exported_methods_auto.go rename to network1/proxychains/exported_methods_auto.go diff --git a/network/proxychains/proxychains.go b/network1/proxychains/proxychains.go similarity index 97% rename from network/proxychains/proxychains.go rename to network1/proxychains/proxychains.go index a1ec58bb7..07414848c 100644 --- a/network/proxychains/proxychains.go +++ b/network1/proxychains/proxychains.go @@ -12,9 +12,9 @@ import ( "path/filepath" "sync" - proxy "github.com/linuxdeepin/go-dbus-factory/com.deepin.system.proxy" + proxy "github.com/linuxdeepin/go-dbus-factory/system/com.deepin.system.proxy" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/go-lib/xdg/basedir" @@ -62,8 +62,8 @@ func NewManager(service *dbusutil.Service) *Manager { } const ( - DBusPath = "/com/deepin/daemon/Network/ProxyChains" - dbusInterface = "com.deepin.daemon.Network.ProxyChains" + DBusPath = "/org/deepin/dde/Network/ProxyChains" + dbusInterface = "org.deepin.dde.Network.ProxyChains" ) func (*Manager) GetInterfaceName() string { diff --git a/network/proxychains/utils_notify.go b/network1/proxychains/utils_notify.go similarity index 90% rename from network/proxychains/utils_notify.go rename to network1/proxychains/utils_notify.go index 5d5726f00..b7327cce8 100644 --- a/network/proxychains/utils_notify.go +++ b/network1/proxychains/utils_notify.go @@ -5,8 +5,8 @@ package proxychains import ( - dbus "github.com/godbus/dbus" - notifications "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.notifications" + dbus "github.com/godbus/dbus/v5" + notifications "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.notifications" . "github.com/linuxdeepin/go-lib/gettext" ) diff --git a/network/secret_agent.go b/network1/secret_agent.go similarity index 99% rename from network/secret_agent.go rename to network1/secret_agent.go index 4ca65c0f6..5f6a75b11 100644 --- a/network/secret_agent.go +++ b/network1/secret_agent.go @@ -10,6 +10,7 @@ import ( "encoding/json" "errors" "fmt" + "os" "os/exec" "strconv" @@ -17,10 +18,10 @@ import ( "sync" "time" - "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/network/nm" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" - secrets "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.secrets" + "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/network1/nm" + ofdbus "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.dbus" + secrets "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.secrets" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/strv" ) @@ -1254,5 +1255,5 @@ type SecretAgentSession struct { } func (*SecretAgentSession) GetInterfaceName() string { - return "com.deepin.daemon.Network.SecretAgent" + return "org.deepin.dde.Network1.SecretAgent" } diff --git a/network/state_handler.go b/network1/state_handler.go similarity index 99% rename from network/state_handler.go rename to network1/state_handler.go index f8d3891cc..51614d102 100644 --- a/network/state_handler.go +++ b/network1/state_handler.go @@ -8,9 +8,9 @@ import ( "fmt" "sync" - dbus "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/network/nm" - nmdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.networkmanager" + dbus "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/network1/nm" + nmdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.networkmanager" "github.com/linuxdeepin/go-lib/dbusutil" . "github.com/linuxdeepin/go-lib/gettext" ) @@ -283,7 +283,7 @@ func (sh *stateHandler) watch(path dbus.ObjectPath) { // 如果禁用了失败的消息,则不提示失败消息 return } - + // ignore device removed signals for that could not // query related information correct if reason == nm.NM_DEVICE_STATE_REASON_REMOVED { diff --git a/network/sync_config.go b/network1/sync_config.go similarity index 90% rename from network/sync_config.go rename to network1/sync_config.go index 3973ab4d1..513d14f82 100644 --- a/network/sync_config.go +++ b/network1/sync_config.go @@ -7,7 +7,7 @@ package network import ( "encoding/json" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/common/dsync" ) @@ -16,8 +16,8 @@ type syncConfig struct { } const ( - daemonSysService = "com.deepin.daemon.Daemon" - daemonSysPath = "/com/deepin/daemon/Daemon" + daemonSysService = "org.deepin.dde.Daemon1" + daemonSysPath = "/org/deepin/dde/Daemon1" daemonSysIFC = daemonSysService methodSysNetGetConnections = daemonSysIFC + ".NetworkGetConnections" diff --git a/network/testdata/ca.crt b/network1/testdata/ca.crt similarity index 100% rename from network/testdata/ca.crt rename to network1/testdata/ca.crt diff --git a/network/testdata/ca.key b/network1/testdata/ca.key similarity index 100% rename from network/testdata/ca.key rename to network1/testdata/ca.key diff --git a/network/testdata/client.crt b/network1/testdata/client.crt similarity index 100% rename from network/testdata/client.crt rename to network1/testdata/client.crt diff --git a/network/testdata/client.key b/network1/testdata/client.key similarity index 100% rename from network/testdata/client.key rename to network1/testdata/client.key diff --git a/network/utils.go b/network1/utils.go similarity index 97% rename from network/utils.go rename to network1/utils.go index 0cb4ad68e..e1c6c64b0 100644 --- a/network/utils.go +++ b/network1/utils.go @@ -16,12 +16,12 @@ import ( "strings" "time" - dbus "github.com/godbus/dbus" - nmdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.networkmanager" + dbus "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/iw" + "github.com/linuxdeepin/dde-daemon/network1/nm" + nmdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.networkmanager" "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/utils" - "github.com/linuxdeepin/dde-daemon/iw" - "github.com/linuxdeepin/dde-daemon/network/nm" ) func isStringInArray(s string, list []string) bool { @@ -309,4 +309,4 @@ func showOSD(signal string) { logger.Debug("show OSD", signal) sessionDBus, _ := dbus.SessionBus() go sessionDBus.Object("com.deepin.dde.osd", "/").Call("com.deepin.dde.osd.ShowOSD", 0, signal) -} \ No newline at end of file +} diff --git a/network/utils_dbus.go b/network1/utils_dbus.go similarity index 82% rename from network/utils_dbus.go rename to network1/utils_dbus.go index 652c53691..171ada4c5 100644 --- a/network/utils_dbus.go +++ b/network1/utils_dbus.go @@ -5,11 +5,11 @@ package network import ( - "github.com/godbus/dbus" - dbusmgr "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" - nmdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.networkmanager" - notifications "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.notifications" + "github.com/godbus/dbus/v5" + notifications "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.notifications" + dbusmgr "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.dbus" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" + nmdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.networkmanager" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/proxy" ) diff --git a/network/utils_dbus_mm.go b/network1/utils_dbus_mm.go similarity index 98% rename from network/utils_dbus_mm.go rename to network1/utils_dbus_mm.go index 8ce61f039..d355d6b40 100644 --- a/network/utils_dbus_mm.go +++ b/network1/utils_dbus_mm.go @@ -5,8 +5,8 @@ package network import ( - "github.com/godbus/dbus" - mmdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.modemmanager1" + "github.com/godbus/dbus/v5" + mmdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.modemmanager1" "github.com/linuxdeepin/go-lib/dbusutil/proxy" ) diff --git a/network/utils_dbus_nm.go b/network1/utils_dbus_nm.go similarity index 99% rename from network/utils_dbus_nm.go rename to network1/utils_dbus_nm.go index 10ae3bc96..c3d2b17bc 100644 --- a/network/utils_dbus_nm.go +++ b/network1/utils_dbus_nm.go @@ -12,9 +12,9 @@ import ( "strings" "time" - "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/network/nm" - nmdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.networkmanager" + "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/network1/nm" + nmdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.networkmanager" "github.com/linuxdeepin/go-lib/dbusutil/proxy" . "github.com/linuxdeepin/go-lib/gettext" ) diff --git a/network/utils_ethtool.go b/network1/utils_ethtool.go similarity index 100% rename from network/utils_ethtool.go rename to network1/utils_ethtool.go diff --git a/network/utils_ip.go b/network1/utils_ip.go similarity index 100% rename from network/utils_ip.go rename to network1/utils_ip.go diff --git a/network/utils_ip_be_test.go b/network1/utils_ip_be_test.go similarity index 94% rename from network/utils_ip_be_test.go rename to network1/utils_ip_be_test.go index 04145d682..ec0e7d0f7 100644 --- a/network/utils_ip_be_test.go +++ b/network1/utils_ip_be_test.go @@ -1,4 +1,6 @@ +//go:build mips || mips64 || ppc64 || s390x // +build mips mips64 ppc64 s390x + // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/network/utils_ip_le_test.go b/network1/utils_ip_le_test.go similarity index 90% rename from network/utils_ip_le_test.go rename to network1/utils_ip_le_test.go index 4d780d6ac..5cf186fda 100644 --- a/network/utils_ip_le_test.go +++ b/network1/utils_ip_le_test.go @@ -1,3 +1,4 @@ +//go:build i386 || amd64 || arm || arm64 || mipsle || mips64le || ppc64le || riscv64 || wasm // +build i386 amd64 arm arm64 mipsle mips64le ppc64le riscv64 wasm // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. diff --git a/network/utils_ip_test.go b/network1/utils_ip_test.go similarity index 100% rename from network/utils_ip_test.go rename to network1/utils_ip_test.go diff --git a/network/utils_notify.go b/network1/utils_notify.go similarity index 97% rename from network/utils_notify.go rename to network1/utils_notify.go index 991786972..7074c9520 100644 --- a/network/utils_notify.go +++ b/network1/utils_notify.go @@ -9,9 +9,9 @@ import ( "sync" "time" - "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/network/nm" - notifications "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.notifications" + "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/network1/nm" + notifications "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.notifications" . "github.com/linuxdeepin/go-lib/gettext" ) diff --git a/network/utils_test.go b/network1/utils_test.go similarity index 99% rename from network/utils_test.go rename to network1/utils_test.go index e2762e6f8..124b8dd8e 100644 --- a/network/utils_test.go +++ b/network1/utils_test.go @@ -7,7 +7,7 @@ package network import ( "testing" - "github.com/linuxdeepin/dde-daemon/network/nm" + "github.com/linuxdeepin/dde-daemon/network1/nm" C "gopkg.in/check.v1" ) diff --git a/network/utils_udev.c b/network1/utils_udev.c similarity index 100% rename from network/utils_udev.c rename to network1/utils_udev.c diff --git a/network/utils_udev.go b/network1/utils_udev.go similarity index 100% rename from network/utils_udev.go rename to network1/utils_udev.go diff --git a/network/utils_udev.h b/network1/utils_udev.h similarity index 100% rename from network/utils_udev.h rename to network1/utils_udev.h diff --git a/rpm/dde-daemon.spec b/rpm/dde-daemon.spec index fb6a80ada..de4d6653d 100644 --- a/rpm/dde-daemon.spec +++ b/rpm/dde-daemon.spec @@ -95,13 +95,13 @@ sed -i 's|boot/grub|boot/grub2|' grub2/{grub2,grub_params,theme}.go # Fix activate services failed (Permission denied) # dbus service pushd misc/system-services/ -sed -i '$aSystemdService=deepin-accounts-daemon.service' com.deepin.system.Power.service \ - com.deepin.daemon.{Accounts,Apps,Daemon}.service \ - com.deepin.daemon.{Gesture,SwapSchedHelper,Timedated}.service -sed -i '$aSystemdService=dbus-com.deepin.dde.lockservice.service' com.deepin.dde.LockService.service +sed -i '$aSystemdService=deepin-accounts-daemon.service' org.deepin.dde.Power1.service \ + org.deepin.dde.{Accounts,Apps,Daemon}1.service \ + org.deepin.dde.{Gesture,SwapSchedHelper,Timedated}1.service +sed -i '$aSystemdService=dbus-org.deepin.dde.Lockservice1.service' org.deepin.dde.LockService1.service popd # systemd service -cat > misc/systemd/services/dbus-com.deepin.dde.lockservice.service < misc/systemd/services/dbus-org.deepin.dde.Lockservice1.service < 1 { value := sig.Body[1].(uint32) @@ -1157,14 +1158,14 @@ func (m *Manager) listenEventToHandleIdleOff() error { }) // + 监控鼠标移动事件 - err = m.sessionSigLoop.Conn().Object("com.deepin.daemon.KWayland", - "/com/deepin/daemon/KWayland/Output").AddMatchSignal("com.deepin.daemon.KWayland.Output", "CursorMove").Err + err = m.sessionSigLoop.Conn().Object("org.deepin.dde.KWayland1", + "/org/deepin/dde/KWayland1/Output").AddMatchSignal("org.deepin.dde.KWayland1.Output", "CursorMove").Err if err != nil { logger.Warning(err) return err } m.sessionSigLoop.AddHandler(&dbusutil.SignalRule{ - Name: "com.deepin.daemon.KWayland.Output.CursorMove", + Name: "org.deepin.dde.KWayland1.Output.CursorMove", }, func(sig *dbus.Signal) { if len(sig.Body) > 1 { if m.getDPMSMode() != dpmsStateOn { @@ -1175,14 +1176,14 @@ func (m *Manager) listenEventToHandleIdleOff() error { }) // + 监控鼠标按下事件 - err = m.sessionSigLoop.Conn().Object("com.deepin.daemon.KWayland", - "/com/deepin/daemon/KWayland/Output").AddMatchSignal("com.deepin.daemon.KWayland.Output", "ButtonPress").Err + err = m.sessionSigLoop.Conn().Object("org.deepin.dde.KWayland1", + "/org/deepin/dde/KWayland1/Output").AddMatchSignal("org.deepin.dde.KWayland1.Output", "ButtonPress").Err if err != nil { logger.Warning(err) return err } m.sessionSigLoop.AddHandler(&dbusutil.SignalRule{ - Name: "com.deepin.daemon.KWayland.Output.ButtonPress", + Name: "org.deepin.dde.KWayland1.Output.ButtonPress", }, func(sig *dbus.Signal) { if len(sig.Body) > 1 { if m.getDPMSMode() != dpmsStateOn { diff --git a/session/power/manager_ambient_light.go b/session/power1/manager_ambient_light.go similarity index 100% rename from session/power/manager_ambient_light.go rename to session/power1/manager_ambient_light.go diff --git a/session/power/manager_events.go b/session/power1/manager_events.go similarity index 97% rename from session/power/manager_events.go rename to session/power1/manager_events.go index 4c888425d..713c106d7 100644 --- a/session/power/manager_events.go +++ b/session/power1/manager_events.go @@ -7,7 +7,7 @@ package power import ( "time" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-api/soundutils" . "github.com/linuxdeepin/go-lib/gettext" ) @@ -81,8 +81,8 @@ func (m *Manager) handleWakeup() { // Fix wayland sometimes no dpms event after wakeup if m.UseWayland { - err := m.service.Conn().Object("com.deepin.daemon.KWayland", - "/com/deepin/daemon/KWayland/Output").Call("com.deepin.daemon.KWayland.Idle.simulateUserActivity", 0).Err + err := m.service.Conn().Object("org.deepin.dde.KWayland1", + "/org/deepin/dde/KWayland1/Output").Call("org.deepin.dde.KWayland1.Idle.simulateUserActivity", 0).Err if err != nil { logger.Warning(err) diff --git a/session/power/manager_stub.go b/session/power1/manager_stub.go similarity index 94% rename from session/power/manager_stub.go rename to session/power1/manager_stub.go index a3b94da36..332bd804b 100644 --- a/session/power/manager_stub.go +++ b/session/power1/manager_stub.go @@ -9,8 +9,8 @@ import ( ) const ( - dbusServiceName = "com.deepin.daemon.Power" - dbusPath = "/com/deepin/daemon/Power" + dbusServiceName = "org.deepin.dde.Power1" + dbusPath = "/org/deepin/dde/Power1" dbusInterface = dbusServiceName ) diff --git a/session/power/power_dbusutil.go b/session/power1/power_dbusutil.go similarity index 100% rename from session/power/power_dbusutil.go rename to session/power1/power_dbusutil.go diff --git a/session/power/power_save_plan.go b/session/power1/power_save_plan.go similarity index 99% rename from session/power/power_save_plan.go rename to session/power1/power_save_plan.go index b89effe2f..b1013d54b 100644 --- a/session/power/power_save_plan.go +++ b/session/power1/power_save_plan.go @@ -7,17 +7,17 @@ package power import ( "encoding/json" "errors" + "io/ioutil" "math" "os" "strings" "sync" "time" - "io/ioutil" gio "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil/gsprop" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" ConfigManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/gsettings" @@ -1007,18 +1007,18 @@ func (psp *powerSavePlan) ConnectIdle() error { logger.Warning(err) return err } - err = sessionBus.Object("com.deepin.daemon.KWayland", - "/com/deepin/daemon/KWayland/Output").AddMatchSignal("com.deepin.daemon.KWayland.Idle", "IdleTimeout").Err + err = sessionBus.Object("org.deepin.dde.KWayland1", + "/org/deepin/dde/KWayland1/Output").AddMatchSignal("org.deepin.dde.KWayland1.Idle", "IdleTimeout").Err if err != nil { logger.Warning(err) return err } sessionSigLoop := dbusutil.NewSignalLoop(sessionBus, 10) sessionSigLoop.AddHandler(&dbusutil.SignalRule{ - Name: "com.deepin.daemon.KWayland.Idle.IdleTimeout", + Name: "org.deepin.dde.KWayland1.Idle.IdleTimeout", }, func(sig *dbus.Signal) { if strings.HasPrefix(string(sig.Path), - "/com/deepin/daemon/KWayland/") && + "/org/deepin/dde/KWayland1/") && len(sig.Body) == 1 { bIdle, ok := sig.Body[0].(bool) if !ok { diff --git a/session/power/power_test.go b/session/power1/power_test.go similarity index 100% rename from session/power/power_test.go rename to session/power1/power_test.go diff --git a/session/power/sleep_inhibit.go b/session/power1/sleep_inhibit.go similarity index 89% rename from session/power/sleep_inhibit.go rename to session/power1/sleep_inhibit.go index b6e6d611c..108c4fc39 100644 --- a/session/power/sleep_inhibit.go +++ b/session/power1/sleep_inhibit.go @@ -5,14 +5,13 @@ package power import ( - "github.com/linuxdeepin/dde-daemon/appearance" - "github.com/linuxdeepin/dde-daemon/network" + "github.com/linuxdeepin/dde-daemon/network1" "syscall" - "github.com/godbus/dbus" - daemon "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.daemon" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + "github.com/godbus/dbus/v5" + daemon "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.daemon1" + ofdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.dbus" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" "github.com/linuxdeepin/go-lib/dbusutil" ) @@ -56,7 +55,7 @@ func newSleepInhibitor(login1Manager login1.Manager, daemon daemon.Daemon) *slee inhibitor.hasRunBeforeSleep = true // TODO(jouyouyun): implement 'HandleForSleep' register - appearance.HandlePrepareForSleep(true) + //appearance.HandlePrepareForSleep(true) network.HandlePrepareForSleep(true) if inhibitor.OnBeforeSuspend != nil { inhibitor.OnBeforeSuspend() @@ -83,7 +82,7 @@ func newSleepInhibitor(login1Manager login1.Manager, daemon daemon.Daemon) *slee _manager.handleWakeupDDELowPowerCheck() } network.HandlePrepareForSleep(false) - appearance.HandlePrepareForSleep(false) + //appearance.HandlePrepareForSleep(false) err := inhibitor.block() if err != nil { logger.Warning(err) diff --git a/session/power/submodule.go b/session/power1/submodule.go similarity index 100% rename from session/power/submodule.go rename to session/power1/submodule.go diff --git a/session/power/sync_config.go b/session/power1/sync_config.go similarity index 100% rename from session/power/sync_config.go rename to session/power1/sync_config.go diff --git a/session/power/utils.go b/session/power1/utils.go similarity index 95% rename from session/power/utils.go rename to session/power1/utils.go index bc2cbe5dc..7b998b94b 100644 --- a/session/power/utils.go +++ b/session/power1/utils.go @@ -11,7 +11,7 @@ import ( "strings" "time" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-api/soundutils" . "github.com/linuxdeepin/go-lib/gettext" "github.com/linuxdeepin/go-lib/gsettings" @@ -211,9 +211,9 @@ func (m *Manager) setDPMSModeOff() { } const ( - lockFrontServiceName = "com.deepin.dde.lockFront" + lockFrontServiceName = "org.deepin.dde.LockFront1" lockFrontIfc = lockFrontServiceName - lockFrontObjPath = "/com/deepin/dde/lockFront" + lockFrontObjPath = "/org/deepin/dde/LockFront1" ) func (m *Manager) tryChangeDeepinWM() bool { @@ -646,9 +646,9 @@ func isFloatEqual(f1, f2 float64) bool { func (m *Manager) getDpmsList() ([]dbus.Variant, error) { sessionBus := m.sessionSigLoop.Conn() - sessionObj := sessionBus.Object("com.deepin.daemon.KWayland", "/com/deepin/daemon/KWayland/DpmsManager") + sessionObj := sessionBus.Object("org.deepin.dde.KWayland1", "/org/deepin/dde/KWayland1/DpmsManager") var ret []dbus.Variant - err := sessionObj.Call("com.deepin.daemon.KWayland.DpmsManager.dpmsList", 0).Store(&ret) + err := sessionObj.Call("org.deepin.dde.KWayland1.DpmsManager.dpmsList", 0).Store(&ret) if err != nil { logger.Warning(err) return nil, err @@ -667,8 +667,8 @@ func (m *Manager) getDpmsModeByKwin() (int32, error) { var dpmsMode int32 for i := 0; i < len(list); i++ { v := list[i].Value().(string) - sessionObj := m.sessionSigLoop.Conn().Object("com.deepin.daemon.KWayland", dbus.ObjectPath(v)) - err = sessionObj.Call("com.deepin.daemon.KWayland.Dpms.getDpmsMode", 0).Store(&dpmsMode) + sessionObj := m.sessionSigLoop.Conn().Object("org.deepin.dde.KWayland1", dbus.ObjectPath(v)) + err = sessionObj.Call("org.deepin.dde.KWayland1.Dpms.getDpmsMode", 0).Store(&dpmsMode) if err != nil { logger.Warning(err) return dpmsStateOn, err @@ -687,8 +687,8 @@ func (m *Manager) setDpmsModeByKwin(mode int32) error { for i := 0; i < len(list); i++ { v := list[i].Value().(string) - sessionObj := m.sessionSigLoop.Conn().Object("com.deepin.daemon.KWayland", dbus.ObjectPath(v)) - err = sessionObj.Call("com.deepin.daemon.KWayland.Dpms.setDpmsMode", 0, int32(mode)).Err + sessionObj := m.sessionSigLoop.Conn().Object("org.deepin.dde.KWayland1", dbus.ObjectPath(v)) + err = sessionObj.Call("org.deepin.dde.KWayland1.Dpms.setDpmsMode", 0, int32(mode)).Err if err != nil { logger.Warning(err) return err diff --git a/session/power/warn_level.go b/session/power1/warn_level.go similarity index 100% rename from session/power/warn_level.go rename to session/power1/warn_level.go diff --git a/session/power/warn_level_config.go b/session/power1/warn_level_config.go similarity index 99% rename from session/power/warn_level_config.go rename to session/power1/warn_level_config.go index c0178d6ef..78ab1396f 100644 --- a/session/power/warn_level_config.go +++ b/session/power1/warn_level_config.go @@ -7,7 +7,7 @@ package power import ( "time" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" gio "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil/gsprop" "github.com/linuxdeepin/go-lib/gsettings" @@ -31,7 +31,6 @@ func (c *warnLevelConfig) isValid() bool { if c.LowTime > c.DangerTime && c.DangerTime > c.CriticalTime && c.CriticalTime > c.ActionTime && - c.remindPercentage > c.LowPercentage && c.LowPercentage > c.DangerPercentage && c.DangerPercentage > c.CriticalPercentage && diff --git a/session/uadpagent/exported_methods_auto.go b/session/uadpagent1/exported_methods_auto.go similarity index 100% rename from session/uadpagent/exported_methods_auto.go rename to session/uadpagent1/exported_methods_auto.go diff --git a/session/uadpagent/module.go b/session/uadpagent1/module.go similarity index 100% rename from session/uadpagent/module.go rename to session/uadpagent1/module.go index ba69bc3ca..2b525910e 100644 --- a/session/uadpagent/module.go +++ b/session/uadpagent1/module.go @@ -5,8 +5,8 @@ package uadpagent import ( - "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/dde-daemon/loader" + "github.com/linuxdeepin/go-lib/log" ) func init() { diff --git a/session/uadpagent/uadpagent.go b/session/uadpagent1/uadpagent.go similarity index 96% rename from session/uadpagent/uadpagent.go rename to session/uadpagent1/uadpagent.go index 06a831b3f..997eaf3d3 100644 --- a/session/uadpagent/uadpagent.go +++ b/session/uadpagent1/uadpagent.go @@ -12,13 +12,13 @@ import ( "os" "sync" - dbus "github.com/godbus/dbus" - uadp "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.uadp" - secrets "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.secrets" + dbus "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/session/common" + secrets "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.secrets" + uadp "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.uadp1" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/go-lib/procfs" - "github.com/linuxdeepin/dde-daemon/session/common" ) //go:generate dbusutil-gen em -type UadpAgent @@ -26,8 +26,8 @@ import ( var logger = log.NewLogger("daemon/session/UadpAgent") const ( - dbusServiceName = "com.deepin.daemon.UadpAgent" - dbusPath = "/com/deepin/daemon/UadpAgent" + dbusServiceName = "org.deepin.dde.UadpAgent1" + dbusPath = "/org/deepin/dde/UadpAgent1" dbusInterface = dbusServiceName ) diff --git a/sessionwatcher/exported_methods_auto.go b/sessionwatcher1/exported_methods_auto.go similarity index 100% rename from sessionwatcher/exported_methods_auto.go rename to sessionwatcher1/exported_methods_auto.go diff --git a/sessionwatcher/manager.go b/sessionwatcher1/manager.go similarity index 95% rename from sessionwatcher/manager.go rename to sessionwatcher1/manager.go index 5e4e340bb..485e6496b 100644 --- a/sessionwatcher/manager.go +++ b/sessionwatcher1/manager.go @@ -7,9 +7,9 @@ package sessionwatcher import ( "sync" - "github.com/godbus/dbus" - libdisplay "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.display" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + "github.com/godbus/dbus/v5" + libdisplay "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.display1" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/proxy" ) @@ -17,8 +17,8 @@ import ( //go:generate dbusutil-gen em -type Manager const ( - dbusServiceName = "com.deepin.daemon.SessionWatcher" - dbusPath = "/com/deepin/daemon/SessionWatcher" + dbusServiceName = "org.deepin.dde.SessionWatcher1" + dbusPath = "/org/deepin/dde/SessionWatcher1" dbusInterface = dbusServiceName ) diff --git a/sessionwatcher/sessionwatcher.go b/sessionwatcher1/sessionwatcher.go similarity index 100% rename from sessionwatcher/sessionwatcher.go rename to sessionwatcher1/sessionwatcher.go index 2f5f4fc1d..aa491d57f 100644 --- a/sessionwatcher/sessionwatcher.go +++ b/sessionwatcher1/sessionwatcher.go @@ -5,8 +5,8 @@ package sessionwatcher import ( - "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/dde-daemon/loader" + "github.com/linuxdeepin/go-lib/log" ) var ( diff --git a/sessionwatcher/utils.go b/sessionwatcher1/utils.go similarity index 100% rename from sessionwatcher/utils.go rename to sessionwatcher1/utils.go diff --git a/soundeffect/exported_methods_auto.go b/soundeffect1/exported_methods_auto.go similarity index 100% rename from soundeffect/exported_methods_auto.go rename to soundeffect1/exported_methods_auto.go diff --git a/soundeffect/manager.go b/soundeffect1/manager.go similarity index 95% rename from soundeffect/manager.go rename to soundeffect1/manager.go index 9fcc39cf3..a256d6176 100644 --- a/soundeffect/manager.go +++ b/soundeffect1/manager.go @@ -11,9 +11,9 @@ import ( "os/exec" "sync" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-api/soundutils" - soundthemeplayer "github.com/linuxdeepin/go-dbus-factory/com.deepin.api.soundthemeplayer" + soundthemeplayer "github.com/linuxdeepin/go-dbus-factory/system/com.deepin.api.soundthemeplayer" "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/gsprop" @@ -28,8 +28,8 @@ const ( gsKeyEnabled = "enabled" gsKeySoundTheme = "sound-theme" - DBusServiceName = "com.deepin.daemon.SoundEffect" - dbusPath = "/com/deepin/daemon/SoundEffect" + DBusServiceName = "org.deepin.dde.SoundEffect1" + dbusPath = "/org/deepin/dde/SoundEffect1" dbusInterface = DBusServiceName allowPlaySoundMaxCount = 3 ) diff --git a/soundeffect/soundeffect.go b/soundeffect1/soundeffect.go similarity index 100% rename from soundeffect/soundeffect.go rename to soundeffect1/soundeffect.go diff --git a/system/airplane_mode/airplane_mode.go b/system/airplane_mode1/airplane_mode.go similarity index 100% rename from system/airplane_mode/airplane_mode.go rename to system/airplane_mode1/airplane_mode.go diff --git a/system/airplane_mode/airplane_mode_dbusutil.go b/system/airplane_mode1/airplane_mode_dbusutil.go similarity index 100% rename from system/airplane_mode/airplane_mode_dbusutil.go rename to system/airplane_mode1/airplane_mode_dbusutil.go diff --git a/system/airplane_mode/config.go b/system/airplane_mode1/config.go similarity index 100% rename from system/airplane_mode/config.go rename to system/airplane_mode1/config.go diff --git a/system/airplane_mode/define.go b/system/airplane_mode1/define.go similarity index 100% rename from system/airplane_mode/define.go rename to system/airplane_mode1/define.go diff --git a/system/airplane_mode/exported_methods_auto.go b/system/airplane_mode1/exported_methods_auto.go similarity index 100% rename from system/airplane_mode/exported_methods_auto.go rename to system/airplane_mode1/exported_methods_auto.go diff --git a/system/airplane_mode/manager.go b/system/airplane_mode1/manager.go similarity index 94% rename from system/airplane_mode/manager.go rename to system/airplane_mode1/manager.go index cb1110c73..1d31d1968 100644 --- a/system/airplane_mode/manager.go +++ b/system/airplane_mode1/manager.go @@ -9,18 +9,18 @@ import ( "sync" "time" - "github.com/godbus/dbus" - networkmanager "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.networkmanager" - polkit "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.policykit1" + "github.com/godbus/dbus/v5" + networkmanager "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.networkmanager" + polkit "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.policykit1" "github.com/linuxdeepin/go-lib/dbusutil" ) const ( - dbusServiceName = "com.deepin.daemon.AirplaneMode" - dbusPath = "/com/deepin/daemon/AirplaneMode" + dbusServiceName = "org.deepin.dde.AirplaneMode1" + dbusPath = "/org/deepin/dde/AirplaneMode1" dbusInterface = dbusServiceName - actionId = "com.deepin.daemon.airplane-mode.enable-disable-any" + actionId = "org.deepin.dde.airplane-mode.enable-disable-any" ) type device struct { @@ -78,6 +78,7 @@ func (mgr *Manager) Enable(sender dbus.Sender, enableAirplaneMode bool) *dbus.Er // check auth err := checkAuthorization(actionId, string(sender)) if err != nil { + logger.Warningf("checkAuthorization failed, err: %v, actionId=%v", err, actionId) return dbusutil.ToError(err) } diff --git a/system/airplane_mode/rfkill.go b/system/airplane_mode1/rfkill.go similarity index 87% rename from system/airplane_mode/rfkill.go rename to system/airplane_mode1/rfkill.go index 89a7f4b89..cd2e3f590 100644 --- a/system/airplane_mode/rfkill.go +++ b/system/airplane_mode1/rfkill.go @@ -51,10 +51,27 @@ type RfkillEvent struct { } func (mgr *Manager) listenRfkill() { - fd, err := syscall.Open("/dev/rfkill", syscall.O_RDWR, 0777) + getRfkill := func() (fd int, err error) { + return syscall.Open("/dev/rfkill", syscall.O_RDWR, 0777) + } + fd, err := getRfkill() if err != nil { - logger.Warning("failed to open /dev/rfkill:", err) - return + // 个别机器文件创建较晚,尝试多读几次 + var checkTimer = time.NewTimer(time.Second) + count := 0 + for range checkTimer.C { + if count == 5 { + logger.Warning("failed to open /dev/rfkill:", err) + return + } else { + fd, err = getRfkill() + if err == nil { + break + } + count++ + checkTimer.Reset(time.Second) + } + } } defer syscall.Close(fd) @@ -155,20 +172,29 @@ func (mgr *Manager) updateAllState() { // 仅保存 soft block 的状态 allSoftBlocked := false + wifiBlocked := false states, err := getRfkillState(rfkillTypeWifi) - if err != nil { - logger.Warning(err) - allSoftBlocked = mgr.BluetoothEnabled && mgr.WifiEnabled - } else if mgr.WifiEnabled { - allSoftBlocked = mgr.BluetoothEnabled - } else { + if err == nil { // nm 无线控制关闭,可能是hard关闭,dde只控制soft。 + allWifiSoftBlocked := true for _, v := range states { - if v.Soft != 0 { - allSoftBlocked = true - + if v.Soft == 0 { + allWifiSoftBlocked = false + break } } + wifiBlocked = allWifiSoftBlocked + } else { + logger.Warning(err) + wifiBlocked = mgr.hasNmWirelessDevices && mgr.WifiEnabled + } + + if mgr.hasNmWirelessDevices && len(mgr.btRfkillDevices) > 0 { + allSoftBlocked = wifiBlocked && mgr.BluetoothEnabled + } else if mgr.hasNmWirelessDevices { + allSoftBlocked = wifiBlocked + } else if len(mgr.btRfkillDevices) > 0 { + allSoftBlocked = mgr.BluetoothEnabled } mgr.config.SetBlocked(rfkillTypeAll, allSoftBlocked) @@ -177,6 +203,7 @@ func (mgr *Manager) updateAllState() { // 只处理bluetooth设备 func (mgr *Manager) handleBTRfkillEvent(event *RfkillEvent) { + logger.Warning("handleBTRfkillEvent=======>", event.Typ, event.Op, event.Op == rfkillOpDel) if event.Typ != rfkillTypeBT { return } diff --git a/system/airplane_mode/utils.go b/system/airplane_mode1/utils.go similarity index 100% rename from system/airplane_mode/utils.go rename to system/airplane_mode1/utils.go diff --git a/system/bluetooth/a2dp_workaround.go b/system/bluetooth1/a2dp_workaround.go similarity index 91% rename from system/bluetooth/a2dp_workaround.go rename to system/bluetooth1/a2dp_workaround.go index 81b59ce7b..d17cf3bd4 100644 --- a/system/bluetooth/a2dp_workaround.go +++ b/system/bluetooth1/a2dp_workaround.go @@ -7,7 +7,7 @@ package bluetooth func (b *SysBluetooth) disconnectA2DPDeviceExcept(d *device) { for _, devices := range b.devices { for _, device := range devices { - if device.Path == d.Path { + if device == nil || device.Path == d.Path { continue } for _, uuid := range device.UUIDs { diff --git a/system/bluetooth/adapter.go b/system/bluetooth1/adapter.go similarity index 97% rename from system/bluetooth/adapter.go rename to system/bluetooth1/adapter.go index 48e3efaf3..9a4cb5fc0 100644 --- a/system/bluetooth/adapter.go +++ b/system/bluetooth1/adapter.go @@ -9,8 +9,8 @@ import ( "os" "time" - "github.com/godbus/dbus" - bluez "github.com/linuxdeepin/go-dbus-factory/org.bluez" + "github.com/godbus/dbus/v5" + bluez "github.com/linuxdeepin/go-dbus-factory/system/org.bluez" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/proxy" ) @@ -39,7 +39,7 @@ type adapter struct { poweredActionTime time.Time } -var defaultDiscoveringTimeout = 1 * time.Minute +var defaultDiscoveringTimeout = 30 * time.Second func newAdapter(systemSigLoop *dbusutil.SignalLoop, objPath dbus.ObjectPath) (a *adapter) { a = &adapter{Path: objPath, autoConnectFinished: false} diff --git a/system/bluetooth/agent.go b/system/bluetooth1/agent.go similarity index 73% rename from system/bluetooth/agent.go rename to system/bluetooth1/agent.go index 7d4b004a5..68d1dddbc 100644 --- a/system/bluetooth/agent.go +++ b/system/bluetooth1/agent.go @@ -10,11 +10,11 @@ import ( "strings" "sync" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" btcommon "github.com/linuxdeepin/dde-daemon/common/bluetooth" - sysbtagent "github.com/linuxdeepin/go-dbus-factory/com.deepin.system.bluetooth.agent" - bluez "github.com/linuxdeepin/go-dbus-factory/org.bluez" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + bluez "github.com/linuxdeepin/go-dbus-factory/system/org.bluez" + sysbtagent "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.bluetooth1.agent" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" "github.com/linuxdeepin/go-lib/dbusutil" ) @@ -251,18 +251,19 @@ func toErrFromAgent(err error) *dbus.Error { /*****************************************************************************/ -//Release method gets called when the service daemon unregisters the agent. -//An agent can use it to do cleanup tasks. There is no need to unregister the -//agent, because when this method gets called it has already been unregistered. +// Release method gets called when the service daemon unregisters the agent. +// An agent can use it to do cleanup tasks. There is no need to unregister the +// agent, because when this method gets called it has already been unregistered. func (a *agent) Release() *dbus.Error { logger.Info("Release()") return nil } -//RequestPinCode method gets called when the service daemon needs to get the passkey for an authentication. -//The return value should be a string of 1-16 characters length. The string can be alphanumeric. -//Possible errors: org.bluez.Error.Rejected -// org.bluez.Error.Canceled +// RequestPinCode method gets called when the service daemon needs to get the passkey for an authentication. +// The return value should be a string of 1-16 characters length. The string can be alphanumeric. +// Possible errors: org.bluez.Error.Rejected +// +// org.bluez.Error.Canceled func (a *agent) RequestPinCode(device dbus.ObjectPath) (pinCode string, busErr *dbus.Error) { logger.Info("RequestPinCode()") @@ -284,15 +285,16 @@ func (a *agent) RequestPinCode(device dbus.ObjectPath) (pinCode string, busErr * return pinCode, toErrFromAgent(err) } -//DisplayPinCode method gets called when the service daemon needs to display a pincode for an authentication. -//An empty reply should be returned. When the pincode needs no longer to be displayed, the Cancel method -//of the agent will be called. This is used during the pairing process of keyboards that don't support -//Bluetooth 2.1 Secure Simple Pairing, in contrast to DisplayPasskey which is used for those that do. -//This method will only ever be called once since older keyboards do not support typing notification. -//Note that the PIN will always be a 6-digit number, zero-padded to 6 digits. This is for harmony with -//the later specification. -//Possible errors: org.bluez.Error.Rejected -// org.bluez.Error.Canceled +// DisplayPinCode method gets called when the service daemon needs to display a pincode for an authentication. +// An empty reply should be returned. When the pincode needs no longer to be displayed, the Cancel method +// of the agent will be called. This is used during the pairing process of keyboards that don't support +// Bluetooth 2.1 Secure Simple Pairing, in contrast to DisplayPasskey which is used for those that do. +// This method will only ever be called once since older keyboards do not support typing notification. +// Note that the PIN will always be a 6-digit number, zero-padded to 6 digits. This is for harmony with +// the later specification. +// Possible errors: org.bluez.Error.Rejected +// +// org.bluez.Error.Canceled func (a *agent) DisplayPinCode(device dbus.ObjectPath, pinCode string) (busErr *dbus.Error) { logger.Info("DisplayPinCode()", pinCode) ua := a.b.getActiveUserAgent() @@ -304,10 +306,11 @@ func (a *agent) DisplayPinCode(device dbus.ObjectPath, pinCode string) (busErr * return toErrFromAgent(err) } -//RequestPasskey method gets called when the service daemon needs to get the passkey for an authentication. -//The return value should be a numeric value between 0-999999. -//Possible errors: org.bluez.Error.Rejected -// org.bluez.Error.Canceled +// RequestPasskey method gets called when the service daemon needs to get the passkey for an authentication. +// The return value should be a numeric value between 0-999999. +// Possible errors: org.bluez.Error.Rejected +// +// org.bluez.Error.Canceled func (a *agent) RequestPasskey(device dbus.ObjectPath) (passkey uint32, busErr *dbus.Error) { logger.Info("RequestPasskey()") ua := a.b.getActiveUserAgent() @@ -328,13 +331,13 @@ func (a *agent) RequestPasskey(device dbus.ObjectPath) (passkey uint32, busErr * return passkey, toErrFromAgent(err) } -//DisplayPasskey method gets called when the service daemon needs to display a passkey for an authentication. -//The entered parameter indicates the number of already typed keys on the remote side. -//An empty reply should be returned. When the passkey needs no longer to be displayed, the Cancel method -//of the agent will be called. -//During the pairing process this method might be called multiple times to update the entered value. -//Note that the passkey will always be a 6-digit number, so the display should be zero-padded at the start if -//the value contains less than 6 digits. +// DisplayPasskey method gets called when the service daemon needs to display a passkey for an authentication. +// The entered parameter indicates the number of already typed keys on the remote side. +// An empty reply should be returned. When the passkey needs no longer to be displayed, the Cancel method +// of the agent will be called. +// During the pairing process this method might be called multiple times to update the entered value. +// Note that the passkey will always be a 6-digit number, so the display should be zero-padded at the start if +// the value contains less than 6 digits. func (a *agent) DisplayPasskey(device dbus.ObjectPath, passkey uint32, entered uint16) *dbus.Error { logger.Info("DisplayPasskey()", passkey, entered) ua := a.b.getActiveUserAgent() @@ -346,12 +349,13 @@ func (a *agent) DisplayPasskey(device dbus.ObjectPath, passkey uint32, entered u return toErrFromAgent(err) } -//RequestConfirmation This method gets called when the service daemon needs to confirm a passkey for an authentication. -//To confirm the value it should return an empty reply or an error in case the passkey is invalid. -//Note that the passkey will always be a 6-digit number, so the display should be zero-padded at the start if -//the value contains less than 6 digits. -//Possible errors: org.bluez.Error.Rejected -// org.bluez.Error.Canceled +// RequestConfirmation This method gets called when the service daemon needs to confirm a passkey for an authentication. +// To confirm the value it should return an empty reply or an error in case the passkey is invalid. +// Note that the passkey will always be a 6-digit number, so the display should be zero-padded at the start if +// the value contains less than 6 digits. +// Possible errors: org.bluez.Error.Rejected +// +// org.bluez.Error.Canceled func (a *agent) RequestConfirmation(device dbus.ObjectPath, passkey uint32) *dbus.Error { logger.Info("RequestConfirmation", device, passkey) ua := a.b.getActiveUserAgent() @@ -377,10 +381,11 @@ func (a *agent) RequestConfirmation(device dbus.ObjectPath, passkey uint32) *dbu return toErrFromAgent(err) } -//RequestAuthorization method gets called to request the user to authorize an incoming pairing attempt which -//would in other circumstances trigger the just-works model. -//Possible errors: org.bluez.Error.Rejected -// org.bluez.Error.Canceled +// RequestAuthorization method gets called to request the user to authorize an incoming pairing attempt which +// would in other circumstances trigger the just-works model. +// Possible errors: org.bluez.Error.Rejected +// +// org.bluez.Error.Canceled func (a *agent) RequestAuthorization(device dbus.ObjectPath) *dbus.Error { logger.Info("RequestAuthorization()") ua := a.b.getActiveUserAgent() @@ -401,9 +406,10 @@ func (a *agent) RequestAuthorization(device dbus.ObjectPath) *dbus.Error { return toErrFromAgent(err) } -//AuthorizeService method gets called when the service daemon needs to authorize a connection/service request. -//Possible errors: org.bluez.Error.Rejected -// org.bluez.Error.Canceled +// AuthorizeService method gets called when the service daemon needs to authorize a connection/service request. +// Possible errors: org.bluez.Error.Rejected +// +// org.bluez.Error.Canceled func (a *agent) AuthorizeService(device dbus.ObjectPath, uuid string) *dbus.Error { logger.Infof("AuthorizeService %q %q", device, uuid) _, err := a.b.getDevice(device) @@ -421,7 +427,7 @@ func (a *agent) AuthorizeService(device dbus.ObjectPath, uuid string) *dbus.Erro return toErrFromAgent(err) } -//Cancel method gets called to indicate that the agent request failed before a reply was returned. +// Cancel method gets called to indicate that the agent request failed before a reply was returned. func (a *agent) Cancel() *dbus.Error { logger.Info("Cancel()") ua := a.b.getActiveUserAgent() diff --git a/system/bluetooth/auto_connect_manager.go b/system/bluetooth1/auto_connect_manager.go similarity index 98% rename from system/bluetooth/auto_connect_manager.go rename to system/bluetooth1/auto_connect_manager.go index ffbea90fa..6b8b5f76d 100644 --- a/system/bluetooth/auto_connect_manager.go +++ b/system/bluetooth1/auto_connect_manager.go @@ -10,7 +10,7 @@ import ( "sync" "time" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" ) // 每个适配器最大 worker 数量,最大同时连接设备数。 @@ -27,7 +27,7 @@ type autoConnectManager struct { // 和单个适配器相关的数据 type acmAdapterData struct { - workers map[int]bool + workers map[int]bool // 需要等待的由设备主动重连接的设备集合 activeReconnectDevices map[dbus.ObjectPath]struct{} timer *time.Timer @@ -323,7 +323,7 @@ func (acm *autoConnectManager) addAdapter(adapterPath dbus.ObjectPath) { } acm.adapters[adapterPath] = &acmAdapterData{ - workers: make(map[int]bool), + workers: make(map[int]bool), } } diff --git a/system/bluetooth/bluetooth.go b/system/bluetooth1/bluetooth.go similarity index 95% rename from system/bluetooth/bluetooth.go rename to system/bluetooth1/bluetooth.go index 0ee3d064c..2863913c4 100644 --- a/system/bluetooth/bluetooth.go +++ b/system/bluetooth1/bluetooth.go @@ -12,11 +12,11 @@ import ( "sync" "time" - "github.com/godbus/dbus" - bluez "github.com/linuxdeepin/go-dbus-factory/org.bluez" + "github.com/godbus/dbus/v5" ConfigManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + bluez "github.com/linuxdeepin/go-dbus-factory/system/org.bluez" + ofdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.dbus" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" "github.com/linuxdeepin/go-lib/dbusutil" ) @@ -25,8 +25,8 @@ const ( bluezAdapterDBusInterface = "org.bluez.Adapter1" bluezDeviceDBusInterface = "org.bluez.Device1" - dbusServiceName = "com.deepin.system.Bluetooth" - dbusPath = "/com/deepin/system/Bluetooth" + dbusServiceName = "org.deepin.dde.Bluetooth1" + dbusPath = "/org/deepin/dde/Bluetooth1" dbusInterface = dbusServiceName ) @@ -343,6 +343,7 @@ func (b *SysBluetooth) handleSessionNew(sessionId string, sessionPath dbus.Objec func (b *SysBluetooth) handlePrepareForSleep(beforeSleep bool) { if beforeSleep { + b.stopDiscovery() logger.Debug("prepare to sleep") return } @@ -873,6 +874,8 @@ func (b *SysBluetooth) tryConnectPairedDevices(adapterPath dbus.ObjectPath) { return } + b.setAutoConnectFinishedStatus(adapterPath, false) + inputOnly := true // 自动连接时长 defaultConnectDuration := 2 * time.Minute @@ -929,6 +932,7 @@ func (b *SysBluetooth) tryConnectPairedDevices(adapterPath dbus.ObjectPath) { }) priority++ } + b.setAutoConnectFinishedStatus(adapterPath, false) b.acm.addDevices(adapterPath, deviceInfos, activeReconnectDevices) } } @@ -1070,3 +1074,37 @@ func (b *SysBluetooth) findFirstConnectedDeviceByIcon(icon string) *device { } return nil } + +func (b *SysBluetooth) setAutoConnectFinishedStatus(adapterPath dbus.ObjectPath, status bool) { + adapter, err := b.getAdapter(adapterPath) + if err != nil { + // 可能是适配器被移除了 + logger.Warningf("call getAdapter failed; adapterPath:[%s] err:[%s]", adapterPath, err) + return + } + + if !adapter.Powered { + // 适配器电源关闭了 + logger.Warningf("adapter: [%s] is power off", adapterPath) + return + } + adapter.autoConnectFinished = status + + return +} + +func (b *SysBluetooth) stopDiscovery() { + b.adaptersMu.Lock() + defer b.adaptersMu.Unlock() + + for _, adapter := range b.adapters { + if adapter.Discovering { + err := adapter.core.Adapter().StopDiscovery(0) + if err != nil { + logger.Warning(err) + } + } + } + + return +} diff --git a/system/bluetooth/bluetooth_dbusutil.go b/system/bluetooth1/bluetooth_dbusutil.go similarity index 100% rename from system/bluetooth/bluetooth_dbusutil.go rename to system/bluetooth1/bluetooth_dbusutil.go diff --git a/system/bluetooth/bluetooth_ifc.go b/system/bluetooth1/bluetooth_ifc.go similarity index 97% rename from system/bluetooth/bluetooth_ifc.go rename to system/bluetooth1/bluetooth_ifc.go index dcbb58fec..eaf1d4b75 100644 --- a/system/bluetooth/bluetooth_ifc.go +++ b/system/bluetooth1/bluetooth_ifc.go @@ -9,9 +9,9 @@ import ( "strconv" "time" - "github.com/godbus/dbus" - sysbtagent "github.com/linuxdeepin/go-dbus-factory/com.deepin.system.bluetooth.agent" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + "github.com/godbus/dbus/v5" + sysbtagent "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.bluetooth1.agent" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" "github.com/linuxdeepin/go-lib/dbusutil" ) @@ -378,7 +378,7 @@ func (b *SysBluetooth) DebugInfo() (info string, busErr *dbus.Error) { return info, nil } -//ClearUnpairedDevice will remove all device in unpaired list +// ClearUnpairedDevice will remove all device in unpaired list func (b *SysBluetooth) ClearUnpairedDevice() *dbus.Error { logger.Debug("ClearUnpairedDevice") var removeDevices []*device diff --git a/system/bluetooth/bluez_profile.go b/system/bluetooth1/bluez_profile.go similarity index 100% rename from system/bluetooth/bluez_profile.go rename to system/bluetooth1/bluez_profile.go diff --git a/system/bluetooth/bluez_uuid.go b/system/bluetooth1/bluez_uuid.go similarity index 100% rename from system/bluetooth/bluez_uuid.go rename to system/bluetooth1/bluez_uuid.go diff --git a/system/bluetooth/config.go b/system/bluetooth1/config.go similarity index 100% rename from system/bluetooth/config.go rename to system/bluetooth1/config.go diff --git a/system/bluetooth/config_test.go b/system/bluetooth1/config_test.go similarity index 99% rename from system/bluetooth/config_test.go rename to system/bluetooth1/config_test.go index 39b8ac091..a7d71b3e3 100644 --- a/system/bluetooth/config_test.go +++ b/system/bluetooth1/config_test.go @@ -24,7 +24,7 @@ var _deviceConfig = &deviceConfig{ func Test_config(t *testing.T) { configAdapters := map[string]*adapterConfig{ "00:1A:7D:DA:71:13": { - Powered: false, + Powered: false, Discoverable: true, }, } diff --git a/system/bluetooth/device.go b/system/bluetooth1/device.go similarity index 98% rename from system/bluetooth/device.go rename to system/bluetooth1/device.go index e3931576d..6f8790a2a 100644 --- a/system/bluetooth/device.go +++ b/system/bluetooth1/device.go @@ -12,8 +12,8 @@ import ( "sync" "time" - "github.com/godbus/dbus" - bluez "github.com/linuxdeepin/go-dbus-factory/org.bluez" + "github.com/godbus/dbus/v5" + bluez "github.com/linuxdeepin/go-dbus-factory/system/org.bluez" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/proxy" ) @@ -96,7 +96,7 @@ type device struct { blocked bool } -//设备的备份,扫描结束3分钟后保存设备 +// 设备的备份,扫描结束3分钟后保存设备 type backupDevice struct { Path dbus.ObjectPath AdapterPath dbus.ObjectPath @@ -612,6 +612,18 @@ func (d *device) doConnect(hasNotify bool) error { } func (d *device) doRealConnect() error { + if d.adapter.Discovering { + err := d.adapter.core.Adapter().StopDiscovery(0) + if err != nil { + logger.Warning(err) + } + defer func() { + err = d.adapter.core.Adapter().StartDiscovery(0) + if err != nil { + logger.Warning(err) + } + }() + } d.setConnectPhase(connectPhaseConnectProfilesStart) err := d.core.Connect(0) d.setConnectPhase(connectPhaseConnectProfilesEnd) @@ -808,7 +820,7 @@ func (d *device) shouldReconnectByHost() bool { return false } -//nolint +// nolint const ( inputReconnectModeNone = "none" inputReconnectModeHost = "host" diff --git a/system/bluetooth/doc.go b/system/bluetooth1/doc.go similarity index 100% rename from system/bluetooth/doc.go rename to system/bluetooth1/doc.go diff --git a/system/bluetooth/exported_methods_auto.go b/system/bluetooth1/exported_methods_auto.go similarity index 100% rename from system/bluetooth/exported_methods_auto.go rename to system/bluetooth1/exported_methods_auto.go diff --git a/system/bluetooth/init.go b/system/bluetooth1/init.go similarity index 100% rename from system/bluetooth/init.go rename to system/bluetooth1/init.go diff --git a/system/bluetooth/module.go b/system/bluetooth1/module.go similarity index 100% rename from system/bluetooth/module.go rename to system/bluetooth1/module.go diff --git a/system/bluetooth/utils.go b/system/bluetooth1/utils.go similarity index 100% rename from system/bluetooth/utils.go rename to system/bluetooth1/utils.go diff --git a/system/bluetooth/utils_notify.go b/system/bluetooth1/utils_notify.go similarity index 100% rename from system/bluetooth/utils_notify.go rename to system/bluetooth1/utils_notify.go diff --git a/system/bluetooth/utils_test.go b/system/bluetooth1/utils_test.go similarity index 100% rename from system/bluetooth/utils_test.go rename to system/bluetooth1/utils_test.go diff --git a/system/display/display_test.go b/system/display1/display_test.go similarity index 98% rename from system/display/display_test.go rename to system/display1/display_test.go index 457838d7c..f45e4a6a0 100644 --- a/system/display/display_test.go +++ b/system/display1/display_test.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package display +package display1 import ( "os" diff --git a/system/display/displaycfg.go b/system/display1/displaycfg.go similarity index 98% rename from system/display/displaycfg.go rename to system/display1/displaycfg.go index 01a79b46c..eb606b111 100644 --- a/system/display/displaycfg.go +++ b/system/display1/displaycfg.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package display +package display1 import ( "bufio" @@ -17,7 +17,7 @@ import ( "strings" "sync" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/common/cpuinfo" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/log" @@ -25,9 +25,9 @@ import ( ) const ( - dbusServiceName = "com.deepin.system.Display" + dbusServiceName = "org.deepin.dde.Display1" dbusInterfaceName = dbusServiceName - dbusPath = "/com/deepin/system/Display" + dbusPath = "/org/deepin/dde/Display1" configFilePath = "/var/lib/dde-daemon/display/config.json" rendererConfigPath = "/var/lib/dde-daemon/display/rendererConfig.json" supportLabcFilePath = "/sys/firmware/devicetree/base/sensors_cfg/support_labc" diff --git a/system/display/exported_methods_auto.go b/system/display1/exported_methods_auto.go similarity index 97% rename from system/display/exported_methods_auto.go rename to system/display1/exported_methods_auto.go index 28e0e0091..97d6f4276 100644 --- a/system/display/exported_methods_auto.go +++ b/system/display1/exported_methods_auto.go @@ -1,6 +1,6 @@ // Code generated by "dbusutil-gen em -type Display"; DO NOT EDIT. -package display +package display1 import ( "github.com/linuxdeepin/go-lib/dbusutil" diff --git a/system/display/module.go b/system/display1/module.go similarity index 98% rename from system/display/module.go rename to system/display1/module.go index 99b36a725..b17194657 100644 --- a/system/display/module.go +++ b/system/display1/module.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package display +package display1 import ( "github.com/linuxdeepin/dde-daemon/loader" diff --git a/system/gesture/config.go b/system/gesture1/config.go similarity index 97% rename from system/gesture/config.go rename to system/gesture1/config.go index d4aebaac7..36df01322 100644 --- a/system/gesture/config.go +++ b/system/gesture1/config.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package gesture +package gesture1 import ( "encoding/json" diff --git a/system/gesture/config_test.go b/system/gesture1/config_test.go similarity index 96% rename from system/gesture/config_test.go rename to system/gesture1/config_test.go index 3c92bc239..280bb4d71 100644 --- a/system/gesture/config_test.go +++ b/system/gesture1/config_test.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package gesture +package gesture1 import ( "testing" diff --git a/system/gesture/core.c b/system/gesture1/core.c similarity index 100% rename from system/gesture/core.c rename to system/gesture1/core.c diff --git a/system/gesture/core.h b/system/gesture1/core.h similarity index 100% rename from system/gesture/core.h rename to system/gesture1/core.h diff --git a/system/gesture/exported_methods_auto.go b/system/gesture1/exported_methods_auto.go similarity index 97% rename from system/gesture/exported_methods_auto.go rename to system/gesture1/exported_methods_auto.go index 2a1c69a71..fd02b8e96 100644 --- a/system/gesture/exported_methods_auto.go +++ b/system/gesture1/exported_methods_auto.go @@ -1,6 +1,6 @@ // Code generated by "./dbusutil-gen em -type Manager"; DO NOT EDIT. -package gesture +package gesture1 import ( "github.com/linuxdeepin/go-lib/dbusutil" diff --git a/system/gesture/gesture.go b/system/gesture1/gesture.go similarity index 97% rename from system/gesture/gesture.go rename to system/gesture1/gesture.go index e66402337..a6a0ab79c 100644 --- a/system/gesture/gesture.go +++ b/system/gesture1/gesture.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package gesture +package gesture1 // #cgo pkg-config: libinput glib-2.0 // #cgo CFLAGS: -W -Wall -fstack-protector-all -fPIC @@ -12,7 +12,7 @@ package gesture import "C" import ( - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/loader" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/log" @@ -21,9 +21,9 @@ import ( //go:generate dbusutil-gen em -type Manager const ( - dbusServiceName = "com.deepin.daemon.Gesture" - dbusPath = "/com/deepin/daemon/Gesture" - dbusInterface = "com.deepin.daemon.Gesture" + dbusServiceName = "org.deepin.dde.Gesture1" + dbusPath = "/org/deepin/dde/Gesture1" + dbusInterface = dbusServiceName ) type GestureType int32 @@ -231,13 +231,13 @@ func (*Manager) GetInterfaceName() string { return dbusInterface } -//duration unit ms +// duration unit ms func (*Manager) SetShortPressDuration(duration int) *dbus.Error { C.set_timer_short_duration(C.int(duration)) return nil } -//duration unit ms +// duration unit ms func (*Manager) SetEdgeMoveStopDuration(duration int) *dbus.Error { C.set_edge_move_stop_time(C.int(duration)) return nil @@ -248,7 +248,8 @@ func (*Manager) SetInputIgnore(node string, isIgnore bool) *dbus.Error { return nil } -//touchpad gesture +// touchpad gesture +// //export handleGestureEvent func handleGestureEvent(ty, direction, fingers C.int) { err := _m.service.Emit(_m, "Event", GestureType(ty).String(), @@ -284,7 +285,8 @@ func handleSwipeStop(fingers C.int) { } } -//touchscreen gesture +// touchscreen gesture +// //export handleTouchEvent func handleTouchEvent(ty, btn C.int) { err := _m.service.Emit(_m, "Event", TouchType(ty).String(), diff --git a/system/gesture/gesture_test.go b/system/gesture1/gesture_test.go similarity index 99% rename from system/gesture/gesture_test.go rename to system/gesture1/gesture_test.go index fd0b21d65..e7b0581af 100644 --- a/system/gesture/gesture_test.go +++ b/system/gesture1/gesture_test.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package gesture +package gesture1 import ( "testing" @@ -178,4 +178,4 @@ func Test_String_TouchDirection(t *testing.T) { g = TouchDirection(UNKNOWN) rtn = g.String() assert.Equal(t, m1[UNKNOWN], rtn) -} \ No newline at end of file +} diff --git a/system/gesture/testdata/conf b/system/gesture1/testdata/conf similarity index 100% rename from system/gesture/testdata/conf rename to system/gesture1/testdata/conf diff --git a/system/gesture/touchscreen_core.c b/system/gesture1/touchscreen_core.c similarity index 96% rename from system/gesture/touchscreen_core.c rename to system/gesture1/touchscreen_core.c index e4d7b6708..f4a7e20ef 100644 --- a/system/gesture/touchscreen_core.c +++ b/system/gesture1/touchscreen_core.c @@ -1,481 +1,481 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include -#include -#include -#include -#include - -#define LIBINPUT_TOUCHSCREEN_H -#define LOGGING false -#ifndef M_PI - #define M_PI 3.14159265358979323846 -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "utils.h" -#include "touchscreen_core.h" -#include "_cgo_export.h" - -#if LOGGING -void logger(const char *format, ...) { - va_list argptr; - va_start(argptr, format); - vfprintf(stderr, format, argptr); - va_end(argptr); -} -#else -void logger(const char *format, ...) { -}; -#endif - -int get_edge_type() { - return (int)GT_EDGE; -} - -int get_movement_type() { - return (int)GT_MOVEMENT; -} - -//set move stop time when it's edge event -void -set_edge_move_stop_time(int duration) -{ - logger("[Duration set_edge_move_stop_time ] set: %d --> %d", edge_move_stop_time, duration); - if (duration == edge_move_stop_time) { - return ; - } - edge_move_stop_time = duration; -} - -// udpate touchscreen first touch point info -void update_first_point_relative_coordinate(double x, double y) { - start_point_scale.x = x / screen.width; - start_point_scale.y = y / screen.height; -} - -//update touchscreen last touch point info -void update_last_point_relative_coordinate(double x, double y) { - last_point.x = x; - last_point.y = y; - - last_point_scale.x = last_point.x / screen.width; - last_point_scale.y = last_point.y / screen.height; -} - -point get_last_point() { - return last_point; -} - -point get_last_point_scale() { - return last_point_scale; -} - -/////////////////////////////////list: hold touchscreen fingers info -typedef struct node { - void *value; - size_t size; - struct node *next; -} node; - -typedef struct list { - node *head; - node *tail; -} list; - - -void list_destroy(list *list) { - node *cur = list->head; - node *temp; - while (cur != NULL) { - temp = cur; - cur = cur->next; - free(temp->value); - free(temp); - } - free(list); -} - -list *list_new(const void *first_val, size_t size) { - list *l = calloc(1, sizeof *l); - l->head = calloc(1, sizeof(node)); - l->tail = l->head; - // copy arbitrary value into the location - l->head->value = malloc(size); - l->head->size = size; - memcpy(l->head->value, first_val, size); - return l; -} - -list *list_append(list *l, const void *newval, size_t size) { - l->tail->next = calloc(1, sizeof(node)); - l->tail = l->tail->next; - l->tail->value = malloc(size); - l->tail->size = size; - memcpy(l->tail->value, newval, size); - return l; -} - -size_t list_len(list *l) { - node *cur = l->head; - size_t len = 0; - while (cur != NULL) { - cur = cur->next; - len++; - } - return len; -} - - -//////////////////////////////////calculate -//distance between point a and point b -double distance_euclidian(point a, point b) { - return sqrt(pow((a.x - b.x), 2.0) + pow((a.y - b.y), 2.0)); -} - -point vec_sub(point a, point b) { - point r; - r.x = a.x - b.x; - r.y = a.y - b.y; - return r; -} - -//length from point a to origin -double line_len(point a) { - return sqrt(pow(a.x, 2.0) + pow(a.y, 2.0)); -} - -double scalar_product(point a, point b) { - return a.x * b.x + a.y * b.y; -} - -//angle between two line -//line one is pass through point a and origin -//line two is pass throught point b and origin -double lines_angle(point a, point b) { - return acos(scalar_product(a, b) / (line_len(a) * line_len(b))); -} - -//angle of fingers moving on touchscreen -double movement_angle(const movement *m) { - point diff = vec_sub(m->end, m->start); - point base = (point){1, 0}; - - if (diff.x == 0 && diff.y == 0) { - return NAN; - } - - double angle = lines_angle(diff, base); - // ref 0 0 is UPPER left corner - if (diff.y > 0) { - angle = 2 * M_PI - angle; - } - return angle; -} - -double movement_length(const movement *m) { - return distance_euclidian(m->end, m->start); -} - -// convert an angle in radians into direction enum -enum Direction angle_to_direction(double angle) { - double m_pi4 = M_PI / 4; - if (isnan(angle)) { - return DIR_NONE; - } - if ((3 * m_pi4 >= angle) && (angle > m_pi4)) { - return DIR_TOP; - } - if ((5 * m_pi4 >= angle) && (angle > 3 * m_pi4)) { - return DIR_LEFT; - } - if ((7 * m_pi4 >= angle) && (angle > 5 * m_pi4)) { - return DIR_BOT; - } - return DIR_RIGHT; -} - - -int cur_touch_finger_num(movement *m) { - int num = 0; - for (size_t i = 0; i < MOV_SLOTS; i++){ - if (m[i].down) { - num++; - } - } - return num; -} - -//valid touch distance when fingers stop on screen -int valid_move_stop_touch(double x, double y) { - double dx = x - moveStop.x; - double dy = y - moveStop.y; - return fabs(dx) < move_stop_distance && fabs(dy) < move_stop_distance; -} - -//valid stop time(ms) -int valid_move_stop_time(uint32_t duration) { - return duration > edge_move_stop_time; -} - -void init_move_stop(movement m) { - moveStop.x = m.start.x; - moveStop.y = m.start.y; - moveStop.start = m.t_start; - edge_move_stop_direction = DIR_NONE; -} - -void update_move_stop(movement m) { - if (!valid_move_stop_touch(m.end.x, m.end.y)) { - moveStop.x = m.end.x; - moveStop.y = m.end.y; - moveStop.start = m.t_end; - edge_move_stop_direction = DIR_NONE; - } -} - -void check_move_stop_time(movement m) { - if (edge_move_stop_direction != DIR_NONE) { - uint32_t duration = (m.t_end - moveStop.start) / 1000; - if (valid_move_stop_time(duration)) - handleTouchEdgeMoveStop(edge_move_stop_direction, moveStop.x / screen.width, moveStop.y / screen.height, duration); - } -} - -void check_move_stop_leave(movement m) { - if (edge_move_stop_direction != DIR_NONE) { - uint32_t duration = (m.t_end - moveStop.start) / 1000; - if (valid_move_stop_time(duration)) - handleTouchEdgeMoveStopLeave(edge_move_stop_direction, moveStop.x / screen.width, moveStop.y / screen.height, duration); - } -} - -//discern direction -enum Direction discern_direction(point start) { - if (start.x <= edge_error_limit) { - return DIR_LEFT; - } - if (start.x >= screen.width - edge_error_limit) { - return DIR_RIGHT; - } - if (start.y <= edge_error_limit) { - return DIR_TOP; - } - if (start.y >= screen.height - edge_error_limit) { - return DIR_BOT; - } - return DIR_NONE; -} - -enum Direction edge_stop_move_direction(movement *m) { - for (size_t i=0; i= min_edge_distance)) { - return discern_direction(m[i].start); - } - } - return DIR_NONE; -} - -//handle touchscreen down event -void handle_touch_event_down(struct libinput_event *event, struct movement *m) { - get_screen_info(event); - struct libinput_event_touch *tevent = libinput_event_get_touch_event(event); - int32_t slot = libinput_event_touch_get_slot(tevent); - m[slot].start.x = libinput_event_touch_get_x_transformed(tevent, screen.width); - m[slot].start.y = libinput_event_touch_get_y_transformed(tevent, screen.height); - m[slot].t_start = libinput_event_touch_get_time_usec(tevent); - m[slot].end.x = m[slot].start.x; - m[slot].end.y = m[slot].start.y; - m[slot].t_end = m[slot].t_start; - m[slot].down = true; - - update_first_point_relative_coordinate(m[slot].start.x, m[slot].start.y); - update_last_point_relative_coordinate(m[slot].end.x, m[slot].end.y); - - if (cur_touch_finger_num(m) == 1) - init_move_stop(m[slot]); //only support one finger -} - -//handle touchscreen up event -void handle_touch_event_up(struct libinput_event *event, struct movement *m) { - struct libinput_event_touch *tevent = libinput_event_get_touch_event(event); - int32_t slot = libinput_event_touch_get_slot(tevent); - m[slot].t_end = libinput_event_touch_get_time_usec(tevent); - m[slot].ready = true; - - if (cur_touch_finger_num(m) == 1) - check_move_stop_leave(m[slot]); - m[slot].down = false; -} - -//handle touchscreen cancel event -void handle_touch_event_cancel(struct libinput_event *event, struct movement *m) { - struct libinput_event_touch *tevent = libinput_event_get_touch_event(event); - int32_t slot = libinput_event_touch_get_slot(tevent); - m[slot].t_end = libinput_event_touch_get_time_usec(tevent); - m[slot].ready = false; - - if (cur_touch_finger_num(m) == 1) - check_move_stop_leave(m[slot]); - - m[slot].down = false; -} - -//handle touchscreen motion event -void handle_touch_event_motion(struct libinput_event *event, struct movement *m) { - struct libinput_event_touch *tevent = libinput_event_get_touch_event(event); - int32_t slot = libinput_event_touch_get_slot(tevent); - m[slot].end.x = libinput_event_touch_get_x_transformed(tevent, screen.width); - m[slot].end.y = libinput_event_touch_get_y_transformed(tevent, screen.height); - m[slot].t_end = libinput_event_touch_get_time_usec(tevent); - - update_last_point_relative_coordinate(m[slot].end.x, m[slot].end.y); - //check if borde move - edge_move_stop_direction = edge_stop_move_direction(m); //edge moving direction - - if (cur_touch_finger_num(m) == 1) { - update_move_stop(m[slot]); - - check_move_stop_time(m[slot]); - handleTouchMoving(m[slot].end.x / screen.width, m[slot].end.y / screen.height); - } -} - -// Get all movement slots that are currently ready -list *get_ready_movements(struct movement *m) { - list *ready = NULL; - for (size_t i = 0; i < MOV_SLOTS; i++) { - if (m[i].ready) { - if (ready == NULL) { - ready = list_new(&i, sizeof(i)); - } else { - list_append(ready, &i, sizeof(i)); - } - m[i].ready = false; - } - } - return ready; -} - -bool any_down(struct movement *m) { - for (size_t i = 0; i < MOV_SLOTS; i++){ - if (m[i].down) { - return true; - } - } - return false; -} - -////////////////////////////////////////////core -void print_gesture(gesture *g) { - printf("G(%d) T%d D%d\n", g->num, g->type, g->dir); -} - -int argmax(const size_t *arr, size_t len) { - size_t highest = 0; - int index = 0; - for (size_t i = 0; i < len; i++) { - if (arr[i] > highest) { - highest = arr[i]; - index = i; - } else if (arr[i] == highest) { - index = -1; - } - } - return index; -} - -//move direction -enum Direction movement_direction(movement *m, list *ready) { - enum Direction dir = 0; - size_t enum_votes[5] = {0}, i = 0; - // collect individually transformed directions - node *cur = ready->head; - while (cur != NULL) { - i = *((size_t *)cur->value); - enum_votes[angle_to_direction(movement_angle(m + i))]++; - cur = cur->next; - } - // check if multiple directions had the same maximum vote - if ((dir = argmax(enum_votes, 5)) < 0) { - dir = DIR_NONE; - } - return dir; -} - -//edge event move side -enum Direction edge_move_direction(movement *m, list *ready) { - movement *cm; - point start; - node *cur = ready->head; - while (cur != NULL) { - cm = (m + *((size_t *)cur->value)); - start = cm->start; - if (movement_length(cm) >= min_edge_distance) { - return discern_direction(start); - } - cur = cur->next; - } - return DIR_NONE; -} - -//get touchscreeen gesture info -gesture get_gesture(movement *m, list *ready) { - gesture g = {0}; - g.num = list_len(ready); - g.dir = movement_direction(m, ready); - enum Direction edge_dir; - if (g.dir == DIR_NONE) { - g.type = GT_TAP; - } else if (g.num > 1) { - g.type = GT_MOVEMENT; - } else if (g.num == 1) { - edge_dir = edge_move_direction(m, ready); - if (edge_dir != DIR_NONE) { - g.type = GT_EDGE; - g.dir = edge_dir; - } else { - g.type = GT_MOVEMENT; - } - } - return g; -} - -//handle touchscreen gestrue event -void handle_movements(movement *m) { - //TODO skip if some fingers are still on the screen - int distance = 0; - list *ready = get_ready_movements(m); - if (ready == NULL) { - return; - } - logger("Handle movements: begin\n"); - gesture g = get_gesture(m, ready); - logger("Handle movements: got gesture\n"); - print_gesture(&g); - - handleTouchScreenEvent((int)g.type, (int)g.dir, g.num, start_point_scale.x, start_point_scale.y, last_point_scale.x, last_point_scale.y); - - list_destroy(ready); - logger("Handle movements: end\n"); -} - -//get the physical size of a device in mm -void get_screen_info(struct libinput_event *event) { - struct libinput_device *dev = libinput_event_get_device(event); - double w, h; - libinput_device_get_size(dev, &w, &h); - screen.width = w; - screen.height = h; -} +// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include +#include +#include +#include + +#define LIBINPUT_TOUCHSCREEN_H +#define LOGGING false +#ifndef M_PI + #define M_PI 3.14159265358979323846 +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" +#include "touchscreen_core.h" +#include "_cgo_export.h" + +#if LOGGING +void logger(const char *format, ...) { + va_list argptr; + va_start(argptr, format); + vfprintf(stderr, format, argptr); + va_end(argptr); +} +#else +void logger(const char *format, ...) { +}; +#endif + +int get_edge_type() { + return (int)GT_EDGE; +} + +int get_movement_type() { + return (int)GT_MOVEMENT; +} + +//set move stop time when it's edge event +void +set_edge_move_stop_time(int duration) +{ + logger("[Duration set_edge_move_stop_time ] set: %d --> %d", edge_move_stop_time, duration); + if (duration == edge_move_stop_time) { + return ; + } + edge_move_stop_time = duration; +} + +// udpate touchscreen first touch point info +void update_first_point_relative_coordinate(double x, double y) { + start_point_scale.x = x / screen.width; + start_point_scale.y = y / screen.height; +} + +//update touchscreen last touch point info +void update_last_point_relative_coordinate(double x, double y) { + last_point.x = x; + last_point.y = y; + + last_point_scale.x = last_point.x / screen.width; + last_point_scale.y = last_point.y / screen.height; +} + +point get_last_point() { + return last_point; +} + +point get_last_point_scale() { + return last_point_scale; +} + +/////////////////////////////////list: hold touchscreen fingers info +typedef struct node { + void *value; + size_t size; + struct node *next; +} node; + +typedef struct list { + node *head; + node *tail; +} list; + + +void list_destroy(list *list) { + node *cur = list->head; + node *temp; + while (cur != NULL) { + temp = cur; + cur = cur->next; + free(temp->value); + free(temp); + } + free(list); +} + +list *list_new(const void *first_val, size_t size) { + list *l = calloc(1, sizeof *l); + l->head = calloc(1, sizeof(node)); + l->tail = l->head; + // copy arbitrary value into the location + l->head->value = malloc(size); + l->head->size = size; + memcpy(l->head->value, first_val, size); + return l; +} + +list *list_append(list *l, const void *newval, size_t size) { + l->tail->next = calloc(1, sizeof(node)); + l->tail = l->tail->next; + l->tail->value = malloc(size); + l->tail->size = size; + memcpy(l->tail->value, newval, size); + return l; +} + +size_t list_len(list *l) { + node *cur = l->head; + size_t len = 0; + while (cur != NULL) { + cur = cur->next; + len++; + } + return len; +} + + +//////////////////////////////////calculate +//distance between point a and point b +double distance_euclidian(point a, point b) { + return sqrt(pow((a.x - b.x), 2.0) + pow((a.y - b.y), 2.0)); +} + +point vec_sub(point a, point b) { + point r; + r.x = a.x - b.x; + r.y = a.y - b.y; + return r; +} + +//length from point a to origin +double line_len(point a) { + return sqrt(pow(a.x, 2.0) + pow(a.y, 2.0)); +} + +double scalar_product(point a, point b) { + return a.x * b.x + a.y * b.y; +} + +//angle between two line +//line one is pass through point a and origin +//line two is pass throught point b and origin +double lines_angle(point a, point b) { + return acos(scalar_product(a, b) / (line_len(a) * line_len(b))); +} + +//angle of fingers moving on touchscreen +double movement_angle(const movement *m) { + point diff = vec_sub(m->end, m->start); + point base = (point){1, 0}; + + if (diff.x == 0 && diff.y == 0) { + return NAN; + } + + double angle = lines_angle(diff, base); + // ref 0 0 is UPPER left corner + if (diff.y > 0) { + angle = 2 * M_PI - angle; + } + return angle; +} + +double movement_length(const movement *m) { + return distance_euclidian(m->end, m->start); +} + +// convert an angle in radians into direction enum +enum Direction angle_to_direction(double angle) { + double m_pi4 = M_PI / 4; + if (isnan(angle)) { + return DIR_NONE; + } + if ((3 * m_pi4 >= angle) && (angle > m_pi4)) { + return DIR_TOP; + } + if ((5 * m_pi4 >= angle) && (angle > 3 * m_pi4)) { + return DIR_LEFT; + } + if ((7 * m_pi4 >= angle) && (angle > 5 * m_pi4)) { + return DIR_BOT; + } + return DIR_RIGHT; +} + + +int cur_touch_finger_num(movement *m) { + int num = 0; + for (size_t i = 0; i < MOV_SLOTS; i++){ + if (m[i].down) { + num++; + } + } + return num; +} + +//valid touch distance when fingers stop on screen +int valid_move_stop_touch(double x, double y) { + double dx = x - moveStop.x; + double dy = y - moveStop.y; + return fabs(dx) < move_stop_distance && fabs(dy) < move_stop_distance; +} + +//valid stop time(ms) +int valid_move_stop_time(uint32_t duration) { + return duration > edge_move_stop_time; +} + +void init_move_stop(movement m) { + moveStop.x = m.start.x; + moveStop.y = m.start.y; + moveStop.start = m.t_start; + edge_move_stop_direction = DIR_NONE; +} + +void update_move_stop(movement m) { + if (!valid_move_stop_touch(m.end.x, m.end.y)) { + moveStop.x = m.end.x; + moveStop.y = m.end.y; + moveStop.start = m.t_end; + edge_move_stop_direction = DIR_NONE; + } +} + +void check_move_stop_time(movement m) { + if (edge_move_stop_direction != DIR_NONE) { + uint32_t duration = (m.t_end - moveStop.start) / 1000; + if (valid_move_stop_time(duration)) + handleTouchEdgeMoveStop(edge_move_stop_direction, moveStop.x / screen.width, moveStop.y / screen.height, duration); + } +} + +void check_move_stop_leave(movement m) { + if (edge_move_stop_direction != DIR_NONE) { + uint32_t duration = (m.t_end - moveStop.start) / 1000; + if (valid_move_stop_time(duration)) + handleTouchEdgeMoveStopLeave(edge_move_stop_direction, moveStop.x / screen.width, moveStop.y / screen.height, duration); + } +} + +//discern direction +enum Direction discern_direction(point start) { + if (start.x <= edge_error_limit) { + return DIR_LEFT; + } + if (start.x >= screen.width - edge_error_limit) { + return DIR_RIGHT; + } + if (start.y <= edge_error_limit) { + return DIR_TOP; + } + if (start.y >= screen.height - edge_error_limit) { + return DIR_BOT; + } + return DIR_NONE; +} + +enum Direction edge_stop_move_direction(movement *m) { + for (size_t i=0; i= min_edge_distance)) { + return discern_direction(m[i].start); + } + } + return DIR_NONE; +} + +//handle touchscreen down event +void handle_touch_event_down(struct libinput_event *event, struct movement *m) { + get_screen_info(event); + struct libinput_event_touch *tevent = libinput_event_get_touch_event(event); + int32_t slot = libinput_event_touch_get_slot(tevent); + m[slot].start.x = libinput_event_touch_get_x_transformed(tevent, screen.width); + m[slot].start.y = libinput_event_touch_get_y_transformed(tevent, screen.height); + m[slot].t_start = libinput_event_touch_get_time_usec(tevent); + m[slot].end.x = m[slot].start.x; + m[slot].end.y = m[slot].start.y; + m[slot].t_end = m[slot].t_start; + m[slot].down = true; + + update_first_point_relative_coordinate(m[slot].start.x, m[slot].start.y); + update_last_point_relative_coordinate(m[slot].end.x, m[slot].end.y); + + if (cur_touch_finger_num(m) == 1) + init_move_stop(m[slot]); //only support one finger +} + +//handle touchscreen up event +void handle_touch_event_up(struct libinput_event *event, struct movement *m) { + struct libinput_event_touch *tevent = libinput_event_get_touch_event(event); + int32_t slot = libinput_event_touch_get_slot(tevent); + m[slot].t_end = libinput_event_touch_get_time_usec(tevent); + m[slot].ready = true; + + if (cur_touch_finger_num(m) == 1) + check_move_stop_leave(m[slot]); + m[slot].down = false; +} + +//handle touchscreen cancel event +void handle_touch_event_cancel(struct libinput_event *event, struct movement *m) { + struct libinput_event_touch *tevent = libinput_event_get_touch_event(event); + int32_t slot = libinput_event_touch_get_slot(tevent); + m[slot].t_end = libinput_event_touch_get_time_usec(tevent); + m[slot].ready = false; + + if (cur_touch_finger_num(m) == 1) + check_move_stop_leave(m[slot]); + + m[slot].down = false; +} + +//handle touchscreen motion event +void handle_touch_event_motion(struct libinput_event *event, struct movement *m) { + struct libinput_event_touch *tevent = libinput_event_get_touch_event(event); + int32_t slot = libinput_event_touch_get_slot(tevent); + m[slot].end.x = libinput_event_touch_get_x_transformed(tevent, screen.width); + m[slot].end.y = libinput_event_touch_get_y_transformed(tevent, screen.height); + m[slot].t_end = libinput_event_touch_get_time_usec(tevent); + + update_last_point_relative_coordinate(m[slot].end.x, m[slot].end.y); + //check if borde move + edge_move_stop_direction = edge_stop_move_direction(m); //edge moving direction + + if (cur_touch_finger_num(m) == 1) { + update_move_stop(m[slot]); + + check_move_stop_time(m[slot]); + handleTouchMoving(m[slot].end.x / screen.width, m[slot].end.y / screen.height); + } +} + +// Get all movement slots that are currently ready +list *get_ready_movements(struct movement *m) { + list *ready = NULL; + for (size_t i = 0; i < MOV_SLOTS; i++) { + if (m[i].ready) { + if (ready == NULL) { + ready = list_new(&i, sizeof(i)); + } else { + list_append(ready, &i, sizeof(i)); + } + m[i].ready = false; + } + } + return ready; +} + +bool any_down(struct movement *m) { + for (size_t i = 0; i < MOV_SLOTS; i++){ + if (m[i].down) { + return true; + } + } + return false; +} + +////////////////////////////////////////////core +void print_gesture(gesture *g) { + printf("G(%d) T%d D%d\n", g->num, g->type, g->dir); +} + +int argmax(const size_t *arr, size_t len) { + size_t highest = 0; + int index = 0; + for (size_t i = 0; i < len; i++) { + if (arr[i] > highest) { + highest = arr[i]; + index = i; + } else if (arr[i] == highest) { + index = -1; + } + } + return index; +} + +//move direction +enum Direction movement_direction(movement *m, list *ready) { + enum Direction dir = 0; + size_t enum_votes[5] = {0}, i = 0; + // collect individually transformed directions + node *cur = ready->head; + while (cur != NULL) { + i = *((size_t *)cur->value); + enum_votes[angle_to_direction(movement_angle(m + i))]++; + cur = cur->next; + } + // check if multiple directions had the same maximum vote + if ((dir = argmax(enum_votes, 5)) < 0) { + dir = DIR_NONE; + } + return dir; +} + +//edge event move side +enum Direction edge_move_direction(movement *m, list *ready) { + movement *cm; + point start; + node *cur = ready->head; + while (cur != NULL) { + cm = (m + *((size_t *)cur->value)); + start = cm->start; + if (movement_length(cm) >= min_edge_distance) { + return discern_direction(start); + } + cur = cur->next; + } + return DIR_NONE; +} + +//get touchscreeen gesture info +gesture get_gesture(movement *m, list *ready) { + gesture g = {0}; + g.num = list_len(ready); + g.dir = movement_direction(m, ready); + enum Direction edge_dir; + if (g.dir == DIR_NONE) { + g.type = GT_TAP; + } else if (g.num > 1) { + g.type = GT_MOVEMENT; + } else if (g.num == 1) { + edge_dir = edge_move_direction(m, ready); + if (edge_dir != DIR_NONE) { + g.type = GT_EDGE; + g.dir = edge_dir; + } else { + g.type = GT_MOVEMENT; + } + } + return g; +} + +//handle touchscreen gestrue event +void handle_movements(movement *m) { + //TODO skip if some fingers are still on the screen + int distance = 0; + list *ready = get_ready_movements(m); + if (ready == NULL) { + return; + } + logger("Handle movements: begin\n"); + gesture g = get_gesture(m, ready); + logger("Handle movements: got gesture\n"); + print_gesture(&g); + + handleTouchScreenEvent((int)g.type, (int)g.dir, g.num, start_point_scale.x, start_point_scale.y, last_point_scale.x, last_point_scale.y); + + list_destroy(ready); + logger("Handle movements: end\n"); +} + +//get the physical size of a device in mm +void get_screen_info(struct libinput_event *event) { + struct libinput_device *dev = libinput_event_get_device(event); + double w, h; + libinput_device_get_size(dev, &w, &h); + screen.width = w; + screen.height = h; +} diff --git a/system/gesture/touchscreen_core.h b/system/gesture1/touchscreen_core.h similarity index 100% rename from system/gesture/touchscreen_core.h rename to system/gesture1/touchscreen_core.h diff --git a/system/gesture/utils.c b/system/gesture1/utils.c similarity index 100% rename from system/gesture/utils.c rename to system/gesture1/utils.c diff --git a/system/gesture/utils.h b/system/gesture1/utils.h similarity index 100% rename from system/gesture/utils.h rename to system/gesture1/utils.h diff --git a/system/hostname/hostname.go b/system/hostname/hostname.go index ba4195a15..59da69336 100644 --- a/system/hostname/hostname.go +++ b/system/hostname/hostname.go @@ -12,11 +12,11 @@ import ( "path/filepath" "strings" - hostname1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.hostname1" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + "github.com/linuxdeepin/dde-daemon/loader" + hostname1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.hostname1" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/log" - "github.com/linuxdeepin/dde-daemon/loader" ) type Module struct { diff --git a/system/inputdevices/daemon.go b/system/inputdevices1/daemon.go similarity index 87% rename from system/inputdevices/daemon.go rename to system/inputdevices1/daemon.go index c55d34fcc..364e4f47f 100644 --- a/system/inputdevices/daemon.go +++ b/system/inputdevices1/daemon.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package inputdevices +package inputdevices1 import ( "github.com/linuxdeepin/dde-daemon/loader" @@ -13,9 +13,9 @@ import ( var logger = log.NewLogger("daemon/system/inputdevices") const ( - dbusServiceName = "com.deepin.system.InputDevices" - dbusPath = "/com/deepin/system/InputDevices" - dbusInterface = "com.deepin.system.InputDevices" + dbusServiceName = "org.deepin.dde.InputDevices1" + dbusPath = "/org/deepin/dde/InputDevices1" + dbusInterface = dbusServiceName ) func init() { diff --git a/system/inputdevices/dde-libinput.c b/system/inputdevices1/dde-libinput.c similarity index 100% rename from system/inputdevices/dde-libinput.c rename to system/inputdevices1/dde-libinput.c diff --git a/system/inputdevices/dde-libinput.h b/system/inputdevices1/dde-libinput.h similarity index 100% rename from system/inputdevices/dde-libinput.h rename to system/inputdevices1/dde-libinput.h diff --git a/system/inputdevices/exported_methods_auto.go b/system/inputdevices1/exported_methods_auto.go similarity index 96% rename from system/inputdevices/exported_methods_auto.go rename to system/inputdevices1/exported_methods_auto.go index 6698af90d..92f9c92bd 100644 --- a/system/inputdevices/exported_methods_auto.go +++ b/system/inputdevices1/exported_methods_auto.go @@ -1,6 +1,6 @@ // Code generated by "dbusutil-gen em -type InputDevices,Touchpad"; DO NOT EDIT. -package inputdevices +package inputdevices1 import ( "github.com/linuxdeepin/go-lib/dbusutil" diff --git a/system/inputdevices/inputdevices.go b/system/inputdevices1/inputdevices.go similarity index 95% rename from system/inputdevices/inputdevices.go rename to system/inputdevices1/inputdevices.go index de0a388a3..38bf3e439 100644 --- a/system/inputdevices/inputdevices.go +++ b/system/inputdevices1/inputdevices.go @@ -2,9 +2,10 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package inputdevices +package inputdevices1 import ( + "errors" "fmt" "io/ioutil" "os/exec" @@ -13,7 +14,7 @@ import ( "strings" "sync" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" configManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" "github.com/linuxdeepin/go-lib/dbusutil" dutils "github.com/linuxdeepin/go-lib/utils" @@ -86,6 +87,9 @@ func (m *InputDevices) init() { m.updateSupportWakeupDevices() if err := TouchpadExist(touchpadSwitchFile); err == nil { m.newTouchpad() + if m.dsgInputDevices == nil { + return + } v, err := m.dsgInputDevices.Value(0, _dsettingsTouchpadEnabledKey) if err != nil { logger.Warning(err) @@ -99,7 +103,7 @@ func (m *InputDevices) init() { }() } -//Note:由于数组默认长度为0,后面append时,需要重新申请内存和拷贝,所以效率较低 +// Note:由于数组默认长度为0,后面append时,需要重新申请内存和拷贝,所以效率较低 func getMapKeys(m map[string]string) []string { keys := []string{} for k := range m { @@ -160,6 +164,9 @@ func (m *InputDevices) tryApeendDsgData(list []string, key, value string) []stri } func (m *InputDevices) dsgSetValue(path, value string) error { + if m.dsgInputDevices == nil { + return errors.New("dsgInputDevices is nil") + } //获取旧的数据 v, err := m.dsgInputDevices.Value(0, _dsettingsDeviceWakeupStatusKey) if err != nil { @@ -234,20 +241,22 @@ func (m *InputDevices) initDSettings(sysBus *dbusutil.Service) { getDeviceWakeupStatusFunc() - //dsg配置数据改变 - m.dsgInputDevices.InitSignalExt(m.systemSigLoop, true) - _, err = m.dsgInputDevices.ConnectValueChanged(func(key string) { - if key == _dsettingsDeviceWakeupStatusKey { - getDeviceWakeupStatusFunc() - } - }) + if m.dsgInputDevices != nil { + //dsg配置数据改变 + m.dsgInputDevices.InitSignalExt(m.systemSigLoop, true) + _, err = m.dsgInputDevices.ConnectValueChanged(func(key string) { + if key == _dsettingsDeviceWakeupStatusKey { + getDeviceWakeupStatusFunc() + } + }) + } m.systemSigLoop.Start() if err != nil { logger.Warning(err) } } -//通过map不能将相同数据添加进去,append数据后计算map长度来确认重复数据 +// 通过map不能将相同数据添加进去,append数据后计算map长度来确认重复数据 func getDeleteData(truthValue, mapValue []string) (ret []string) { if len(truthValue) < len(mapValue) { tmpArr := make(map[string]int) diff --git a/system/inputdevices/inputdevices_dbusutil.go b/system/inputdevices1/inputdevices_dbusutil.go similarity index 97% rename from system/inputdevices/inputdevices_dbusutil.go rename to system/inputdevices1/inputdevices_dbusutil.go index 210898cd4..0e76f37c0 100644 --- a/system/inputdevices/inputdevices_dbusutil.go +++ b/system/inputdevices1/inputdevices_dbusutil.go @@ -1,9 +1,9 @@ // Code generated by "dbusutil-gen -type InputDevices inputdevices.go"; DO NOT EDIT. -package inputdevices +package inputdevices1 import ( - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" ) func (v *InputDevices) setPropTouchscreens(value []dbus.ObjectPath) (changed bool) { @@ -62,4 +62,4 @@ func (v *Touchpad) setPropIsExist(value bool) (changed bool) { func (v *Touchpad) emitPropChangedIsExist(value bool) error { return v.service.EmitPropertyChanged(v, "IsExist", value) -} \ No newline at end of file +} diff --git a/system/inputdevices/inputdevices_ifc.go b/system/inputdevices1/inputdevices_ifc.go similarity index 87% rename from system/inputdevices/inputdevices_ifc.go rename to system/inputdevices1/inputdevices_ifc.go index 268ff3e4e..2e13291fb 100644 --- a/system/inputdevices/inputdevices_ifc.go +++ b/system/inputdevices1/inputdevices_ifc.go @@ -2,10 +2,10 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package inputdevices +package inputdevices1 import ( - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" ) @@ -13,4 +13,3 @@ func (m *InputDevices) SetWakeupDevices(sender dbus.Sender, path string, value s err := m.setWakeupDevices(path, value) return dbusutil.ToError(err) } - diff --git a/system/inputdevices/inputdevices_test.go b/system/inputdevices1/inputdevices_test.go similarity index 95% rename from system/inputdevices/inputdevices_test.go rename to system/inputdevices1/inputdevices_test.go index b231c0237..883b404cf 100644 --- a/system/inputdevices/inputdevices_test.go +++ b/system/inputdevices1/inputdevices_test.go @@ -2,12 +2,12 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package inputdevices +package inputdevices1 import ( "testing" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/stretchr/testify/assert" ) diff --git a/system/inputdevices/libinput.go b/system/inputdevices1/libinput.go similarity index 98% rename from system/inputdevices/libinput.go rename to system/inputdevices1/libinput.go index 2a8bed1b6..ec468c9ae 100644 --- a/system/inputdevices/libinput.go +++ b/system/inputdevices1/libinput.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package inputdevices +package inputdevices1 // #cgo pkg-config: libinput libudev // #cgo CFLAGS: -W -Wall -fstack-protector-all -fPIC @@ -55,7 +55,7 @@ func handle_device_removed(event *C.struct_libinput_event, userdata unsafe.Point func notify_device_changed(event *C.struct_libinput_event, userdata unsafe.Pointer, state bool) { dev := C.libinput_event_get_device(event) - devName := C.GoString(C.libinput_device_get_name(dev)) + devName := C.GoString(C.libinput_device_get_name(dev)) udev := C.libinput_device_get_udev_device(dev) devNode := C.GoString(C.udev_device_get_devnode(udev)) devPath := C.GoString(C.udev_device_get_property_value(udev, C.CString("DEVPATH"))) diff --git a/system/inputdevices/libinput_test.go b/system/inputdevices1/libinput_test.go similarity index 95% rename from system/inputdevices/libinput_test.go rename to system/inputdevices1/libinput_test.go index e4f3d5d7d..827cc21e6 100644 --- a/system/inputdevices/libinput_test.go +++ b/system/inputdevices1/libinput_test.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package inputdevices +package inputdevices1 import ( "testing" diff --git a/system/inputdevices/touchpad.go b/system/inputdevices1/touchpad.go similarity index 90% rename from system/inputdevices/touchpad.go rename to system/inputdevices1/touchpad.go index c48e8263d..b4e0b76b5 100644 --- a/system/inputdevices/touchpad.go +++ b/system/inputdevices1/touchpad.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package inputdevices +package inputdevices1 import ( "errors" @@ -10,15 +10,15 @@ import ( "os" "strings" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" configManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" "github.com/linuxdeepin/go-lib/dbusutil" ) -const( - touchpadSwitchFile = "/proc/uos/touchpad_switch" - touchpadDBusPath = "/com/deepin/system/InputDevices/Touchpad" - touchpadDBusInterface = "com.deepin.system.InputDevices.Touchpad" +const ( + touchpadSwitchFile = "/proc/uos/touchpad_switch" + touchpadDBusPath = "/org/deepin/dde/InputDevices1/Touchpad" + touchpadDBusInterface = "org.deepin.dde.InputDevices1.Touchpad" ) type Touchpad struct { @@ -28,7 +28,7 @@ type Touchpad struct { } func newTouchpad(service *dbusutil.Service) *Touchpad { - t := &Touchpad { + t := &Touchpad{ service: service, } err := TouchpadExist(touchpadSwitchFile) @@ -71,13 +71,13 @@ func (t *Touchpad) setTouchpadEnable(enabled bool) error { arg = "disable" } err = ioutil.WriteFile(touchpadSwitchFile, []byte(arg), 0644) - if err != nil{ + if err != nil { logger.Warning(" ioutil.WriteFile err : ", err) return err } t.setPropEnable(enabled) err = setDsgConf(enabled) - if err != nil{ + if err != nil { logger.Warning(err) return err } @@ -124,7 +124,7 @@ func TouchpadExist(filePath string) error { _, err := os.Stat(touchpadSwitchFile) if err != nil { logger.Warning(err) - return err + return err } return nil } @@ -139,4 +139,4 @@ func (t *Touchpad) export(path dbus.ObjectPath) error { func (t *Touchpad) stopExport() error { return t.service.StopExport(t) -} \ No newline at end of file +} diff --git a/system/inputdevices/touchscreen.go b/system/inputdevices1/touchscreen.go similarity index 87% rename from system/inputdevices/touchscreen.go rename to system/inputdevices1/touchscreen.go index 50a585ecc..aeb2186da 100644 --- a/system/inputdevices/touchscreen.go +++ b/system/inputdevices1/touchscreen.go @@ -2,10 +2,10 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package inputdevices +package inputdevices1 import ( - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/utils" ) @@ -25,8 +25,8 @@ type Touchscreen struct { Height float64 } -const touchscreenDBusPath = "/com/deepin/system/InputDevices/Touchscreen/" -const touchscreenDBusInterface = "com.deepin.system.InputDevices.Touchscreen" +const touchscreenDBusPath = "/org/deepin/dde/InputDevices1/Touchscreen/" +const touchscreenDBusInterface = "org.deepin.dde.InputDevices1.Touchscreen" func newTouchscreen(dev *libinputDevice, service *dbusutil.Service, id uint32) *Touchscreen { t := &Touchscreen{ diff --git a/system/keyevent/daemon.go b/system/keyevent1/daemon.go similarity index 90% rename from system/keyevent/daemon.go rename to system/keyevent1/daemon.go index 6416b6e23..892fa720f 100644 --- a/system/keyevent/daemon.go +++ b/system/keyevent1/daemon.go @@ -2,16 +2,16 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package keyevent +package keyevent1 import ( - "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/dde-daemon/loader" + "github.com/linuxdeepin/go-lib/log" ) const ( - dbusServiceName = "com.deepin.daemon.KeyEvent" - dbusPath = "/com/deepin/daemon/KeyEvent" + dbusServiceName = "org.deepin.dde.KeyEvent1" + dbusPath = "/org/deepin/dde/KeyEvent1" dbusInterface = dbusServiceName ) diff --git a/system/keyevent/exported_methods_auto.go b/system/keyevent1/exported_methods_auto.go similarity index 91% rename from system/keyevent/exported_methods_auto.go rename to system/keyevent1/exported_methods_auto.go index d9d69eb7b..98e3528b6 100644 --- a/system/keyevent/exported_methods_auto.go +++ b/system/keyevent1/exported_methods_auto.go @@ -1,6 +1,6 @@ // Code generated by "dbusutil-gen em -type Manager"; DO NOT EDIT. -package keyevent +package keyevent1 import ( "github.com/linuxdeepin/go-lib/dbusutil" diff --git a/system/keyevent/keycode.go b/system/keyevent1/keycode.go similarity index 99% rename from system/keyevent/keycode.go rename to system/keyevent1/keycode.go index 9ab6c4121..9f010120b 100644 --- a/system/keyevent/keycode.go +++ b/system/keyevent1/keycode.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package keyevent +package keyevent1 // 按键码的值在内核定义: // https://github.com/torvalds/linux/blob/master/include/uapi/linux/input-event-codes.h diff --git a/system/keyevent/libinput_bridge.c b/system/keyevent1/libinput_bridge.c similarity index 100% rename from system/keyevent/libinput_bridge.c rename to system/keyevent1/libinput_bridge.c diff --git a/system/keyevent/libinput_bridge.go b/system/keyevent1/libinput_bridge.go similarity index 97% rename from system/keyevent/libinput_bridge.go rename to system/keyevent1/libinput_bridge.go index 539140b51..8bdf428a0 100644 --- a/system/keyevent/libinput_bridge.go +++ b/system/keyevent1/libinput_bridge.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package keyevent +package keyevent1 // #include "libinput_bridge.h" // #cgo pkg-config: libinput glib-2.0 @@ -10,7 +10,7 @@ package keyevent // #cgo CFLAGS: -W -Wall -fstack-protector-all -fPIC import "C" -//nolint +// nolint // 按键状态 const ( KEY_STATE_RELEASED = 0 // 松开 diff --git a/system/keyevent/libinput_bridge.h b/system/keyevent1/libinput_bridge.h similarity index 100% rename from system/keyevent/libinput_bridge.h rename to system/keyevent1/libinput_bridge.h diff --git a/system/keyevent/manager.go b/system/keyevent1/manager.go similarity index 95% rename from system/keyevent/manager.go rename to system/keyevent1/manager.go index 3ba06bb9b..0b90d47a2 100644 --- a/system/keyevent/manager.go +++ b/system/keyevent1/manager.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package keyevent +package keyevent1 import ( "errors" @@ -10,8 +10,8 @@ import ( "os" "strings" - "github.com/godbus/dbus" - inputdevices "github.com/linuxdeepin/go-dbus-factory/com.deepin.system.inputdevices" + "github.com/godbus/dbus/v5" + inputdevices "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.inputdevices1" "github.com/linuxdeepin/go-lib/dbusutil" ) @@ -83,7 +83,7 @@ func newManager(service *dbusutil.Service) *Manager { if err != nil { return m } - m.touchPad, err = inputdevices.NewTouchpad(sysBus, "/com/deepin/system/InputDevices/Touchpad") + m.touchPad, err = inputdevices.NewTouchpad(sysBus, "/org/deepin/dde/InputDevices1/Touchpad") if err != nil { logger.Warning(err) } diff --git a/system/keyevent/manager_test.go b/system/keyevent1/manager_test.go similarity index 97% rename from system/keyevent/manager_test.go rename to system/keyevent1/manager_test.go index fdc9c9cc6..decd76fdc 100644 --- a/system/keyevent/manager_test.go +++ b/system/keyevent1/manager_test.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package keyevent +package keyevent1 import "testing" diff --git a/system/keyevent/private_keycode.go b/system/keyevent1/private_keycode.go similarity index 93% rename from system/keyevent/private_keycode.go rename to system/keyevent1/private_keycode.go index 9760324a9..89b8e6f91 100644 --- a/system/keyevent/private_keycode.go +++ b/system/keyevent1/private_keycode.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package keyevent +package keyevent1 // 厂商适配非标准按键码 // nolint diff --git a/system/lang/lang.go b/system/lang/lang.go index bed69dbb1..a50a29e25 100644 --- a/system/lang/lang.go +++ b/system/lang/lang.go @@ -5,23 +5,20 @@ package lang import ( - "os" - "path/filepath" - "sync" - "syscall" - - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/loader" - accounts "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.accounts" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + accounts "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.accounts1" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/go-lib/strv" + "os" + "path/filepath" + "sync" ) const ( - langService = "com.deepin.system.Lang" + langService = "org.deepin.dde.Lang1" userLocaleConfigFile = ".config/locale.conf" userLocaleConfigFileTmp = ".config/.locale.conf" @@ -92,7 +89,7 @@ func (l *Lang) init() { l.loadSessionList() l.listenSystemSignals() - l.updateAllUserLocale(true) + l.updateAllUserLocale() } func (l *Lang) updateLocaleBySessionPath(_ string, sessionPath dbus.ObjectPath) { @@ -128,50 +125,11 @@ func (l *Lang) updateLocaleFile(tempLocaleFilePath, localeFilePath string) { } } -func (l *Lang) updateAllUserLocale(start bool) { - if !start { - return - } - manager := login1.NewManager(l.service.Conn()) - inhibit, err := manager.Inhibit(0, "shutdown", langService, "to write language config file", "delay") - if err != nil { - logger.Warning(err) - } - // handle login1 restart - dbusObj := ofdbus.NewDBus(l.service.Conn()) - sysLoop := dbusutil.NewSignalLoop(l.service.Conn(), 10) - sysLoop.Start() - dbusObj.InitSignalExt(sysLoop, true) - _, _ = dbusObj.ConnectNameOwnerChanged(func(name string, oldOwner string, newOwner string) { - if name == "org.freedesktop.login1" && newOwner != "" && oldOwner == "" { - if inhibit != -1 { // 如果之前存在inhibit时,login1重启需要重新inhibit - err := syscall.Close(int(inhibit)) - inhibit = -1 - if err != nil { - logger.Warning("failed to close fd:", err) - return - } - inhibit, err = manager.Inhibit(0, "shutdown", langService, "to write language config file", "delay") - if err != nil { - logger.Warning(err) - } - } - } - }) - defer func() { - dbusObj.RemoveAllHandlers() - }() - // end handle login1 restart - defer func() { - err = syscall.Close(int(inhibit)) - if err != nil { - logger.Warning(err) - } - }() - +func (l *Lang) updateAllUserLocale() { l.sessionPathHomeMapMu.Lock() defer l.sessionPathHomeMapMu.Unlock() for _, homeDir := range l.sessionPathHomeMap { + logger.Debug("update local in : ", homeDir) l.updateLocaleByHomeDir(homeDir) } } @@ -184,6 +142,7 @@ func (l *Lang) deleteSessionPathHomeMap(sessionPath dbus.ObjectPath) { func (l *Lang) addSessionMap(_ string, _ dbus.ObjectPath) { l.loadSessionList() + l.updateAllUserLocale() } func (l *Lang) listenSystemSignals() { @@ -201,12 +160,6 @@ func (l *Lang) listenSystemSignals() { if err != nil { logger.Warning(err) } - - // 关机时,更新所有用户的家目录语言 - _, err = manager.ConnectPrepareForShutdown(l.updateAllUserLocale) - if err != nil { - logger.Warning(err) - } } func (l *Lang) loadSessionList() { diff --git a/system/network/cherry.go b/system/network1/cherry.go similarity index 95% rename from system/network/cherry.go rename to system/network1/cherry.go index f6625f096..17845e1f3 100644 --- a/system/network/cherry.go +++ b/system/network1/cherry.go @@ -2,11 +2,11 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package network +package network1 import ( - "github.com/godbus/dbus" - nmdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.networkmanager" + "github.com/godbus/dbus/v5" + nmdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.networkmanager" ) type connectionData map[string]map[string]dbus.Variant @@ -102,7 +102,6 @@ func setSettingIP6ConfigMethod(data connectionData, value string) { setSettingKey(data, "ipv6", "method", value) } - func nmGetDeviceInterface(devPath dbus.ObjectPath) (devInterface string) { d, err := nmNewDevice(devPath) if err != nil { @@ -125,4 +124,4 @@ func nmNewDevice(devPath dbus.ObjectPath) (dev nmdbus.Device, err error) { return } return -} \ No newline at end of file +} diff --git a/system/network/config.go b/system/network1/config.go similarity index 98% rename from system/network/config.go rename to system/network1/config.go index 429b342cb..8c309039a 100644 --- a/system/network/config.go +++ b/system/network1/config.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package network +package network1 import ( "encoding/json" diff --git a/system/network/config_test.go b/system/network1/config_test.go similarity index 97% rename from system/network/config_test.go rename to system/network1/config_test.go index ae8058592..8cc30d27c 100644 --- a/system/network/config_test.go +++ b/system/network1/config_test.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package network +package network1 import ( "testing" diff --git a/system/network/exported_methods_auto.go b/system/network1/exported_methods_auto.go similarity index 97% rename from system/network/exported_methods_auto.go rename to system/network1/exported_methods_auto.go index e923e82d9..e665f03f2 100644 --- a/system/network/exported_methods_auto.go +++ b/system/network1/exported_methods_auto.go @@ -1,6 +1,6 @@ // Code generated by "dbusutil-gen em -type Network"; DO NOT EDIT. -package network +package network1 import ( "github.com/linuxdeepin/go-lib/dbusutil" diff --git a/system/network/network.go b/system/network1/network.go similarity index 97% rename from system/network/network.go rename to system/network1/network.go index 62c1c2a24..a648488a3 100644 --- a/system/network/network.go +++ b/system/network1/network.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package network +package network1 import ( "errors" @@ -10,19 +10,19 @@ import ( "sync" "time" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/loader" - "github.com/linuxdeepin/dde-daemon/network/nm" - airplanemode "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.airplanemode" - networkmanager "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.networkmanager" + "github.com/linuxdeepin/dde-daemon/network1/nm" + airplanemode "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.airplanemode1" + networkmanager "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.networkmanager" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/proxy" "github.com/linuxdeepin/go-lib/log" ) const ( - dbusServiceName = "com.deepin.system.Network" - dbusPath = "/com/deepin/system/Network" + dbusServiceName = "org.deepin.dde.Network1" + dbusPath = "/org/deepin/dde/Network1" dbusInterface = dbusServiceName ) diff --git a/system/network/network_dbusutil.go b/system/network1/network_dbusutil.go similarity index 95% rename from system/network/network_dbusutil.go rename to system/network1/network_dbusutil.go index 5d22d054e..8adafc95c 100644 --- a/system/network/network_dbusutil.go +++ b/system/network1/network_dbusutil.go @@ -1,6 +1,6 @@ // Code generated by "dbusutil-gen -type Network network.go"; DO NOT EDIT. -package network +package network1 func (v *Network) setPropVpnEnabled(value bool) (changed bool) { if v.VpnEnabled != value { diff --git a/system/network/network_test.go b/system/network1/network_test.go similarity index 97% rename from system/network/network_test.go rename to system/network1/network_test.go index fb210b87f..23d7fab34 100644 --- a/system/network/network_test.go +++ b/system/network1/network_test.go @@ -2,12 +2,12 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package network +package network1 import ( "testing" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/stretchr/testify/assert" ) diff --git a/system/network/ping.go b/system/network1/ping.go similarity index 99% rename from system/network/ping.go rename to system/network1/ping.go index 86b3de3fa..e8502cf98 100644 --- a/system/network/ping.go +++ b/system/network1/ping.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package network +package network1 import ( "bytes" @@ -11,7 +11,7 @@ import ( "net" "time" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" ) diff --git a/system/network/ping_test.go b/system/network1/ping_test.go similarity index 98% rename from system/network/ping_test.go rename to system/network1/ping_test.go index 6be1eb426..236cdb7fc 100644 --- a/system/network/ping_test.go +++ b/system/network1/ping_test.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package network +package network1 import ( "testing" diff --git a/system/network/testdata/config.json b/system/network1/testdata/config.json similarity index 100% rename from system/network/testdata/config.json rename to system/network1/testdata/config.json diff --git a/system/network/testdata/config2.json b/system/network1/testdata/config2.json similarity index 100% rename from system/network/testdata/config2.json rename to system/network1/testdata/config2.json diff --git a/system/network/utils.go b/system/network1/utils.go similarity index 94% rename from system/network/utils.go rename to system/network1/utils.go index 9c24b4395..a7ae21c71 100644 --- a/system/network/utils.go +++ b/system/network1/utils.go @@ -2,7 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later -package network +package network1 // #cgo pkg-config: libudev // #cgo CFLAGS: -W -Wall -fstack-protector-all -fPIC @@ -12,8 +12,8 @@ import "C" import ( "os/exec" - "github.com/godbus/dbus" - networkmanager "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.networkmanager" + "github.com/godbus/dbus/v5" + networkmanager "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.networkmanager" ) func getSettingConnectionTimestamp(settings map[string]map[string]dbus.Variant) uint64 { diff --git a/system/network/utils_udev.c b/system/network1/utils_udev.c similarity index 100% rename from system/network/utils_udev.c rename to system/network1/utils_udev.c diff --git a/system/network/utils_udev.h b/system/network1/utils_udev.h similarity index 100% rename from system/network/utils_udev.h rename to system/network1/utils_udev.h diff --git a/system/power/battery.go b/system/power1/battery.go similarity index 99% rename from system/power/battery.go rename to system/power1/battery.go index 92d2b7b11..57bc340e7 100644 --- a/system/power/battery.go +++ b/system/power1/battery.go @@ -10,7 +10,7 @@ import ( "sync" "time" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-api/powersupply/battery" gudev "github.com/linuxdeepin/go-gir/gudev-1.0" "github.com/linuxdeepin/go-lib/dbusutil" diff --git a/system/power/battery_display.go b/system/power1/battery_display.go similarity index 100% rename from system/power/battery_display.go rename to system/power1/battery_display.go diff --git a/system/power/battery_display_test.go b/system/power1/battery_display_test.go similarity index 100% rename from system/power/battery_display_test.go rename to system/power1/battery_display_test.go diff --git a/system/power/battery_history.go b/system/power1/battery_history.go similarity index 100% rename from system/power/battery_history.go rename to system/power1/battery_history.go diff --git a/system/power/battery_history_test.go b/system/power1/battery_history_test.go similarity index 100% rename from system/power/battery_history_test.go rename to system/power1/battery_history_test.go diff --git a/system/power/battery_test.go b/system/power1/battery_test.go similarity index 100% rename from system/power/battery_test.go rename to system/power1/battery_test.go diff --git a/system/power/daemon.go b/system/power1/daemon.go similarity index 99% rename from system/power/daemon.go rename to system/power1/daemon.go index d6bc3c0c5..8ee4406ce 100644 --- a/system/power/daemon.go +++ b/system/power1/daemon.go @@ -8,7 +8,7 @@ import ( "sync" "time" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/loader" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/log" diff --git a/system/power/exported_methods_auto.go b/system/power1/exported_methods_auto.go similarity index 100% rename from system/power/exported_methods_auto.go rename to system/power1/exported_methods_auto.go diff --git a/system/power/lid_switch.go b/system/power1/lid_switch.go similarity index 100% rename from system/power/lid_switch.go rename to system/power1/lid_switch.go diff --git a/system/power/lid_switch_common.go b/system/power1/lid_switch_common.go similarity index 93% rename from system/power/lid_switch_common.go rename to system/power1/lid_switch_common.go index 1f30e207b..f0ab749ca 100644 --- a/system/power/lid_switch_common.go +++ b/system/power1/lid_switch_common.go @@ -19,8 +19,8 @@ import ( "syscall" "unsafe" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" upower "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.upower" + ofdbus "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.dbus" ) const ( @@ -47,7 +47,7 @@ func OFF(x int) int { return x % bitsPerLong } -//#define test_bit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1) +// #define test_bit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1) func testBit(bit int, array []int) bool { v := (array[LONG(bit)] >> uint(OFF(bit))) & 1 return v != 0 @@ -81,7 +81,8 @@ type InputEvent struct { } // Get a useful description for an input event. Example: -// event at 1347905437.435795, code 01, type 02, val 02 +// +// event at 1347905437.435795, code 01, type 02, val 02 func (ev *InputEvent) String() string { return fmt.Sprintf("event at %d.%d, code %02d, type %02d, val %02d", ev.Time.Sec, ev.Time.Usec, ev.Code, ev.Type, ev.Value) @@ -192,7 +193,13 @@ func (m *Manager) initLidSwitchByUPower() error { if err != nil { return err } - m.HasLidSwitch = true + + hasLidSwitch, err := uPowerObj.LidIsPresent().Get(0) + if err != nil { + return err + } + + m.HasLidSwitch = hasLidSwitch return nil } diff --git a/system/power/lid_switch_common_test.go b/system/power1/lid_switch_common_test.go similarity index 100% rename from system/power/lid_switch_common_test.go rename to system/power1/lid_switch_common_test.go diff --git a/system/power/lid_switch_sw.go b/system/power1/lid_switch_sw.go similarity index 100% rename from system/power/lid_switch_sw.go rename to system/power1/lid_switch_sw.go diff --git a/system/power/manager.go b/system/power1/manager.go similarity index 99% rename from system/power/manager.go rename to system/power1/manager.go index a847d6d40..3d60b42d1 100644 --- a/system/power/manager.go +++ b/system/power1/manager.go @@ -12,11 +12,11 @@ import ( "sync" "time" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-api/powersupply" "github.com/linuxdeepin/dde-api/powersupply/battery" ConfigManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" - DisplayManager "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.DisplayManager" + DisplayManager "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.DisplayManager" gudev "github.com/linuxdeepin/go-gir/gudev-1.0" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/strv" @@ -251,7 +251,7 @@ func (m *Manager) init() error { } func (m *Manager) initDsgConfig() error { - logger.Info("com.deepin.system.Power module start init dconfig.") + logger.Info("org.deepin.dde.Power1 module start init dconfig.") // dsg 配置 ds := ConfigManager.NewConfigManager(m.service.Conn()) diff --git a/system/power/manager_ifc.go b/system/power1/manager_ifc.go similarity index 95% rename from system/power/manager_ifc.go rename to system/power1/manager_ifc.go index 1288063a4..73b85880e 100644 --- a/system/power/manager_ifc.go +++ b/system/power1/manager_ifc.go @@ -8,13 +8,13 @@ import ( "errors" "fmt" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" ) const ( - dbusServiceName = "com.deepin.system.Power" - dbusPath = "/com/deepin/system/Power" + dbusServiceName = "org.deepin.dde.Power1" + dbusPath = "/org/deepin/dde/Power1" dbusInterface = dbusServiceName ) diff --git a/system/power/manager_powersave.go b/system/power1/manager_powersave.go similarity index 100% rename from system/power/manager_powersave.go rename to system/power1/manager_powersave.go diff --git a/system/power/power_dbusutil.go b/system/power1/power_dbusutil.go similarity index 100% rename from system/power/power_dbusutil.go rename to system/power1/power_dbusutil.go diff --git a/system/power/power_key_edit.go b/system/power1/power_key_edit.go similarity index 96% rename from system/power/power_key_edit.go rename to system/power1/power_key_edit.go index af5ab6fe1..35ab3cf78 100644 --- a/system/power/power_key_edit.go +++ b/system/power1/power_key_edit.go @@ -7,7 +7,7 @@ package power import ( "errors" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" ConfigManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" "github.com/linuxdeepin/go-lib/utils" ) diff --git a/system/power/power_key_edit_test.go b/system/power1/power_key_edit_test.go similarity index 99% rename from system/power/power_key_edit_test.go rename to system/power1/power_key_edit_test.go index ed7d9231d..f81cb7d64 100644 --- a/system/power/power_key_edit_test.go +++ b/system/power1/power_key_edit_test.go @@ -30,4 +30,4 @@ func Test_interfaceToArrayString(t *testing.T) { assert.Equal(t, arr, d.result) } -} \ No newline at end of file +} diff --git a/system/power/power_test.go b/system/power1/power_test.go similarity index 94% rename from system/power/power_test.go rename to system/power1/power_test.go index c61acc830..a6a9b415b 100644 --- a/system/power/power_test.go +++ b/system/power1/power_test.go @@ -7,7 +7,7 @@ package power import ( "testing" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/stretchr/testify/assert" ) diff --git a/system/power/testdata/scaling_available_governors b/system/power1/testdata/scaling_available_governors similarity index 100% rename from system/power/testdata/scaling_available_governors rename to system/power1/testdata/scaling_available_governors diff --git a/system/power/testdata/scaling_governor b/system/power1/testdata/scaling_governor similarity index 100% rename from system/power/testdata/scaling_governor rename to system/power1/testdata/scaling_governor diff --git a/system/power/testdata/scaling_governor2 b/system/power1/testdata/scaling_governor2 similarity index 100% rename from system/power/testdata/scaling_governor2 rename to system/power1/testdata/scaling_governor2 diff --git a/system/power/testdata/setGovernor/scaling_governor b/system/power1/testdata/setGovernor/scaling_governor similarity index 100% rename from system/power/testdata/setGovernor/scaling_governor rename to system/power1/testdata/setGovernor/scaling_governor diff --git a/system/power_manager/daemon.go b/system/power_manager1/daemon.go similarity index 90% rename from system/power_manager/daemon.go rename to system/power_manager1/daemon.go index f3abdbdc9..a560a58c4 100644 --- a/system/power_manager/daemon.go +++ b/system/power_manager1/daemon.go @@ -5,13 +5,13 @@ package power_manager import ( - "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/dde-daemon/loader" + "github.com/linuxdeepin/go-lib/log" ) const ( - dbusServiceName = "com.deepin.daemon.PowerManager" - dbusPath = "/com/deepin/daemon/PowerManager" + dbusServiceName = "org.deepin.dde.PowerManager1" + dbusPath = "/org/deepin/dde/PowerManager1" dbusInterface = dbusServiceName ) diff --git a/system/power_manager/exported_methods_auto.go b/system/power_manager1/exported_methods_auto.go similarity index 100% rename from system/power_manager/exported_methods_auto.go rename to system/power_manager1/exported_methods_auto.go diff --git a/system/power_manager/manager.go b/system/power_manager1/manager.go similarity index 95% rename from system/power_manager/manager.go rename to system/power_manager1/manager.go index 57003dd61..d0b85cba7 100644 --- a/system/power_manager/manager.go +++ b/system/power_manager1/manager.go @@ -8,8 +8,8 @@ import ( "os" "os/exec" - "github.com/godbus/dbus" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + "github.com/godbus/dbus/v5" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" "github.com/linuxdeepin/go-lib/dbusutil" ) diff --git a/system/power_manager/power_manager_dbusutil.go b/system/power_manager1/power_manager_dbusutil.go similarity index 100% rename from system/power_manager/power_manager_dbusutil.go rename to system/power_manager1/power_manager_dbusutil.go diff --git a/system/power_manager/utils.go b/system/power_manager1/utils.go similarity index 100% rename from system/power_manager/utils.go rename to system/power_manager1/utils.go diff --git a/system/swapsched/exported_methods_auto.go b/system/swapsched1/exported_methods_auto.go similarity index 100% rename from system/swapsched/exported_methods_auto.go rename to system/swapsched1/exported_methods_auto.go diff --git a/system/swapsched/swapsched.go b/system/swapsched1/swapsched.go similarity index 94% rename from system/swapsched/swapsched.go rename to system/swapsched1/swapsched.go index 6d7963102..3f97db370 100644 --- a/system/swapsched/swapsched.go +++ b/system/swapsched1/swapsched.go @@ -10,17 +10,17 @@ import ( "path/filepath" "time" - dbus "github.com/godbus/dbus" - login1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.login1" + dbus "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/loader" + login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1" "github.com/linuxdeepin/go-lib/cgroup" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/log" - "github.com/linuxdeepin/dde-daemon/loader" ) const ( - dbusServiceName = "com.deepin.daemon.SwapSchedHelper" - dbusPath = "/com/deepin/daemon/SwapSchedHelper" + dbusServiceName = "org.deepin.dde.SwapSchedHelper1" + dbusPath = "/org/deepin/dde/SwapSchedHelper1" dbusInterface = dbusServiceName ) diff --git a/system/systeminfo/exported_methods_auto.go b/system/systeminfo1/exported_methods_auto.go similarity index 100% rename from system/systeminfo/exported_methods_auto.go rename to system/systeminfo1/exported_methods_auto.go diff --git a/system/systeminfo/manager.go b/system/systeminfo1/manager.go similarity index 96% rename from system/systeminfo/manager.go rename to system/systeminfo1/manager.go index 8c02dcd20..324d865ad 100644 --- a/system/systeminfo/manager.go +++ b/system/systeminfo1/manager.go @@ -57,8 +57,8 @@ var _lshwContent = make(map[string]lshwClassContent) var _lshwContentMu sync.Mutex const ( - dbusServiceName = "com.deepin.system.SystemInfo" - dbusPath = "/com/deepin/system/SystemInfo" + dbusServiceName = "org.deepin.dde.SystemInfo1" + dbusPath = "/org/deepin/dde/SystemInfo1" dbusInterface = dbusServiceName KB = 1 << 10 @@ -103,6 +103,12 @@ func NewManager(service *dbusutil.Service) *Manager { var m = &Manager{ service: service, } + v, err := dmi.GetDMI() + if err != nil { + logger.Warning(err) + } else { + m.DMIInfo = *v + } return m } diff --git a/system/systeminfo/systeminfo.go b/system/systeminfo1/systeminfo.go similarity index 99% rename from system/systeminfo/systeminfo.go rename to system/systeminfo1/systeminfo.go index b56498ce5..9aaf24313 100644 --- a/system/systeminfo/systeminfo.go +++ b/system/systeminfo1/systeminfo.go @@ -5,7 +5,7 @@ package systeminfo import ( - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/log" "strings" diff --git a/system/systeminfo/systeminfo_dbusutil.go b/system/systeminfo1/systeminfo_dbusutil.go similarity index 100% rename from system/systeminfo/systeminfo_dbusutil.go rename to system/systeminfo1/systeminfo_dbusutil.go diff --git a/system/systeminfo/systeminfo_test.go b/system/systeminfo1/systeminfo_test.go similarity index 100% rename from system/systeminfo/systeminfo_test.go rename to system/systeminfo1/systeminfo_test.go diff --git a/system/timedated/exported_methods_auto.go b/system/timedate1/exported_methods_auto.go similarity index 100% rename from system/timedated/exported_methods_auto.go rename to system/timedate1/exported_methods_auto.go diff --git a/system/timedated/manager.go b/system/timedate1/manager.go similarity index 91% rename from system/timedated/manager.go rename to system/timedate1/manager.go index 26a6bd662..7bfb06beb 100644 --- a/system/timedated/manager.go +++ b/system/timedate1/manager.go @@ -5,18 +5,19 @@ package timedated import ( + "errors" "fmt" "os" "path/filepath" "strings" "sync" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" ConfigManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" - polkit "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.policykit1" - systemd1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.systemd1" - timedate1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.timedate1" - timesync1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.timesync1" + polkit "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.policykit1" + systemd1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.systemd1" + timedate1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.timedate1" + timesync1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.timesync1" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/keyfile" @@ -38,8 +39,8 @@ type Manager struct { } const ( - dbusServiceName = "com.deepin.daemon.Timedated" - dbusPath = "/com/deepin/daemon/Timedated" + dbusServiceName = "org.deepin.dde.Timedate1" + dbusPath = "/org/deepin/dde/Timedate1" dbusInterface = dbusServiceName timedate1ActionId = "org.freedesktop.timedate1.set-time" @@ -83,6 +84,9 @@ func (m *Manager) initDsgConfig() { } func (m *Manager) getDsgObsoleteNTPServer() string { + if m.dsManager == nil { + return "" + } v, err := m.dsManager.Value(0, dsettingsKeyObsoleteNTPServer) if err != nil { logger.Warning(err) @@ -93,6 +97,9 @@ func (m *Manager) getDsgObsoleteNTPServer() string { } func (m *Manager) getDsgNTPServer() string { + if m.dsManager == nil { + return "" + } v, err := m.dsManager.Value(0, dsettingsKeyNTPServer) if err != nil { logger.Warning(err) @@ -103,10 +110,16 @@ func (m *Manager) getDsgNTPServer() string { } func (m *Manager) setDsgObsoleteNTPServer(server string) error { + if m.dsManager == nil { + return errors.New("dsManager is nil") + } return m.dsManager.SetValue(0, dsettingsKeyObsoleteNTPServer, dbus.MakeVariant(server)) } func (m *Manager) setDsgNTPServer(server string) error { + if m.dsManager == nil { + return errors.New("dsManager is nil") + } return m.dsManager.SetValue(0, dsettingsKeyNTPServer, dbus.MakeVariant(server)) } diff --git a/system/timedated/manager_ifc.go b/system/timedate1/manager_ifc.go similarity index 97% rename from system/timedated/manager_ifc.go rename to system/timedate1/manager_ifc.go index 82c16a8d0..f3d9d2c5d 100644 --- a/system/timedated/manager_ifc.go +++ b/system/timedate1/manager_ifc.go @@ -7,8 +7,8 @@ package timedated import ( "os" - "github.com/godbus/dbus" - "github.com/linuxdeepin/dde-daemon/timedate/zoneinfo" + "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/timedate1/zoneinfo" "github.com/linuxdeepin/go-lib/dbusutil" ) diff --git a/system/timedated/timedated.go b/system/timedate1/timedated.go similarity index 100% rename from system/timedated/timedated.go rename to system/timedate1/timedated.go index 363a516cd..b63414cf6 100644 --- a/system/timedated/timedated.go +++ b/system/timedate1/timedated.go @@ -5,8 +5,8 @@ package timedated import ( - "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/dde-daemon/loader" + "github.com/linuxdeepin/go-lib/log" ) type Daemon struct { diff --git a/system/timedated/timedated_dbusutil.go b/system/timedate1/timedated_dbusutil.go similarity index 100% rename from system/timedated/timedated_dbusutil.go rename to system/timedate1/timedated_dbusutil.go diff --git a/system/uadp/aes.go b/system/uadp1/aes.go similarity index 100% rename from system/uadp/aes.go rename to system/uadp1/aes.go diff --git a/system/uadp/crypto.c b/system/uadp1/crypto.c similarity index 100% rename from system/uadp/crypto.c rename to system/uadp1/crypto.c diff --git a/system/uadp/crypto.go b/system/uadp1/crypto.go similarity index 100% rename from system/uadp/crypto.go rename to system/uadp1/crypto.go diff --git a/system/uadp/crypto.h b/system/uadp1/crypto.h similarity index 100% rename from system/uadp/crypto.h rename to system/uadp1/crypto.h diff --git a/system/uadp/crypto_test.go b/system/uadp1/crypto_test.go similarity index 100% rename from system/uadp/crypto_test.go rename to system/uadp1/crypto_test.go diff --git a/system/uadp/daemon.go b/system/uadp1/daemon.go similarity index 92% rename from system/uadp/daemon.go rename to system/uadp1/daemon.go index 9fb060de1..ef0665fdf 100644 --- a/system/uadp/daemon.go +++ b/system/uadp1/daemon.go @@ -5,13 +5,13 @@ package uadp import ( - "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/dde-daemon/loader" + "github.com/linuxdeepin/go-lib/log" ) const ( - dbusServiceName = "com.deepin.daemon.Uadp" - dbusPath = "/com/deepin/daemon/Uadp" + dbusServiceName = "org.deepin.dde.Uadp1" + dbusPath = "/org/deepin/dde/Uadp1" dbusInterface = dbusServiceName ) diff --git a/system/uadp/data_manager.go b/system/uadp1/data_manager.go similarity index 100% rename from system/uadp/data_manager.go rename to system/uadp1/data_manager.go diff --git a/system/uadp/data_manager_test.go b/system/uadp1/data_manager_test.go similarity index 100% rename from system/uadp/data_manager_test.go rename to system/uadp1/data_manager_test.go diff --git a/system/uadp/dde_tc.c b/system/uadp1/dde_tc.c similarity index 100% rename from system/uadp/dde_tc.c rename to system/uadp1/dde_tc.c diff --git a/system/uadp/dde_tc.h b/system/uadp1/dde_tc.h similarity index 100% rename from system/uadp/dde_tc.h rename to system/uadp1/dde_tc.h diff --git a/system/uadp/dde_tc_copy.h b/system/uadp1/dde_tc_copy.h similarity index 100% rename from system/uadp/dde_tc_copy.h rename to system/uadp1/dde_tc_copy.h diff --git a/system/uadp/exported_methods_auto.go b/system/uadp1/exported_methods_auto.go similarity index 100% rename from system/uadp/exported_methods_auto.go rename to system/uadp1/exported_methods_auto.go diff --git a/system/uadp/manager.go b/system/uadp1/manager.go similarity index 99% rename from system/uadp/manager.go rename to system/uadp1/manager.go index 354830b55..d33c3ecfc 100644 --- a/system/uadp/manager.go +++ b/system/uadp1/manager.go @@ -5,7 +5,7 @@ package uadp import ( - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/procfs" ) diff --git a/systeminfo/cache.go b/systeminfo1/cache.go similarity index 100% rename from systeminfo/cache.go rename to systeminfo1/cache.go diff --git a/systeminfo/cpu.go b/systeminfo1/cpu.go similarity index 81% rename from systeminfo/cpu.go rename to systeminfo1/cpu.go index fb65e5383..750df4426 100644 --- a/systeminfo/cpu.go +++ b/systeminfo1/cpu.go @@ -6,9 +6,9 @@ package systeminfo import ( "fmt" + "math" "strconv" "strings" - "math" ) const ( @@ -23,9 +23,36 @@ const ( lscpuKeyMaxMHz = "CPU max MHz" lscpuKeyModelName = "Model name" lscpuKeyCount = "CPU(s)" - compareAllowMin = 1e-6 + lscpuKeyCPUfamily = "CPU family" + lscpuKeyModel = "Model" + lscpuKeyStepping = "Stepping" + compareAllowMin = 1e-6 ) +func getProcessorByLscpuExt(data map[string]string, freq float64) (string, error) { + modelName, ok := data[lscpuKeyModelName] + if !ok { + return "", fmt.Errorf("can not find the key %q", lscpuKeyModelName) + } + + cpuCountStr, ok := data[lscpuKeyCount] + if !ok { + logger.Warningf("can not find the key %q", lscpuKeyCount) + return modelName, nil + } + + cpuCount, err := strconv.ParseInt(cpuCountStr, 10, 64) + if err != nil { + logger.Warning(err) + return modelName, nil + } + if strings.Contains(modelName, "Hz") { + return fmt.Sprintf("%s x %d", modelName, cpuCount), nil + } else { + return fmt.Sprintf("%s @ %.2fGHz x %d", modelName, freq, cpuCount), nil + } +} + func getProcessorByLscpu(data map[string]string) (string, error) { modelName, ok := data[lscpuKeyModelName] if !ok { @@ -56,9 +83,9 @@ func getCPUMaxMHzByLscpu(data map[string]string) (float64, error) { return strconv.ParseFloat(maxMHz, 64) } -//float数比较 +// float数比较 func isFloatEqual(f1, f2 float64) bool { - return math.Abs(f1 - f2) < compareAllowMin + return math.Abs(f1-f2) < compareAllowMin } func GetCPUInfo(file string) (string, error) { diff --git a/systeminfo/disk.go b/systeminfo1/disk.go similarity index 97% rename from systeminfo/disk.go rename to systeminfo1/disk.go index f7013bfc1..e0f15a250 100644 --- a/systeminfo/disk.go +++ b/systeminfo1/disk.go @@ -7,9 +7,10 @@ package systeminfo import ( "fmt" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" ) -//nolint + +// nolint type diskInfo struct { Drive dbus.ObjectPath // org.freedesktop.UDisks2.Block Drive MountPoints []string // org.freedesktop.UDisks2.Filesystem MountPoints diff --git a/systeminfo/distro.go b/systeminfo1/distro.go similarity index 100% rename from systeminfo/distro.go rename to systeminfo1/distro.go diff --git a/systeminfo/exported_methods_auto.go b/systeminfo1/exported_methods_auto.go similarity index 100% rename from systeminfo/exported_methods_auto.go rename to systeminfo1/exported_methods_auto.go diff --git a/systeminfo/info.go b/systeminfo1/info.go similarity index 91% rename from systeminfo/info.go rename to systeminfo1/info.go index 6c10de2ad..cad078ba5 100644 --- a/systeminfo/info.go +++ b/systeminfo1/info.go @@ -8,11 +8,11 @@ import ( "sync" "time" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/dde-daemon/common/cpuinfo" "github.com/linuxdeepin/dde-daemon/loader" - systeminfo "github.com/linuxdeepin/go-dbus-factory/com.deepin.system.systeminfo" ConfigManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager" + systeminfo "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.systeminfo1" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/log" ) @@ -20,8 +20,8 @@ import ( //go:generate dbusutil-gen em -type SystemInfo const ( - dbusServiceName = "com.deepin.daemon.SystemInfo" - dbusPath = "/com/deepin/daemon/SystemInfo" + dbusServiceName = "org.deepin.dde.SystemInfo1" + dbusPath = "/org/deepin/dde/SystemInfo1" dbusInterface = dbusServiceName dsettingsAppID = "org.deepin.dde.daemon" dsettingsSystemInfoName = "org.deepin.dde.daemon.systeminfo" @@ -125,7 +125,7 @@ func (d *Daemon) initSysSystemInfo() { d.sigSystemLoop.Start() d.systeminfo.InitSignalExt(d.sigSystemLoop, true) - // 通过 demicode 获取 "CPU 频率", 接收 com.deepin.daemon.SystemInfo 的属性 CurrentSpeed 改变信号 + // 通过 demicode 获取 "CPU 频率", 接收 org.deepin.dde.SystemInfo1 的属性 CurrentSpeed 改变信号 err = d.systeminfo.CurrentSpeed().ConnectChanged(func(hasValue bool, value uint64) { logger.Infof("demicode hasValue : %t, CurrentSpeed : %d", hasValue, value) if !hasValue { @@ -240,6 +240,16 @@ func (info *SystemInfo) init() { } } + // 适配兆芯KX-7000 + if lscpuRes[lscpuKeyCPUfamily] == "7" && + lscpuRes[lscpuKeyModel] == "107" && + lscpuRes[lscpuKeyStepping] == "1" { + info.Processor, err = getProcessorByLscpuExt(lscpuRes, info.CPUMaxMHz/1000) + if err != nil { + logger.Warning(err) + } + } + if info.Processor == "" { info.Processor, err = getProcessorByLscpu(lscpuRes) if err != nil { diff --git a/systeminfo/info_test.go b/systeminfo1/info_test.go similarity index 100% rename from systeminfo/info_test.go rename to systeminfo1/info_test.go diff --git a/systeminfo/init.go b/systeminfo1/init.go similarity index 100% rename from systeminfo/init.go rename to systeminfo1/init.go diff --git a/systeminfo/lsblk_disk.go b/systeminfo1/lsblk_disk.go similarity index 100% rename from systeminfo/lsblk_disk.go rename to systeminfo1/lsblk_disk.go index 7588d409c..4aa50cef5 100644 --- a/systeminfo/lsblk_disk.go +++ b/systeminfo1/lsblk_disk.go @@ -5,9 +5,9 @@ package systeminfo import ( - "fmt" "crypto/sha256" "encoding/json" + "fmt" "os/exec" "strconv" "strings" diff --git a/systeminfo/testdata/arm-cpuinfo b/systeminfo1/testdata/arm-cpuinfo similarity index 100% rename from systeminfo/testdata/arm-cpuinfo rename to systeminfo1/testdata/arm-cpuinfo diff --git a/systeminfo/testdata/cpuinfo b/systeminfo1/testdata/cpuinfo similarity index 100% rename from systeminfo/testdata/cpuinfo rename to systeminfo1/testdata/cpuinfo diff --git a/systeminfo/testdata/deepin-version b/systeminfo1/testdata/deepin-version similarity index 100% rename from systeminfo/testdata/deepin-version rename to systeminfo1/testdata/deepin-version diff --git a/systeminfo/testdata/hw_kirin-cpuinfo b/systeminfo1/testdata/hw_kirin-cpuinfo similarity index 100% rename from systeminfo/testdata/hw_kirin-cpuinfo rename to systeminfo1/testdata/hw_kirin-cpuinfo diff --git a/systeminfo/testdata/loonson3-cpuinfo b/systeminfo1/testdata/loonson3-cpuinfo similarity index 100% rename from systeminfo/testdata/loonson3-cpuinfo rename to systeminfo1/testdata/loonson3-cpuinfo diff --git a/systeminfo/testdata/lsCPU b/systeminfo1/testdata/lsCPU similarity index 100% rename from systeminfo/testdata/lsCPU rename to systeminfo1/testdata/lsCPU diff --git a/systeminfo/testdata/lsb-release b/systeminfo1/testdata/lsb-release similarity index 100% rename from systeminfo/testdata/lsb-release rename to systeminfo1/testdata/lsb-release diff --git a/systeminfo/testdata/meminfo b/systeminfo1/testdata/meminfo similarity index 100% rename from systeminfo/testdata/meminfo rename to systeminfo1/testdata/meminfo diff --git a/systeminfo/testdata/sw-cpuinfo b/systeminfo1/testdata/sw-cpuinfo similarity index 100% rename from systeminfo/testdata/sw-cpuinfo rename to systeminfo1/testdata/sw-cpuinfo diff --git a/systeminfo/testdata/systeminfo.cache b/systeminfo1/testdata/systeminfo.cache similarity index 100% rename from systeminfo/testdata/systeminfo.cache rename to systeminfo1/testdata/systeminfo.cache diff --git a/systeminfo/utils.go b/systeminfo1/utils.go similarity index 93% rename from systeminfo/utils.go rename to systeminfo1/utils.go index ed17aeb89..01fa584c2 100644 --- a/systeminfo/utils.go +++ b/systeminfo1/utils.go @@ -37,7 +37,7 @@ func getMemoryFromFile(file string) (uint64, error) { return cap * 1024, nil } -//执行命令:/usr/bin/getconf LONG_BIT 获取系统位数 +// 执行命令:/usr/bin/getconf LONG_BIT 获取系统位数 func systemBit() string { output, err := exec.Command("/usr/bin/getconf", "LONG_BIT").Output() if err != nil { @@ -59,7 +59,7 @@ func runLscpu() (map[string]string, error) { lines := strings.Split(string(out), "\n") res := make(map[string]string, len(lines)) for _, line := range lines { - items := strings.Split(line, lscpuKeyDelim) + items := strings.SplitN(line, lscpuKeyDelim, 2) if len(items) != 2 { continue } diff --git a/systeminfo/version.go b/systeminfo1/version.go similarity index 100% rename from systeminfo/version.go rename to systeminfo1/version.go diff --git a/timedate/daemon.go b/timedate1/daemon.go similarity index 98% rename from timedate/daemon.go rename to timedate1/daemon.go index 074d0e5fe..e015d5596 100644 --- a/timedate/daemon.go +++ b/timedate1/daemon.go @@ -5,8 +5,8 @@ package timedate import ( - "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/dde-daemon/loader" + "github.com/linuxdeepin/go-lib/log" ) var ( @@ -15,7 +15,7 @@ var ( type Daemon struct { *loader.ModuleBase - manager *Manager + manager *Manager managerFormat *ManagerFormat } diff --git a/timedate/daemon_test.go b/timedate1/daemon_test.go similarity index 100% rename from timedate/daemon_test.go rename to timedate1/daemon_test.go diff --git a/timedate/exported_methods_auto.go b/timedate1/exported_methods_auto.go similarity index 100% rename from timedate/exported_methods_auto.go rename to timedate1/exported_methods_auto.go diff --git a/timedate/handle_event.go b/timedate1/handle_event.go similarity index 100% rename from timedate/handle_event.go rename to timedate1/handle_event.go diff --git a/timedate/init.go b/timedate1/init.go similarity index 100% rename from timedate/init.go rename to timedate1/init.go diff --git a/timedate/manager.go b/timedate1/manager.go similarity index 92% rename from timedate/manager.go rename to timedate1/manager.go index a41743d02..1d28bb6e7 100644 --- a/timedate/manager.go +++ b/timedate1/manager.go @@ -10,16 +10,16 @@ import ( "strings" "sync" - "github.com/godbus/dbus" - accounts "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.accounts" - timedated "github.com/linuxdeepin/go-dbus-factory/com.deepin.daemon.timedated" - timedate1 "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.timedate1" + "github.com/godbus/dbus/v5" + ddbus "github.com/linuxdeepin/dde-daemon/dbus" + "github.com/linuxdeepin/dde-daemon/session/common" + accounts "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.accounts1" + timedated "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.timedate1" + timedate1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.timedate1" "github.com/linuxdeepin/go-gir/gio-2.0" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/dbusutil/gsprop" "github.com/linuxdeepin/go-lib/dbusutil/proxy" - ddbus "github.com/linuxdeepin/dde-daemon/dbus" - "github.com/linuxdeepin/dde-daemon/session/common" ) const ( @@ -34,8 +34,8 @@ const ( settingsKeyLongTimeFormat = "long-time-format" settingsKeyWeekBegins = "week-begins" - dbusServiceName = "com.deepin.daemon.Timedate" - dbusPath = "/com/deepin/daemon/Timedate" + dbusServiceName = "org.deepin.dde.Timedate1" + dbusPath = "/org/deepin/dde/Timedate1" dbusInterface = dbusServiceName ) @@ -85,7 +85,7 @@ type Manager struct { settings *gio.Settings td timedate1.Timedate - setter timedated.Timedated + setter timedated.Timedate userObj accounts.User //nolint @@ -108,7 +108,7 @@ func NewManager(service *dbusutil.Service) (*Manager, error) { m.systemSigLoop = dbusutil.NewSignalLoop(sysBus, 10) m.td = timedate1.NewTimedate(sysBus) - m.setter = timedated.NewTimedated(sysBus) + m.setter = timedated.NewTimedate(sysBus) m.settings = gio.NewSettings(timeDateSchema) m.Use24HourFormat.Bind(m.settings, settingsKey24Hour) @@ -215,7 +215,7 @@ func (m *Manager) initUserObj(systemConn *dbus.Conn) { return } - err = common.ActivateSysDaemonService("com.deepin.daemon.Accounts") + err = common.ActivateSysDaemonService("org.deepin.dde.Accounts1") if err != nil { logger.Warning(err) } diff --git a/timedate/manager_format.go b/timedate1/manager_format.go similarity index 93% rename from timedate/manager_format.go rename to timedate1/manager_format.go index 886199674..ece68bc99 100644 --- a/timedate/manager_format.go +++ b/timedate1/manager_format.go @@ -9,16 +9,16 @@ import ( "strings" "sync" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/gettext" ) const ( - dbusFormatPath = "/com/deepin/daemon/Format" - dbusFormatInterface = "com.deepin.daemon.Format" - configManagerId = "org.desktopspec.ConfigManager" - dbusFormatServiceName = dbusFormatInterface + dbusFormatPath = "/org/deepin/dde/Format" + dbusFormatInterface = "org.deepin.dde.Format" + configManagerId = "org.desktopspec.ConfigManager" + dbusFormatServiceName = dbusFormatInterface ) //go:generate dbusutil-gen -type ManagerFormat manager_format.go @@ -31,12 +31,12 @@ type ManagerFormat struct { PropsMu sync.RWMutex // dsg config - CurrencySymbol string `prop:"access:rw"` + CurrencySymbol string `prop:"access:rw"` PositiveCurrencyFormat string `prop:"access:rw"` NegativeCurrencyFormat string `prop:"access:rw"` - DecimalSymbol string `prop:"access:rw"` - DigitGroupingSymbol string `prop:"access:rw"` - DigitGrouping string `prop:"access:rw"` + DecimalSymbol string `prop:"access:rw"` + DigitGroupingSymbol string `prop:"access:rw"` + DigitGrouping string `prop:"access:rw"` configManagerPath dbus.ObjectPath } @@ -82,7 +82,7 @@ func newManagerFormat(service *dbusutil.Service) (*ManagerFormat, error) { logger.Infof(" [newManagerFormat] space : %v, decimalSymbol : %v", space, decimalSymbol) if decimalSymbol == string("Space") || decimalSymbol == space { - if m.setPropDecimalSymbol(space){ + if m.setPropDecimalSymbol(space) { m.setDsgData("decimalSymbol", space) } } @@ -251,7 +251,7 @@ func (m *ManagerFormat) getDsgData(key string) string { } systemConnObj := systemConn.Object("org.desktopspec.ConfigManager", m.configManagerPath) var value string - err = systemConnObj.Call("org.desktopspec.ConfigManager.Manager.value",0, key).Store(&value) + err = systemConnObj.Call("org.desktopspec.ConfigManager.Manager.value", 0, key).Store(&value) if err != nil { logger.Warningf("getDsgData key : %s. err : %s", key, err) return "" @@ -267,7 +267,7 @@ func (m *ManagerFormat) setDsgData(key, value string) bool { return false } systemConnObj := systemConn.Object("org.desktopspec.ConfigManager", m.configManagerPath) - err = systemConnObj.Call("org.desktopspec.ConfigManager.Manager.setValue",0, key, dbus.MakeVariant(value)).Store() + err = systemConnObj.Call("org.desktopspec.ConfigManager.Manager.setValue", 0, key, dbus.MakeVariant(value)).Store() if err != nil { logger.Warningf("setDsgData key : %s. err : %s", key, err) return false @@ -275,4 +275,4 @@ func (m *ManagerFormat) setDsgData(key, value string) bool { logger.Infof("setDsgData key : %s , value : %s", key, value) return true -} \ No newline at end of file +} diff --git a/timedate/manager_ifc.go b/timedate1/manager_ifc.go similarity index 98% rename from timedate/manager_ifc.go rename to timedate1/manager_ifc.go index 0d7c9970f..03fd93407 100644 --- a/timedate/manager_ifc.go +++ b/timedate1/manager_ifc.go @@ -7,10 +7,10 @@ package timedate import ( "time" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/timedate1/zoneinfo" "github.com/linuxdeepin/go-lib/dbusutil" . "github.com/linuxdeepin/go-lib/gettext" - "github.com/linuxdeepin/dde-daemon/timedate/zoneinfo" ) func (m *Manager) Reset() *dbus.Error { diff --git a/timedate/manager_test.go b/timedate1/manager_test.go similarity index 100% rename from timedate/manager_test.go rename to timedate1/manager_test.go diff --git a/timedate/timedate_dbusutil.go b/timedate1/timedate_dbusutil.go similarity index 100% rename from timedate/timedate_dbusutil.go rename to timedate1/timedate_dbusutil.go diff --git a/timedate/timedate_format_dbusutil.go b/timedate1/timedate_format_dbusutil.go similarity index 100% rename from timedate/timedate_format_dbusutil.go rename to timedate1/timedate_format_dbusutil.go diff --git a/timedate/utils.go b/timedate1/utils.go similarity index 100% rename from timedate/utils.go rename to timedate1/utils.go diff --git a/timedate/utils_test.go b/timedate1/utils_test.go similarity index 100% rename from timedate/utils_test.go rename to timedate1/utils_test.go diff --git a/timedate/zoneinfo/testdata/dst_data b/timedate1/zoneinfo/testdata/dst_data similarity index 100% rename from timedate/zoneinfo/testdata/dst_data rename to timedate1/zoneinfo/testdata/dst_data diff --git a/timedate/zoneinfo/testdata/zone1970.tab b/timedate1/zoneinfo/testdata/zone1970.tab similarity index 100% rename from timedate/zoneinfo/testdata/zone1970.tab rename to timedate1/zoneinfo/testdata/zone1970.tab diff --git a/timedate/zoneinfo/timestamp.c b/timedate1/zoneinfo/timestamp.c similarity index 100% rename from timedate/zoneinfo/timestamp.c rename to timedate1/zoneinfo/timestamp.c diff --git a/timedate/zoneinfo/timestamp.h b/timedate1/zoneinfo/timestamp.h similarity index 100% rename from timedate/zoneinfo/timestamp.h rename to timedate1/zoneinfo/timestamp.h diff --git a/timedate/zoneinfo/wrapper.go b/timedate1/zoneinfo/wrapper.go similarity index 100% rename from timedate/zoneinfo/wrapper.go rename to timedate1/zoneinfo/wrapper.go diff --git a/timedate/zoneinfo/zdump.c b/timedate1/zoneinfo/zdump.c similarity index 100% rename from timedate/zoneinfo/zdump.c rename to timedate1/zoneinfo/zdump.c diff --git a/timedate/zoneinfo/zdump.h b/timedate1/zoneinfo/zdump.h similarity index 100% rename from timedate/zoneinfo/zdump.h rename to timedate1/zoneinfo/zdump.h diff --git a/timedate/zoneinfo/zone.go b/timedate1/zoneinfo/zone.go similarity index 100% rename from timedate/zoneinfo/zone.go rename to timedate1/zoneinfo/zone.go diff --git a/timedate/zoneinfo/zone_test.go b/timedate1/zoneinfo/zone_test.go similarity index 100% rename from timedate/zoneinfo/zone_test.go rename to timedate1/zoneinfo/zone_test.go diff --git a/trayicon/daemon.go b/trayicon1/daemon.go similarity index 98% rename from trayicon/daemon.go rename to trayicon1/daemon.go index 43aa13d77..760d9af27 100644 --- a/trayicon/daemon.go +++ b/trayicon1/daemon.go @@ -7,11 +7,11 @@ package trayicon import ( "os" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" + "github.com/linuxdeepin/dde-daemon/loader" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/log" x "github.com/linuxdeepin/go-x11-client" - "github.com/linuxdeepin/dde-daemon/loader" ) type Daemon struct { diff --git a/trayicon/daemon_test.go b/trayicon1/daemon_test.go similarity index 100% rename from trayicon/daemon_test.go rename to trayicon1/daemon_test.go diff --git a/trayicon/exported_methods_auto.go b/trayicon1/exported_methods_auto.go similarity index 93% rename from trayicon/exported_methods_auto.go rename to trayicon1/exported_methods_auto.go index 84ed11d8e..65ac7d934 100644 --- a/trayicon/exported_methods_auto.go +++ b/trayicon1/exported_methods_auto.go @@ -19,8 +19,8 @@ func (v *StatusNotifierWatcher) GetExportedMethods() dbusutil.ExportedMethods { InArgs: []string{"serviceOrPath"}, }, { - Name: "GetHostServiceName", - Fn: v.GetHostServiceName, + Name: "GetHostServiceName", + Fn: v.GetHostServiceName, OutArgs: []string{"hostName"}, }, } diff --git a/trayicon/icon.go b/trayicon1/icon.go similarity index 100% rename from trayicon/icon.go rename to trayicon1/icon.go diff --git a/trayicon/init.go b/trayicon1/init.go similarity index 100% rename from trayicon/init.go rename to trayicon1/init.go index 532e4f24f..de9563b4b 100644 --- a/trayicon/init.go +++ b/trayicon1/init.go @@ -10,8 +10,8 @@ import ( "github.com/linuxdeepin/go-x11-client/ext/damage" "github.com/linuxdeepin/go-x11-client/util/atom" - "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/dde-daemon/loader" + "github.com/linuxdeepin/go-lib/log" ) func init() { diff --git a/trayicon/status-notifier-watcher.go b/trayicon1/status-notifier-watcher.go similarity index 97% rename from trayicon/status-notifier-watcher.go rename to trayicon1/status-notifier-watcher.go index 3f4f820be..1c6017699 100644 --- a/trayicon/status-notifier-watcher.go +++ b/trayicon1/status-notifier-watcher.go @@ -10,8 +10,8 @@ import ( "strings" "sync" - dbus "github.com/godbus/dbus" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" + dbus "github.com/godbus/dbus/v5" + ofdbus "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.dbus" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/strv" ) diff --git a/trayicon/status-notifier-watcher_test.go b/trayicon1/status-notifier-watcher_test.go similarity index 94% rename from trayicon/status-notifier-watcher_test.go rename to trayicon1/status-notifier-watcher_test.go index 0baedac7b..14605ae78 100644 --- a/trayicon/status-notifier-watcher_test.go +++ b/trayicon1/status-notifier-watcher_test.go @@ -8,8 +8,8 @@ import ( "fmt" "testing" - dbus "github.com/godbus/dbus" - ofdbus "github.com/linuxdeepin/go-dbus-factory/org.freedesktop.dbus" + dbus "github.com/godbus/dbus/v5" + ofdbus "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.dbus" "github.com/stretchr/testify/assert" ) diff --git a/trayicon/tools.go b/trayicon1/tools.go similarity index 100% rename from trayicon/tools.go rename to trayicon1/tools.go diff --git a/trayicon/trayicon_dbusutil.go b/trayicon1/trayicon_dbusutil.go similarity index 100% rename from trayicon/trayicon_dbusutil.go rename to trayicon1/trayicon_dbusutil.go diff --git a/trayicon/traymanager.go b/trayicon1/traymanager.go similarity index 99% rename from trayicon/traymanager.go rename to trayicon1/traymanager.go index db0c6932c..057229a5e 100644 --- a/trayicon/traymanager.go +++ b/trayicon1/traymanager.go @@ -289,7 +289,7 @@ func (m *TrayManager) eventHandleLoop() { logger.Debug("ClientMessageEvent: system tray request dock", win) // 虚拟键盘注册插件时,任务栏调用XGetWindowProperty函数,wayland下会导致崩溃 // 此处过滤掉虚拟键盘的注册信号 - if (NewTrayIcon(win).getName() != "onboard") { + if NewTrayIcon(win).getName() != "onboard" { m.addIcon(win) } } diff --git a/trayicon/traymanager_ifc.go b/trayicon1/traymanager_ifc.go similarity index 91% rename from trayicon/traymanager_ifc.go rename to trayicon1/traymanager_ifc.go index f0010b87d..ac973a137 100644 --- a/trayicon/traymanager_ifc.go +++ b/trayicon1/traymanager_ifc.go @@ -7,15 +7,15 @@ package trayicon import ( "errors" - "github.com/godbus/dbus" + "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" x "github.com/linuxdeepin/go-x11-client" ) const ( - dbusServiceName = "com.deepin.dde.TrayManager" + dbusServiceName = "org.deepin.dde.TrayManager1" dbusInterface = dbusServiceName - dbusPath = "/com/deepin/dde/TrayManager" + dbusPath = "/org/deepin/dde/TrayManager1" ) func (*TrayManager) GetInterfaceName() string { diff --git a/trayicon/traymanager_ifc_test.go b/trayicon1/traymanager_ifc_test.go similarity index 100% rename from trayicon/traymanager_ifc_test.go rename to trayicon1/traymanager_ifc_test.go diff --git a/x_event_monitor/daemon.go b/x_event_monitor1/daemon.go similarity index 93% rename from x_event_monitor/daemon.go rename to x_event_monitor1/daemon.go index a83b570aa..ce28f9771 100644 --- a/x_event_monitor/daemon.go +++ b/x_event_monitor1/daemon.go @@ -8,13 +8,13 @@ import ( "os" "strings" - "github.com/linuxdeepin/go-lib/log" "github.com/linuxdeepin/dde-daemon/loader" + "github.com/linuxdeepin/go-lib/log" ) const ( - dbusServiceName = "com.deepin.api.XEventMonitor" - dbusPath = "/com/deepin/api/XEventMonitor" + dbusServiceName = "org.deepin.dde.XEventMonitor1" + dbusPath = "/org/deepin/dde/XEventMonitor1" dbusInterface = dbusServiceName moduleName = "x-event-monitor" ) diff --git a/x_event_monitor/daemon_test.go b/x_event_monitor1/daemon_test.go similarity index 100% rename from x_event_monitor/daemon_test.go rename to x_event_monitor1/daemon_test.go diff --git a/x_event_monitor/exported_methods_auto.go b/x_event_monitor1/exported_methods_auto.go similarity index 100% rename from x_event_monitor/exported_methods_auto.go rename to x_event_monitor1/exported_methods_auto.go diff --git a/x_event_monitor/manager.go b/x_event_monitor1/manager.go similarity index 95% rename from x_event_monitor/manager.go rename to x_event_monitor1/manager.go index cad47b47a..5e1701cb3 100644 --- a/x_event_monitor/manager.go +++ b/x_event_monitor1/manager.go @@ -10,7 +10,7 @@ import ( "fmt" "sync" - dbus "github.com/godbus/dbus" + dbus "github.com/godbus/dbus/v5" "github.com/linuxdeepin/go-lib/dbusutil" "github.com/linuxdeepin/go-lib/strv" dutils "github.com/linuxdeepin/go-lib/utils" @@ -141,15 +141,15 @@ const evMaskForHideCursor uint32 = input.XIEventMaskRawMotion | input.XIEventMas func (m *Manager) listenGlobalCursorPressed() error { sessionBus := m.service.Conn() logger.Debug("[test global key] sessionBus", sessionBus) - err := sessionBus.Object("com.deepin.daemon.KWayland", - "/com/deepin/daemon/KWayland/Output").AddMatchSignal("com.deepin.daemon.KWayland.Output", "ButtonPress").Err + err := sessionBus.Object("org.deepin.dde.KWayland1", + "/org/deepin/dde/KWayland1/Output").AddMatchSignal("org.deepin.dde.KWayland1.Output", "ButtonPress").Err if err != nil { logger.Warning(err) return err } m.sessionSigLoop.AddHandler(&dbusutil.SignalRule{ - Name: "com.deepin.daemon.KWayland.Output.ButtonPress", + Name: "org.deepin.dde.KWayland1.Output.ButtonPress", }, func(sig *dbus.Signal) { if len(sig.Body) > 1 { key := sig.Body[0].(uint32) @@ -175,15 +175,15 @@ func (m *Manager) listenGlobalCursorPressed() error { func (m *Manager) listenGlobalCursorRelease() error { sessionBus := m.service.Conn() - err := sessionBus.Object("com.deepin.daemon.KWayland", - "/com/deepin/daemon/KWayland/Output").AddMatchSignal("com.deepin.daemon.KWayland.Output", "ButtonRelease").Err + err := sessionBus.Object("org.deepin.dde.KWayland1", + "/org/deepin/dde/KWayland1/Output").AddMatchSignal("org.deepin.dde.KWayland1.Output", "ButtonRelease").Err if err != nil { logger.Warning(err) return err } m.sessionSigLoop.AddHandler(&dbusutil.SignalRule{ - Name: "com.deepin.daemon.KWayland.Output.ButtonRelease", + Name: "org.deepin.dde.KWayland1.Output.ButtonRelease", }, func(sig *dbus.Signal) { if len(sig.Body) > 1 { key := sig.Body[0].(uint32) @@ -210,15 +210,15 @@ func (m *Manager) listenGlobalCursorRelease() error { func (m *Manager) listenGlobalCursorMove() error { sessionBus := m.service.Conn() - err := sessionBus.Object("com.deepin.daemon.KWayland", - "/com/deepin/daemon/KWayland/Output").AddMatchSignal("com.deepin.daemon.KWayland.Output", "CursorMove").Err + err := sessionBus.Object("org.deepin.dde.KWayland1", + "/org/deepin/dde/KWayland1/Output").AddMatchSignal("org.deepin.dde.KWayland1.Output", "CursorMove").Err if err != nil { logger.Warning(err) return err } m.sessionSigLoop.AddHandler(&dbusutil.SignalRule{ - Name: "com.deepin.daemon.KWayland.Output.CursorMove", + Name: "org.deepin.dde.KWayland1.Output.CursorMove", }, func(sig *dbus.Signal) { if len(sig.Body) > 1 { x := sig.Body[0].(uint32) @@ -818,15 +818,15 @@ func (m *Manager) DebugGetPidAreasMap() (pidAreasMapJSON string, busErr *dbus.Er func (m *Manager) listenGlobalAxisChanged() error { sessionBus := m.service.Conn() - err := sessionBus.Object("com.deepin.daemon.KWayland", - "/com/deepin/daemon/KWayland/Output").AddMatchSignal("com.deepin.daemon.KWayland.Output", "AxisChanged").Err + err := sessionBus.Object("org.deepin.dde.KWayland1", + "/org/deepin/dde/KWayland1/Output").AddMatchSignal("org.deepin.dde.KWayland1.Output", "AxisChanged").Err if err != nil { logger.Warning(err) return err } m.sessionSigLoop.AddHandler(&dbusutil.SignalRule{ - Name: "com.deepin.daemon.KWayland.Output.AxisChanged", + Name: "org.deepin.dde.KWayland1.Output.AxisChanged", }, func(sig *dbus.Signal) { if len(sig.Body) > 1 { x := sig.Body[1].(float64) diff --git a/x_event_monitor/manager_test.go b/x_event_monitor1/manager_test.go similarity index 99% rename from x_event_monitor/manager_test.go rename to x_event_monitor1/manager_test.go index 0952f110b..b722b417e 100644 --- a/x_event_monitor/manager_test.go +++ b/x_event_monitor1/manager_test.go @@ -91,4 +91,4 @@ func Test_DebugGetPidAreasMap(t *testing.T) { assert.Nil(t, err) assert.Equal(t, expectRtn, rtnStr) fmt.Printf("rtnStr:%s\n", rtnStr) -} \ No newline at end of file +} diff --git a/x_event_monitor/mousearea_test.go b/x_event_monitor1/mousearea_test.go similarity index 100% rename from x_event_monitor/mousearea_test.go rename to x_event_monitor1/mousearea_test.go diff --git a/x_event_monitor/utils.go b/x_event_monitor1/utils.go similarity index 86% rename from x_event_monitor/utils.go rename to x_event_monitor1/utils.go index d71d71793..4baa61931 100644 --- a/x_event_monitor/utils.go +++ b/x_event_monitor1/utils.go @@ -5,7 +5,7 @@ package x_event_monitor const ( - MotionFlag = int32(1) //当此标志为1, 则鼠标在册注区域中移动时,会实时发送鼠标位置信号 + MotionFlag = int32(1) //当此标志为1, 则鼠标在册注区域中移动时,会实时发送鼠标位置信号 ButtonFlag = int32(1 << 1) KeyFlag = int32(1 << 2) ) diff --git a/x_event_monitor/utils_test.go b/x_event_monitor1/utils_test.go similarity index 66% rename from x_event_monitor/utils_test.go rename to x_event_monitor1/utils_test.go index 03c5437ea..33caa51e5 100644 --- a/x_event_monitor/utils_test.go +++ b/x_event_monitor1/utils_test.go @@ -9,46 +9,46 @@ import ( "testing" ) -func Test_hasMotionFlag (t *testing.T) { +func Test_hasMotionFlag(t *testing.T) { var flag = []int32{0, 1} assert.False(t, hasMotionFlag(flag[0])) assert.True(t, hasMotionFlag(flag[1])) } -func Test_hasKeyFlag (t *testing.T) { +func Test_hasKeyFlag(t *testing.T) { var flag = []int32{1, 4} assert.False(t, hasKeyFlag(flag[0])) assert.True(t, hasKeyFlag(flag[1])) } -func Test_hasButtonFlag (t *testing.T) { +func Test_hasButtonFlag(t *testing.T) { var flag = []int32{1, 2} assert.False(t, hasButtonFlag(flag[0])) assert.True(t, hasButtonFlag(flag[1])) } -func Test_isInArea (t *testing.T) { - var area = coordinateRange { +func Test_isInArea(t *testing.T) { + var area = coordinateRange{ X1: 100, X2: 200, Y1: 100, Y2: 200, } - var x = []int32 {99, 101} - var y = []int32 {99, 101} + var x = []int32{99, 101} + var y = []int32{99, 101} assert.True(t, isInArea(x[1], y[1], area)) assert.False(t, isInArea(x[0], y[0], area)) } -func Test_isInIdList (t *testing.T) { - var list = []string {"tongxinruanjian","tongshenruanjian"} - var md5str = []string {"tongxinruanjian","tongxin"} +func Test_isInIdList(t *testing.T) { + var list = []string{"tongxinruanjian", "tongshenruanjian"} + var md5str = []string{"tongxinruanjian", "tongxin"} assert.True(t, isInIdList(md5str[0], list)) assert.False(t, isInIdList(md5str[1], list)) -} \ No newline at end of file +}