diff -Nru kylin-ipmsg-1.3.1.2/data/translations/kylin-ipmsg_ar.ts kylin-ipmsg-1.3.1.2/data/translations/kylin-ipmsg_ar.ts --- kylin-ipmsg-1.3.1.2/data/translations/kylin-ipmsg_ar.ts 1970-01-01 08:00:00.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/data/translations/kylin-ipmsg_ar.ts 2025-02-27 10:48:52.000000000 +0800 @@ -0,0 +1,662 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="ar"> +<context> + <name>BlankPage</name> + <message> + <location filename="../../src/view/friendlist/homepagesearch/blankpage.cpp" line="24"/> + <location filename="../../src/view/friendlist/homepagesearch/blankpage.cpp" line="71"/> + <source>No Information</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/homepagesearch/blankpage.cpp" line="66"/> + <source>No Relevant Contacts</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ChatMsg</name> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="145"/> + <source>Resend</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="146"/> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="147"/> + <source>Open</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="148"/> + <source>Open Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="149"/> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="984"/> + <source>Save As</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="150"/> + <source>Delete</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="151"/> + <source>Clear All</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="224"/> + <source>File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="233"/> + <source>Folder</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="242"/> + <source>Screen Shot</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="251"/> + <source>History Message</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="268"/> + <source>Send</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="528"/> + <source>Message send failed, please check whether IP connection is successful!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="641"/> + <source>Can not write file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="838"/> + <source>No such file or directory!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1004"/> + <source>Delete the currently selected message?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1007"/> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1035"/> + <source>No</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1084"/> + <source>folder</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1006"/> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1034"/> + <source>Yes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1032"/> + <source>Clear all current messages?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1054"/> + <source>Send Files</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1081"/> + <source>Send Folders</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ChatSearch</name> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="289"/> + <source>Delete</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear All</source> + <translation type="obsolete">清空聊天记录</translation> + </message> + <message> + <source>Search</source> + <translation type="vanished">搜索</translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="190"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="193"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="327"/> + <source>All</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="198"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="200"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="328"/> + <source>File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="204"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="209"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="329"/> + <source>Image/Video</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="214"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="216"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="330"/> + <source>Link</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="221"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="222"/> + <source>canael</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="227"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="232"/> + <source>sure</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="239"/> + <source>DeleteMenu</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="140"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="250"/> + <source>Batch delete</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="66"/> + <source>Chat content</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="141"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="252"/> + <source>Clear all messages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="162"/> + <source>Chat Content</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="290"/> + <source>Choose Delete</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="291"/> + <source>Open</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="292"/> + <source>Open Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="684"/> + <source>No such file or directory!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="745"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="979"/> + <source>Delete the currently selected message?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="748"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="786"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="982"/> + <source>No</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="747"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="785"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="981"/> + <source>Yes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="783"/> + <source>Clear all current messages?</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Control</name> + <message> + <source>Search</source> + <translation type="vanished">搜索</translation> + </message> + <message> + <location filename="../../src/controller/control.cpp" line="282"/> + <source>Anonymous</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FriendInfoWid</name> + <message> + <location filename="../../src/view/friendlist/friendinfowid.cpp" line="159"/> + <location filename="../../src/view/friendlist/friendinfowid.cpp" line="186"/> + <source>Messages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendinfowid.cpp" line="195"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendinfowid.cpp" line="225"/> + <source>Username</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendinfowid.cpp" line="234"/> + <source>IP Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendinfowid.cpp" line="244"/> + <source>Nickname</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendinfowid.cpp" line="343"/> + <source>Add</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FriendListView</name> + <message> + <location filename="../../src/view/friendlist/friendlist.cpp" line="96"/> + <source>Start Chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendlist.cpp" line="97"/> + <location filename="../../src/view/friendlist/friendlist.cpp" line="150"/> + <source>Set to Top</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendlist.cpp" line="98"/> + <source>Change Nickname</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendlist.cpp" line="99"/> + <source>View Info</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendlist.cpp" line="100"/> + <source>Delete Friend</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendlist.cpp" line="153"/> + <source>Cancel the Top</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>KyView</name> + <message> + <location filename="../../src/view/kyview.cpp" line="154"/> + <source>Messages</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LocalInfo</name> + <message> + <source>Search</source> + <translation type="vanished">搜索</translation> + </message> + <message> + <location filename="../../src/view/localinfo/localinfo.cpp" line="179"/> + <source>Modify Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localinfo.cpp" line="188"/> + <source>Open Directory</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LocalUpdateName</name> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="159"/> + <source>Set Username</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="160"/> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="211"/> + <source>Please enter username</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="163"/> + <source>Change nickname</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="164"/> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="213"/> + <source>Please enter friend nickname</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="167"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="172"/> + <source>Confirm</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="179"/> + <source>Skip</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="216"/> + <source>The length of user name is less than 20 words</source> + <translation></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="218"/> + <source>Please do not enter special characters</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../../src/view/trayicon/trayiconwid.cpp" line="121"/> + <source>Settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/trayicon/trayiconwid.cpp" line="122"/> + <source>Quit</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SearchMsgDelegate</name> + <message> + <location filename="../../src/view/friendlist/homepagesearch/search_msg_delegate.cpp" line="47"/> + <source> relevant chat records</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SearchPage</name> + <message> + <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="125"/> + <source>Start Chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="126"/> + <source>Set to Top</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="127"/> + <source>Change Nickname</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="128"/> + <source>View Info</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="129"/> + <source>Delete Friend</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="167"/> + <source>Friend</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="171"/> + <source>Chat Record</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TitleBar</name> + <message> + <location filename="../../src/view/titlebar/titlebar.cpp" line="161"/> + <source>Minimize</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titlebar.cpp" line="162"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titlebar.cpp" line="165"/> + <source>Messages</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TitleSeting</name> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="103"/> + <source>File Save Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="116"/> + <location filename="../../src/view/titlebar/titleseting.cpp" line="236"/> + <source>Change Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="124"/> + <source>Clear All Chat Messages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="132"/> + <source>Clear the Cache</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Modified successfully</source> + <translation type="vanished">修改成功</translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="255"/> + <source>Modified Successfully</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="296"/> + <source>Clear all messages?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="299"/> + <location filename="../../src/view/titlebar/titleseting.cpp" line="326"/> + <source>No</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="298"/> + <location filename="../../src/view/titlebar/titleseting.cpp" line="327"/> + <source>Yes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="242"/> + <source>The save path can only be a dir under the home dir!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="310"/> + <source>Cleared</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="324"/> + <source>Clean the cache information such as images/videos/documents?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="340"/> + <location filename="../../src/view/titlebar/titleseting.cpp" line="364"/> + <source>Clean Up Complete</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clean up complete</source> + <translation type="vanished">清理完成</translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="391"/> + <location filename="../../src/view/titlebar/titleseting.cpp" line="398"/> + <location filename="../../src/view/titlebar/titleseting.cpp" line="406"/> + <source>Please do not save the file in this directory</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TrayIconWid</name> + <message> + <location filename="../../src/view/trayicon/trayiconwid.cpp" line="168"/> + <source>Ignore</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/trayicon/trayiconwid.cpp" line="135"/> + <location filename="../../src/view/trayicon/trayiconwid.cpp" line="179"/> + <source>Messages</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>menuModule</name> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="44"/> + <source>Options</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="58"/> + <location filename="../../src/view/titlebar/menumodule.cpp" line="141"/> + <source>Settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="60"/> + <location filename="../../src/view/titlebar/menumodule.cpp" line="139"/> + <source>Theme</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="62"/> + <location filename="../../src/view/titlebar/menumodule.cpp" line="137"/> + <source>Help</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="64"/> + <location filename="../../src/view/titlebar/menumodule.cpp" line="135"/> + <source>About</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="66"/> + <location filename="../../src/view/titlebar/menumodule.cpp" line="143"/> + <source>Quit</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="74"/> + <source>Follow the Theme</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="78"/> + <source>Light Theme</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="82"/> + <source>Dark Theme</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="194"/> + <source>Version: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="195"/> + <source>Message provides text chat and file transfer functions in the LAN. There is no need to build a server. It supports multiple people to interact at the same time and send and receive in parallel.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Service & Support: </source> + <translation type="vanished">服务与支持团队:</translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.h" line="68"/> + <source>Messages</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff -Nru kylin-ipmsg-1.3.1.2/data/translations/kylin-ipmsg_vi.ts kylin-ipmsg-1.3.1.2/data/translations/kylin-ipmsg_vi.ts --- kylin-ipmsg-1.3.1.2/data/translations/kylin-ipmsg_vi.ts 1970-01-01 08:00:00.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/data/translations/kylin-ipmsg_vi.ts 2025-02-27 10:48:52.000000000 +0800 @@ -0,0 +1,662 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="vi"> +<context> + <name>BlankPage</name> + <message> + <location filename="../../src/view/friendlist/homepagesearch/blankpage.cpp" line="24"/> + <location filename="../../src/view/friendlist/homepagesearch/blankpage.cpp" line="71"/> + <source>No Information</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/homepagesearch/blankpage.cpp" line="66"/> + <source>No Relevant Contacts</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ChatMsg</name> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="145"/> + <source>Resend</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="146"/> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="147"/> + <source>Open</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="148"/> + <source>Open Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="149"/> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="984"/> + <source>Save As</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="150"/> + <source>Delete</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="151"/> + <source>Clear All</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="224"/> + <source>File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="233"/> + <source>Folder</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="242"/> + <source>Screen Shot</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="251"/> + <source>History Message</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="268"/> + <source>Send</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="528"/> + <source>Message send failed, please check whether IP connection is successful!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="641"/> + <source>Can not write file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="838"/> + <source>No such file or directory!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1004"/> + <source>Delete the currently selected message?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1007"/> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1035"/> + <source>No</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1084"/> + <source>folder</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1006"/> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1034"/> + <source>Yes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1032"/> + <source>Clear all current messages?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1054"/> + <source>Send Files</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatmsg/chatmsg.cpp" line="1081"/> + <source>Send Folders</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ChatSearch</name> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="289"/> + <source>Delete</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear All</source> + <translation type="obsolete">清空聊天记录</translation> + </message> + <message> + <source>Search</source> + <translation type="vanished">搜索</translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="190"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="193"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="327"/> + <source>All</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="198"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="200"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="328"/> + <source>File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="204"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="209"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="329"/> + <source>Image/Video</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="214"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="216"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="330"/> + <source>Link</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="221"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="222"/> + <source>canael</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="227"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="232"/> + <source>sure</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="239"/> + <source>DeleteMenu</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="140"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="250"/> + <source>Batch delete</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="66"/> + <source>Chat content</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="141"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="252"/> + <source>Clear all messages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="162"/> + <source>Chat Content</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="290"/> + <source>Choose Delete</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="291"/> + <source>Open</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="292"/> + <source>Open Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="684"/> + <source>No such file or directory!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="745"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="979"/> + <source>Delete the currently selected message?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="748"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="786"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="982"/> + <source>No</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="747"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="785"/> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="981"/> + <source>Yes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/chatsearch/chat_search.cpp" line="783"/> + <source>Clear all current messages?</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Control</name> + <message> + <source>Search</source> + <translation type="vanished">搜索</translation> + </message> + <message> + <location filename="../../src/controller/control.cpp" line="282"/> + <source>Anonymous</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FriendInfoWid</name> + <message> + <location filename="../../src/view/friendlist/friendinfowid.cpp" line="159"/> + <location filename="../../src/view/friendlist/friendinfowid.cpp" line="186"/> + <source>Messages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendinfowid.cpp" line="195"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendinfowid.cpp" line="225"/> + <source>Username</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendinfowid.cpp" line="234"/> + <source>IP Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendinfowid.cpp" line="244"/> + <source>Nickname</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendinfowid.cpp" line="343"/> + <source>Add</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FriendListView</name> + <message> + <location filename="../../src/view/friendlist/friendlist.cpp" line="96"/> + <source>Start Chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendlist.cpp" line="97"/> + <location filename="../../src/view/friendlist/friendlist.cpp" line="150"/> + <source>Set to Top</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendlist.cpp" line="98"/> + <source>Change Nickname</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendlist.cpp" line="99"/> + <source>View Info</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendlist.cpp" line="100"/> + <source>Delete Friend</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/friendlist.cpp" line="153"/> + <source>Cancel the Top</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>KyView</name> + <message> + <location filename="../../src/view/kyview.cpp" line="154"/> + <source>Messages</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LocalInfo</name> + <message> + <source>Search</source> + <translation type="vanished">搜索</translation> + </message> + <message> + <location filename="../../src/view/localinfo/localinfo.cpp" line="179"/> + <source>Modify Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localinfo.cpp" line="188"/> + <source>Open Directory</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LocalUpdateName</name> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="159"/> + <source>Set Username</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="160"/> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="211"/> + <source>Please enter username</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="163"/> + <source>Change nickname</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="164"/> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="213"/> + <source>Please enter friend nickname</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="167"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="172"/> + <source>Confirm</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="179"/> + <source>Skip</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="216"/> + <source>The length of user name is less than 20 words</source> + <translation></translation> + </message> + <message> + <location filename="../../src/view/localinfo/localupdatename.cpp" line="218"/> + <source>Please do not enter special characters</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../../src/view/trayicon/trayiconwid.cpp" line="121"/> + <source>Settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/trayicon/trayiconwid.cpp" line="122"/> + <source>Quit</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SearchMsgDelegate</name> + <message> + <location filename="../../src/view/friendlist/homepagesearch/search_msg_delegate.cpp" line="47"/> + <source> relevant chat records</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SearchPage</name> + <message> + <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="125"/> + <source>Start Chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="126"/> + <source>Set to Top</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="127"/> + <source>Change Nickname</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="128"/> + <source>View Info</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="129"/> + <source>Delete Friend</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="167"/> + <source>Friend</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/friendlist/homepagesearch/searchpage.cpp" line="171"/> + <source>Chat Record</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TitleBar</name> + <message> + <location filename="../../src/view/titlebar/titlebar.cpp" line="161"/> + <source>Minimize</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titlebar.cpp" line="162"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titlebar.cpp" line="165"/> + <source>Messages</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TitleSeting</name> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="103"/> + <source>File Save Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="116"/> + <location filename="../../src/view/titlebar/titleseting.cpp" line="236"/> + <source>Change Directory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="124"/> + <source>Clear All Chat Messages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="132"/> + <source>Clear the Cache</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Modified successfully</source> + <translation type="vanished">修改成功</translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="255"/> + <source>Modified Successfully</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="296"/> + <source>Clear all messages?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="299"/> + <location filename="../../src/view/titlebar/titleseting.cpp" line="326"/> + <source>No</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="298"/> + <location filename="../../src/view/titlebar/titleseting.cpp" line="327"/> + <source>Yes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="242"/> + <source>The save path can only be a dir under the home dir!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="310"/> + <source>Cleared</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="324"/> + <source>Clean the cache information such as images/videos/documents?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="340"/> + <location filename="../../src/view/titlebar/titleseting.cpp" line="364"/> + <source>Clean Up Complete</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clean up complete</source> + <translation type="vanished">清理完成</translation> + </message> + <message> + <location filename="../../src/view/titlebar/titleseting.cpp" line="391"/> + <location filename="../../src/view/titlebar/titleseting.cpp" line="398"/> + <location filename="../../src/view/titlebar/titleseting.cpp" line="406"/> + <source>Please do not save the file in this directory</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TrayIconWid</name> + <message> + <location filename="../../src/view/trayicon/trayiconwid.cpp" line="168"/> + <source>Ignore</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/trayicon/trayiconwid.cpp" line="135"/> + <location filename="../../src/view/trayicon/trayiconwid.cpp" line="179"/> + <source>Messages</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>menuModule</name> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="44"/> + <source>Options</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="58"/> + <location filename="../../src/view/titlebar/menumodule.cpp" line="141"/> + <source>Settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="60"/> + <location filename="../../src/view/titlebar/menumodule.cpp" line="139"/> + <source>Theme</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="62"/> + <location filename="../../src/view/titlebar/menumodule.cpp" line="137"/> + <source>Help</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="64"/> + <location filename="../../src/view/titlebar/menumodule.cpp" line="135"/> + <source>About</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="66"/> + <location filename="../../src/view/titlebar/menumodule.cpp" line="143"/> + <source>Quit</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="74"/> + <source>Follow the Theme</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="78"/> + <source>Light Theme</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="82"/> + <source>Dark Theme</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="194"/> + <source>Version: </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.cpp" line="195"/> + <source>Message provides text chat and file transfer functions in the LAN. There is no need to build a server. It supports multiple people to interact at the same time and send and receive in parallel.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Service & Support: </source> + <translation type="vanished">服务与支持团队:</translation> + </message> + <message> + <location filename="../../src/view/titlebar/menumodule.h" line="68"/> + <source>Messages</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff -Nru kylin-ipmsg-1.3.1.2/debian/changelog kylin-ipmsg-1.3.1.2/debian/changelog --- kylin-ipmsg-1.3.1.2/debian/changelog 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/debian/changelog 2025-02-27 10:48:52.000000000 +0800 @@ -1,3 +1,12 @@ +kylin-ipmsg (1.3.1.2-ok16.16) nile; urgency=medium + + * BUG: 无 + * 需求号: 无 + * 其他改动说明: 同步最新代码 + * 其他改动影响域: 无 + + -- zhoudisi <zhoudisi@kylinos.cn> Thu, 27 Feb 2025 10:48:52 +0800 + kylin-ipmsg (1.3.1.2-ok16.15) nile; urgency=medium * BUG: 无 diff -Nru kylin-ipmsg-1.3.1.2/debian/control kylin-ipmsg-1.3.1.2/debian/control --- kylin-ipmsg-1.3.1.2/debian/control 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/debian/control 2025-02-27 10:48:52.000000000 +0800 @@ -40,5 +40,5 @@ Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} -Description: Messages - Messages is a LAN chat tool with beautiful Gui. +Description: a LAN chat tool + Messages is a LAN chat tool with beautiful Gui. It also supports text chat, screenshot, file transfer and other functions. diff -Nru kylin-ipmsg-1.3.1.2/kabase/Qt/windowmanage.hpp kylin-ipmsg-1.3.1.2/kabase/Qt/windowmanage.hpp --- kylin-ipmsg-1.3.1.2/kabase/Qt/windowmanage.hpp 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/kabase/Qt/windowmanage.hpp 2025-02-27 10:48:52.000000000 +0800 @@ -54,35 +54,35 @@ }; /* id 的初始值必须为 0 */ - static void getWindowId(quint32 *id) { + static void getWindowId(QString *id) { connect(kdk::WindowManager::self(), &kdk::WindowManager::windowAdded, [=](const kdk::WindowId &windowId) { - if (getpid() == (int)kdk::WindowManager::getPid(windowId) && *id == 0) { - *id = windowId.toLongLong(); + if (getpid() == (QString)kdk::WindowManager::getPid(windowId)) { + *id = windowId.toString(); } }); return; }; - static void keepWindowAbove(const quint32 id) { + static void keepWindowAbove(const QString id) { kdk::WindowManager::keepWindowAbove(id); return; }; - static void activateWindow(const quint32 id) { + static void activateWindow(const QString id) { kdk::WindowManager::activateWindow(id); return; } - static bool isActive(const quint32 id) { + static bool isActive(const QString id) { kdk::WindowInfo windowInfo = kdk::WindowManager::getwindowInfo(id); return windowInfo.isActive(); } - static bool isMinimized(const quint32 id) { + static bool isMinimized(const QString id) { kdk::WindowInfo windowInfo = kdk::WindowManager::getwindowInfo(id); return windowInfo.isMinimized(); @@ -97,4 +97,4 @@ * 2. exec字段为绝对路径 */ -#endif \ No newline at end of file +#endif diff -Nru kylin-ipmsg-1.3.1.2/src/main.cpp kylin-ipmsg-1.3.1.2/src/main.cpp --- kylin-ipmsg-1.3.1.2/src/main.cpp 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/src/main.cpp 2025-02-27 10:48:52.000000000 +0800 @@ -149,7 +149,7 @@ /* wayland 下最小化拉起 */ if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)) { QObject::connect(&app, &kdk::QtSingleApplication::messageReceived, [=]() { - if (KyView::getInstance()->getWindowId()) { + if (!KyView::getInstance()->getWindowId().isEmpty()) { kabase::WindowManage::activateWindow(KyView::getInstance()->getWindowId()); } }); diff -Nru kylin-ipmsg-1.3.1.2/src/network/tcp_module.cpp kylin-ipmsg-1.3.1.2/src/network/tcp_module.cpp --- kylin-ipmsg-1.3.1.2/src/network/tcp_module.cpp 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/src/network/tcp_module.cpp 2025-02-27 10:48:52.000000000 +0800 @@ -127,6 +127,139 @@ return false; } +int TcpModule::cmd_exec_tar_decompress(QString dstFileName, QString savePath) +{ + if(checkLinkFile(dstFileName)) { + qDebug() << "( TcpModule::cmd_exec_tar_decompress ) contains linkfile"; + return -1; + } else { + /* 代码安全规范 :使用 fork+evecve执行解压缩操作: tar -zxf \"%1\" -C \"%2\ */ + + qDebug() << "( TcpModule::cmd_exec_tar_decompress ) fork+evecve tart -zxf " << dstFileName << "-C" << savePath; + pid_t pid = -1; + int status = -1; + const char *args[6]; + const char *des; + const char *save; + + QByteArray des_arr = dstFileName.toLocal8Bit(); + QByteArray save_arr = savePath.toLocal8Bit(); + des = des_arr.data(); + save = save_arr.data(); + + args[0] = "tar"; + args[1] = "-zxf"; + args[2] = des; + args[3] = "-C"; + args[4] = save; + args[5] = NULL; + char **env = NULL; + + pid = fork(); + if (pid == (pid_t)0) { + /* Child side */ + (void)execve("/usr/bin/tar",(char *const*)args, env); + qWarning() << "( TcpModule::cmd_exec_tar_decompress) pid = " << pid << " execve failed"; + _exit(127); + } else if (pid < (pid_t)0) { + /* the fork failed */ + qDebug() << "( TcpModule::cmd_exec_tar_decompress ) fork failed"; + status = -1; + } else { + /* Parent side */ + + int n; + do{ + n = waitpid(pid, &status, 0); + }while(n ==-1 && errno == EINTR); + + if (n != pid) { + status = -1; + } + qDebug() << "( TcpModule::cmd_exec_tar_decompress ) fork parent side end"; + } + return status; + } +} + +int TcpModule::cmd_exec_tar_compress(QString dstPath, QString detFileName, QString srcPath, QString baseName) +{ + /* 代码安全规范 :使用 fork+evecve 执行压缩操作: tar -hzcf \"%1\" -C \"%2\ \"%3\*/ + qDebug() << "( TcpModule::cmd_exec_tar_compress ) fork+evecve tart -hzcf " << dstPath << "/" + << detFileName << ".tar.gz" <<"-C" << srcPath << " " << baseName; + pid_t pid = -1; + int status = -1; + const char *args[7]; + const char *des_path; + const char *src_path; + const char *file_name; + + + QByteArray des_path_arr = (dstPath + '/' + detFileName + ".tar.gz").toLocal8Bit(); + QByteArray src_path_arr = srcPath.toLocal8Bit(); + QByteArray file_name_arr = baseName.toLocal8Bit(); + des_path = des_path_arr.data(); + src_path = src_path_arr.data(); + file_name =file_name_arr.data(); + + qDebug() << "des_path = " << des_path; + qDebug() << "src_path = " << src_path; + qDebug() << "file_name = " << file_name; + + args[0] = "tar"; + args[1] = "-hzcf"; + args[2] = des_path; + args[3] = "-C"; + args[4] = src_path; + args[5] = file_name; + args[6] = NULL; + char **env = NULL; + + pid = fork(); + if (pid == (pid_t)0) { + /* Child side */ + (void)execve("/usr/bin/tar",(char *const*)args, env); + qDebug() << "( TcpModule::cmd_exec_tar_compress ) pid = " << pid << "execve failed"; + _exit(127); + } else if (pid < (pid_t)0) { + /* the fork failed */ + qDebug() << "( TcpModule::cmd_exec_tar_compress ) fork failed"; + status = -1; + } else { + /* Parent side */ + int n; + do{ + n = waitpid(pid, &status, 0); + }while(n ==-1 && errno == EINTR); + + if (n != pid) { + status = -1; + } + } + qDebug() << "( TcpModule::cmd_exec_tar_compress ) cmd tar exit"; + return status; +} + +bool TcpModule::checkLinkFile(QString dstFileName) +{ + //解压前查看是否包含软链接:tar -tvf \"%1\"' + QProcess tarProcess; + QStringList tarArguments; + tarArguments << "-tvf" << dstFileName; + qDebug() << "( TcpModule::checkLinkFile ) tar -tvf "<< dstFileName; + tarProcess.start("/usr/bin/tar", tarArguments); + tarProcess.waitForFinished(); + bool isLink = false; + while(tarProcess.canReadLine()) { + QString str = tarProcess.readLine(); + if (str.begin()[0] == 'l') { + isLink = true; + break; + } + } + return isLink; +} + /* 主动连接超时处理 */ void TcpModule::slotConnTimeout() { @@ -277,7 +410,13 @@ QFileInfo fileInfo(send->m_filePath); QString baseName = fileInfo.fileName(); filePath = send->m_filePath; - QString basePath = filePath.remove(baseName); + QString basePath = fileInfo.absolutePath(); + + /* 修复安全漏洞KVE-2024-0202 */ + if (baseName.contains("../")){ + qDebug() << "There is security threat"; + return; + } std::string stdBaseName = baseName.toStdString(); char *cBaseName = const_cast<char *>(stdBaseName.c_str()); @@ -329,7 +468,7 @@ if (!tmpCachePath) { qDebug() << "Error : TcpModule , recvFile , realpath is null !!!!"; } - if (verify_file(tmpCachePath)) { + if (verify_file(tmpCachePath)) { qDebug() << "Error : TcpModule , recvFile , verify_file is 0 !!!!"; assert(verify_file(tmpCachePath)); } @@ -349,13 +488,14 @@ // memset(command, 0x00, sizeof(command)); // sprintf(command, "tar -zcf \"%s/%s.tar.gz\" -C %s \"%s\"", cachePath, cBaseName, cBasePath, cBaseName); /* 代码安全规范进行替换(字符串拼接) */ - QString qstrCommand = QString("tar -zcf \"%1/%2.tar.gz\" -C %3 \"%4\"").arg(strCachePath).arg(baseName).arg(basePath).arg(baseName); - std::string strCommand = qstrCommand.toStdString(); - const char* command = strCommand.c_str(); - - ret = system(command); - - if (ret) { + //QString qstrCommand = QString("tar -zcf \"%1/%2.tar.gz\" -C %3 \"%4\"").arg(strCachePath).arg(baseName).arg(basePath).arg(baseName); + //std::string strCommand = qstrCommand.toStdString(); + //const char* command = strCommand.c_str(); + // + //ret = system(command); + ret = cmd_exec_tar_compress(strCachePath, baseName, basePath, baseName); + qDebug() << __func__ << __LINE__ << "( TcpModule::recvFile ) cmd_exec_tar_compress return value:ret = " << ret; + if (ret != 0) { /* PRO : 只是压缩失败 , 并不代表 tcp 异常 */ emit sigSendFileFail(send); emit sigMaintainTcpLinkDelete(this->m_uuid); @@ -759,6 +899,13 @@ char *cFileType = const_cast<char *>(package.value(QByteArray("file_type")).data()); strncpy(this->m_fileType, cFileType, sizeof(this->m_fileType) - 1); + /* 修复安全漏洞KVE-2024-0202 */ + QString filename = this->m_fileName; + if (filename.contains("../")){ + qDebug() << "There is security threat"; + return; + } + this->m_fileTotalSize = package.value(QByteArray("file_total_size")).toLongLong(); this->m_msgType = package.value(QByteArray("type")).toInt(); @@ -878,7 +1025,7 @@ // char dstFileName[1024 * 2]; // memset(dstFileName, 0x00, sizeof(dstFileName)); // sprintf(dstFileName, "%s%s", this->m_savePath, this->m_fileName); - + /********************** 代码安全规范进行替换(字符串拼接) **********************/ QString qstrSavePath = QString::fromUtf8(this->m_savePath); QString qstrFileName = QString::fromUtf8(this->m_fileName); @@ -918,7 +1065,7 @@ if (!dstFileName) { qDebug() << "Error : TcpModule , recvFile , realpath is null !!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__; } - if (verify_file(dstFileName)) { + if (verify_file(dstFileName)) { qDebug() << "Error : TcpModule , recvFile , verify_file is 0 !!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__; assert(verify_file(dstFileName)); } @@ -946,8 +1093,8 @@ QFileInfo file(decomDirName); QString name; int i = 0; - ret = access(decomDirName, F_OK); - if (!ret) { + ret = QFileInfo(decomDirName).exists(); + if (ret) { /* 生成文件名 */ for (;;) { if (file.completeSuffix().isEmpty()) { @@ -983,14 +1130,14 @@ if (!tmpDecomDir) { qDebug() << "Error : TcpModule , recvFile , realpath is null !!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__; } - if (verify_file(tmpDecomDir)) { + if (verify_file(tmpDecomDir)) { qDebug() << "Error : TcpModule , recvFile , verify_file is 0 !!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__; assert(verify_file(tmpDecomDir)); } /********************** 添加安全代码规范 **********************/ - ret = access(tmpDecomDir, F_OK); - if (ret) { + ret = QFileInfo(tmpDecomDir).exists(); + if (!ret) { ret = mkdir(tmpDecomDir, 0777); if (ret) { qDebug() << "Error : create tmp decom path fail"; @@ -1004,8 +1151,10 @@ // char command[1024 * 4]; // memset(command, 0x00, sizeof(command)); // sprintf(command, "tar -zxf \"%s\" -C \"%s\"", dstFileName, tmpDecomDir); - ret = system(QString("tar -zxf \"%1\" -C \"%2\"").arg(QString(dstFileName)).arg(QString(tmpDecomDir)).toStdString().c_str()); - if (ret) { + //ret = system(QString("tar -zxf \"%1\" -C \"%2\"").arg(QString(dstFileName)).arg(QString(tmpDecomDir)).toStdString().c_str()); + ret = cmd_exec_tar_decompress(dstFileName, QString(tmpDecomDir)); + qDebug() << __func__ << __LINE__ << "( TcpModule::recvFile ) cmd_exec_tar_decompress return value:ret = " << ret; + if (ret == -1) { qDebug() << "Error : TcpModule , recvFile , tar command if fail"; } @@ -1041,15 +1190,18 @@ if (!savePath) { qDebug() << "Error : TcpModule , recvFile , realpath is null !!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__; } - if (verify_file(savePath)) { + if (verify_file(savePath)) { qDebug() << "Error : TcpModule , recvFile , verify_file is 0 !!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__; assert(verify_file(savePath)); } + + //ret = system(QString("tar -zxf \"%1\" -C \"%2\"").arg(QString(dstFileName)).arg(QString(savePath)).toStdString().c_str()); + ret = cmd_exec_tar_decompress(dstFileName, QString(savePath)); + qDebug() << __func__ << __LINE__ << "( TcpModule::recvFile ) cmd_exec_tar_decompress return value:ret = " << ret; + if (ret == -1) { + qDebug() << "Waring : TcpModule , recvFile , tar command is fail"; + } /********************** 添加安全代码规范 **********************/ - ret = system(QString("tar -zxf \"%1\" -C \"%2\"").arg(QString(dstFileName)).arg(QString(savePath)).toStdString().c_str()); - if (ret) { - qDebug() << "Waring : TcpModule , recvFile , tar command is fail"; - } ret = remove(dstFileName); if (ret == -1) { diff -Nru kylin-ipmsg-1.3.1.2/src/network/tcp_module.h kylin-ipmsg-1.3.1.2/src/network/tcp_module.h --- kylin-ipmsg-1.3.1.2/src/network/tcp_module.h 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/src/network/tcp_module.h 2025-02-27 10:48:52.000000000 +0800 @@ -40,6 +40,12 @@ bool judgeCancel(ChatMsgInfo *); + /* 代码安全规范 */ + int cmd_exec_tar_decompress(QString dstFileName, QString savePath); + int cmd_exec_tar_compress(QString dstPath, QString detFileName, QString srcPath, QString baseName); + int verify_file(char *const filename); + bool checkLinkFile(QString dstFileName); + private: QTcpSocket *m_socket; ProtocolAnalysis m_moduleProtocolAnalysis; @@ -65,8 +71,6 @@ /* 连接超时计时器 */ QTimer *m_connTimer; int m_timeoutCount; /* 超时次数 */ - - int verify_file(char *const filename); /* 代码规范 */ signals: void sigTaskAdd(); diff -Nru kylin-ipmsg-1.3.1.2/src/view/chatmsg/chatmsg.cpp kylin-ipmsg-1.3.1.2/src/view/chatmsg/chatmsg.cpp --- kylin-ipmsg-1.3.1.2/src/view/chatmsg/chatmsg.cpp 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/src/view/chatmsg/chatmsg.cpp 2025-02-27 10:48:52.000000000 +0800 @@ -166,6 +166,9 @@ // this->setProperty("useSystemStyleBlur",true); // this->setAttribute(Qt::WA_TranslucentBackground,true); + //失焦仍显示提示信息 + this->setAttribute(Qt::WA_AlwaysShowToolTips); + // 主界面属性 /* 适配kysdk的窗管 */ kabase::WindowManage::removeHeader(this); @@ -943,13 +946,11 @@ } filePath = QString("file://") + filePath; - bool is_open = QDesktopServices::openUrl(QUrl(filePath, QUrl::TolerantMode)); +// bool is_open = QDesktopServices::openUrl(QUrl(filePath, QUrl::TolerantMode)); - if (!is_open) { - qDebug() << "open by xdg"; - QString cmd = QString("xdg-open ") + filePath; - QProcess::startDetached(cmd); - } + qDebug() << "open by xdg"; + QString cmd = QString("/usr/bin/xdg-open ") + filePath; + QProcess::startDetached(cmd); } // 打开所在目录 @@ -968,7 +969,7 @@ } QString pathCmd = "\"" + filePath + "\""; - QString cmd = QString("peony --show-items " + pathCmd); + QString cmd = QString("/usr/bin/peony --show-items " + pathCmd); QProcess::startDetached(cmd); } @@ -1139,7 +1140,7 @@ m_hasOldImage = false; } - QString cmd = "kylin-screenshot gui"; + QString cmd = "/usr/bin/kylin-screenshot gui"; QProcess::execute(cmd); m_startShot = true; diff -Nru kylin-ipmsg-1.3.1.2/src/view/chatsearch/chat_search.cpp kylin-ipmsg-1.3.1.2/src/view/chatsearch/chat_search.cpp --- kylin-ipmsg-1.3.1.2/src/view/chatsearch/chat_search.cpp 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/src/view/chatsearch/chat_search.cpp 2025-02-27 10:48:52.000000000 +0800 @@ -154,6 +154,9 @@ /* 适配kysdk的窗管 */ ::kabase::WindowManage::removeHeader(this); + //失焦仍显示提示信息 + this->setAttribute(Qt::WA_AlwaysShowToolTips); + this->setFixedSize(QSize(500, 680)); this->setMouseTracking(true); @@ -707,13 +710,11 @@ } filePath = QString("file://") + filePath; - bool is_open = QDesktopServices::openUrl(QUrl(filePath, QUrl::TolerantMode)); +// bool is_open = QDesktopServices::openUrl(QUrl(filePath, QUrl::TolerantMode)); - if (!is_open) { - qDebug() << "open by xdg"; - QString cmd = QString("xdg-open ") + filePath; - QProcess::execute(cmd); - } + qDebug() << "open by xdg"; + QString cmd = QString("/usr/bin/xdg-open ") + filePath; + QProcess::startDetached(cmd); } // 打开所在目录 @@ -732,7 +733,7 @@ } QString pathCmd = "\"" + filePath + "\""; - QString cmd = QString("peony --show-items " + pathCmd); + QString cmd = QString("/usr/bin/peony --show-items " + pathCmd); QProcess::execute(cmd); } diff -Nru kylin-ipmsg-1.3.1.2/src/view/friendlist/friendinfowid.cpp kylin-ipmsg-1.3.1.2/src/view/friendlist/friendinfowid.cpp --- kylin-ipmsg-1.3.1.2/src/view/friendlist/friendinfowid.cpp 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/src/view/friendlist/friendinfowid.cpp 2025-02-27 10:48:52.000000000 +0800 @@ -162,6 +162,9 @@ this->setProperty("useSystemStyleBlur", true); this->setAttribute(Qt::WA_TranslucentBackground, true); + //失焦仍显示提示信息 + this->setAttribute(Qt::WA_AlwaysShowToolTips); + /* 适配kysdk的窗管 */ kabase::WindowManage::removeHeader(this); @@ -380,8 +383,10 @@ /* SDK功能点:修改好友备注 */ GlobalSizeData::SDKPointModifyFriendNotes(); - LocalUpdateName *updateNameWid = new LocalUpdateName(LocalUpdateName::FriendName, m_friendId); + LocalUpdateName *updateNameWid = new LocalUpdateName(LocalUpdateName::FriendName, m_friendId, this); updateNameWid->show(); + kdk::WindowManager::setSkipTaskBar(updateNameWid->windowHandle(), true); + kdk::WindowManager::setSkipSwitcher(updateNameWid->windowHandle(), true); if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)){ kabase::WindowManage::setMiddleOfScreen(updateNameWid); } diff -Nru kylin-ipmsg-1.3.1.2/src/view/friendlist/friendlist.cpp kylin-ipmsg-1.3.1.2/src/view/friendlist/friendlist.cpp --- kylin-ipmsg-1.3.1.2/src/view/friendlist/friendlist.cpp 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/src/view/friendlist/friendlist.cpp 2025-02-27 10:48:52.000000000 +0800 @@ -170,6 +170,8 @@ if (m_msgWidMap.contains(friendId)) { chatMsg = m_msgWidMap.value(friendId); + /* 适配kysdk的窗管 */ + kabase::WindowManage::removeHeader(chatMsg); } else { QString friendUuid = FriendListModel::getInstance()->getUuidById(friendId); chatMsg = new ChatMsg(friendId, friendUuid); @@ -280,8 +282,10 @@ QModelIndex friendIndex = m_sortFilterModel->mapToSource(this->currentIndex()); int friendId = friendIndex.data(FriendListModel::Id).toInt(); - LocalUpdateName *updateNameWid = new LocalUpdateName(LocalUpdateName::FriendName, friendId); + LocalUpdateName *updateNameWid = new LocalUpdateName(LocalUpdateName::FriendName, friendId, this); updateNameWid->show(); + kdk::WindowManager::setSkipTaskBar(updateNameWid->windowHandle(), true); + kdk::WindowManager::setSkipSwitcher(updateNameWid->windowHandle(), true); if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)) { kabase::WindowManage::setMiddleOfScreen(updateNameWid); @@ -299,9 +303,11 @@ QModelIndex friendIndex = m_sortFilterModel->mapToSource(this->currentIndex()); int friendId = friendIndex.data(FriendListModel::Id).toInt(); - FriendInfoWid::getInstance()->fillFriendInfo(friendId); - FriendInfoWid::getInstance()->activateWindow(); - FriendInfoWid::getInstance()->show(); + FriendInfoWid::getInstance(this)->fillFriendInfo(friendId); + FriendInfoWid::getInstance(this)->activateWindow(); + FriendInfoWid::getInstance(this)->show(); + kdk::WindowManager::setSkipTaskBar(FriendInfoWid::getInstance(this)->windowHandle(), true); + kdk::WindowManager::setSkipSwitcher(FriendInfoWid::getInstance(this)->windowHandle(), true); if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)){ kabase::WindowManage::setMiddleOfScreen(FriendInfoWid::getInstance()); } diff -Nru kylin-ipmsg-1.3.1.2/src/view/kyview.cpp kylin-ipmsg-1.3.1.2/src/view/kyview.cpp --- kylin-ipmsg-1.3.1.2/src/view/kyview.cpp 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/src/view/kyview.cpp 2025-02-27 10:48:52.000000000 +0800 @@ -93,7 +93,7 @@ m_titleBar->setFixedHeight(GlobalSizeData::TITLEBAR_HEIGHT); // 本机信息 - m_localInfo = LocalInfo::getInstance(); + m_localInfo = LocalInfo::getInstance(this); m_localInfo->installEventFilter(this); // 好友列表 @@ -162,6 +162,9 @@ this->setProperty("useSystemStyleBlur", true); this->setAttribute(Qt::WA_TranslucentBackground, true); + //失焦仍显示提示信息 + this->setAttribute(Qt::WA_AlwaysShowToolTips); + // 应用居中 QScreen *screen = QGuiApplication::primaryScreen(); this->move(screen->geometry().center() - this->rect().center()); @@ -292,8 +295,9 @@ m_stackedWid->setCurrentIndex(1); } -quint32 KyView::getWindowId(void) +QString KyView::getWindowId(void) { + kabase::WindowManage::getWindowId(&m_windowId); return m_windowId; } diff -Nru kylin-ipmsg-1.3.1.2/src/view/kyview.h kylin-ipmsg-1.3.1.2/src/view/kyview.h --- kylin-ipmsg-1.3.1.2/src/view/kyview.h 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/src/view/kyview.h 2025-02-27 10:48:52.000000000 +0800 @@ -80,7 +80,7 @@ // 窗口关闭事件 void closeEvent(QCloseEvent *event); - quint32 getWindowId(void); + QString getWindowId(void); private: // 整体界面窗体 @@ -110,7 +110,7 @@ // 系统托盘 TrayIconWid *m_trayIconWid; - quint32 m_windowId = 0; + QString m_windowId = ""; // 透明度变化 void transChange(); diff -Nru kylin-ipmsg-1.3.1.2/src/view/localinfo/localinfo.cpp kylin-ipmsg-1.3.1.2/src/view/localinfo/localinfo.cpp --- kylin-ipmsg-1.3.1.2/src/view/localinfo/localinfo.cpp 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/src/view/localinfo/localinfo.cpp 2025-02-27 10:48:52.000000000 +0800 @@ -41,12 +41,12 @@ LocalInfo *LocalInfo::getInstance(QWidget *parent) { - Q_UNUSED(parent); +// Q_UNUSED(parent); static LocalInfo *instanse = nullptr; if (nullptr == instanse) { - instanse = new LocalInfo(); + instanse = new LocalInfo(parent); } return instanse; @@ -146,6 +146,9 @@ // 设置组件样式 void LocalInfo::setWidgetStyle() { + //失焦仍显示提示信息 + this->setAttribute(Qt::WA_AlwaysShowToolTips); + // 设置空间大小 m_userAvatarLab->setFixedSize(60, 60); m_updateNameBtn->setFixedSize(20, 20); @@ -244,8 +247,10 @@ /* sdk功能点:昵称修改 */ GlobalSizeData::SDKPointNicknameModify(); - m_updateNameWid = new LocalUpdateName(LocalUpdateName::LocalName, false); + m_updateNameWid = new LocalUpdateName(LocalUpdateName::LocalName, false, this); m_updateNameWid->show(); + kdk::WindowManager::setSkipTaskBar(m_updateNameWid->windowHandle(), true); + kdk::WindowManager::setSkipSwitcher(m_updateNameWid->windowHandle(), true); if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)){ kabase::WindowManage::setMiddleOfScreen(m_updateNameWid); } @@ -307,11 +312,15 @@ void LocalInfo::checkLocalName() { if (m_settings->getLocalNickname().isEmpty()) { - m_updateNameWid = new LocalUpdateName(LocalUpdateName::LocalName, true); - m_updateNameWid->show(); - if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)){ - kabase::WindowManage::setMiddleOfScreen(m_updateNameWid); - } + QTimer::singleShot(100, this, [=](){ + m_updateNameWid = new LocalUpdateName(LocalUpdateName::LocalName, true, this); + m_updateNameWid->show(); + kdk::WindowManager::setSkipTaskBar(m_updateNameWid->windowHandle(), true); + kdk::WindowManager::setSkipSwitcher(m_updateNameWid->windowHandle(), true); + if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)){ + kabase::WindowManage::setMiddleOfScreen(m_updateNameWid); + } + }); } } diff -Nru kylin-ipmsg-1.3.1.2/src/view/localinfo/localupdatename.cpp kylin-ipmsg-1.3.1.2/src/view/localinfo/localupdatename.cpp --- kylin-ipmsg-1.3.1.2/src/view/localinfo/localupdatename.cpp 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/src/view/localinfo/localupdatename.cpp 2025-02-27 10:48:52.000000000 +0800 @@ -139,6 +139,9 @@ this->setAutoFillBackground(true); this->setBackgroundRole(QPalette::Base); + //失焦仍显示提示信息 + this->setAttribute(Qt::WA_AlwaysShowToolTips); + this->setFixedSize(QSize(376, 235)); m_titleBar->m_pMinimizeButton->hide(); @@ -212,7 +215,8 @@ // } else if (m_nameType == LocalUpdateName::FriendName) { // m_tipsLab->setText(tr("Please enter friend nickname")); // } - QRegularExpression re("^[a-zA-Z0-9\\p{Han}\\x{1800}-\\x{18AF}\\x{0400}-\\x{04FF}]+$"); +// QRegularExpression re("^[a-zA-Z0-9\\p{Han}\\x{1800}-\\x{18AF}\\x{0400}-\\x{04FF}]+$"); + QRegularExpression re(R"([~!@#$%^&*()_+\-={}|:\"<>?\[\]\\;',./,。、;‘’【】{}:“”《》?!¥……()·∑∏〓"#﹪﹫\s]+)"); QRegularExpressionMatch match = re.match(m_nameEdit->text()); if (m_nameEdit->text() == "" && m_nameType == LocalUpdateName::LocalName) { m_tipsLab->setText(tr("Please enter username")); @@ -220,7 +224,7 @@ m_tipsLab->setText(tr("The length of user name is less than 20 words")); // } else if (!rx.exactMatch(m_nameEdit->text())) { } - else if ((!match.hasMatch() && m_nameEdit->text() != "" && m_nameType == LocalUpdateName::FriendName)||(!match.hasMatch() && m_nameType == LocalUpdateName::LocalName)) { + else if ((match.hasMatch() && m_nameEdit->text() != "" && m_nameType == LocalUpdateName::FriendName)||(match.hasMatch() && m_nameType == LocalUpdateName::LocalName)) { m_tipsLab->setText(tr("Please do not enter special characters")); } else { m_tipsLab->setText(""); diff -Nru kylin-ipmsg-1.3.1.2/src/view/titlebar/menumodule.cpp kylin-ipmsg-1.3.1.2/src/view/titlebar/menumodule.cpp --- kylin-ipmsg-1.3.1.2/src/view/titlebar/menumodule.cpp 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/src/view/titlebar/menumodule.cpp 2025-02-27 10:48:52.000000000 +0800 @@ -28,6 +28,8 @@ menuModule::menuModule(QWidget *parent = nullptr) : QWidget(parent) { + //失焦仍显示提示信息 + this->setAttribute(Qt::WA_AlwaysShowToolTips); init(); } @@ -64,7 +66,8 @@ actionAbout->setText(tr("About")); QAction *actionQuit = new QAction(m_menu); actionQuit->setText(tr("Quit")); - actions << actionSetUp << actionHelp << actionAbout << actionQuit; + KMenuButton* menubutton = new KMenuButton(); + actions << actionSetUp << actionHelp << actionAbout << menubutton->feedbackAction() << actionQuit; m_menu->addActions(actions); @@ -183,7 +186,7 @@ void menuModule::setupAction() { - TitleSeting *titleSetUp = new TitleSeting(); + TitleSeting *titleSetUp = new TitleSeting(this); if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)) { titleSetUp->show(); kabase::WindowManage::setMiddleOfScreen(titleSetUp); @@ -191,18 +194,57 @@ else{ titleSetUp->show(); } + kdk::WindowManager::setSkipTaskBar(titleSetUp->windowHandle(), true); + kdk::WindowManager::setSkipSwitcher(titleSetUp->windowHandle(), true); titleSetUp->update(); } +QString menuModule::getfontviewerVersion() +{ + //return VERSION; + FILE *pp = NULL; + char *line = NULL; + size_t len = 0; + ssize_t read; + char *q = NULL; + QString version = tr("none"); + + pp = popen("dpkg -l kylin-ipmsg", "r"); + if(NULL == pp) + return version; + + while((read = getline(&line, &len, pp)) != -1){ + q = strrchr(line, '\n'); + *q = '\0'; + + QString content = line; + QStringList list = content.split(" "); + + list.removeAll(""); + + if (list.size() >= 3) + version = list.at(2); + } + + free(line); + pclose(pp); + return version; +} + #include <QDialog> void menuModule::initAbout() { - kdk::KAboutDialog aboutWindow(this, QIcon::fromTheme("kylin-ipmsg"), tr(appShowingName.toLocal8Bit()), tr("Version: ") + APP_VERSION); + appVersion = getfontviewerVersion(); + kdk::KAboutDialog aboutWindow(this, QIcon::fromTheme("kylin-ipmsg"), tr(appShowingName.toLocal8Bit()), tr("Version: ") + appVersion); aboutWindow.setBodyText(tr("Message provides text chat and file transfer functions in the LAN. " "There is no need to build a server. " "It supports multiple people to interact at the same time " "and send and receive in parallel.")); aboutWindow.setBodyTextVisiable(false); + aboutWindow.setModal(true); + aboutWindow.show(); + kdk::WindowManager::setSkipTaskBar(aboutWindow.windowHandle(),true); + kdk::WindowManager::setSkipSwitcher(aboutWindow.windowHandle(),true); aboutWindow.exec(); } diff -Nru kylin-ipmsg-1.3.1.2/src/view/titlebar/menumodule.h kylin-ipmsg-1.3.1.2/src/view/titlebar/menumodule.h --- kylin-ipmsg-1.3.1.2/src/view/titlebar/menumodule.h 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/src/view/titlebar/menumodule.h 2025-02-27 10:48:52.000000000 +0800 @@ -66,7 +66,7 @@ // 程序在实例化的时候需要传递的信息字段,打开debug开关后这些字段会被自动填充 QString appName = "Messages"; //格式kylin-usb-creator QString appShowingName = tr("Messages"); //格式kylin usb creator ,用来在前端展示 - QString appVersion = qApp->applicationVersion(); +// QString appVersion = qApp->applicationVersion(); QString confPath = "org.kylin-calculator-data.settings"; kdk::KAboutDialog *m_aboutWindow = nullptr; // 关于界面 @@ -80,6 +80,7 @@ // QGSettings *m_pGsettingThemeData = nullptr; // QGSettings *m_pGsettingThemeStatus = nullptr; enum typeThemeStatus : int { themeAuto = 0, themeBlackOnly = 1, themeLightOnly = 2 } themeStatus; + QString appVersion = nullptr; public slots: void dealSystemGsettingChange(const QString); @@ -101,6 +102,8 @@ void helpAction(); void setupAction(); + QString getfontviewerVersion(); + void setThemeFromLocalThemeSetting(QList<QAction *>); //获取本地主题配置 void setStyleByThemeGsetting(); //通过外部主题配置设置主题 void setThemeStyle(); diff -Nru kylin-ipmsg-1.3.1.2/src/view/titlebar/titleseting.cpp kylin-ipmsg-1.3.1.2/src/view/titlebar/titleseting.cpp --- kylin-ipmsg-1.3.1.2/src/view/titlebar/titleseting.cpp 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/src/view/titlebar/titleseting.cpp 2025-02-27 10:48:52.000000000 +0800 @@ -96,6 +96,9 @@ void TitleSeting::setWidgetStyle() { + //失焦仍显示提示信息 + this->setAttribute(Qt::WA_AlwaysShowToolTips); + this->setFixedSize(420, 320); QFont fontLabel = GlobalData::getInstance()->getFontSize16px(); @@ -104,7 +107,9 @@ QFont font = GlobalData::getInstance()->getFontSize14px(); m_lineRoute->setFont(font); - m_lineRoute->setFocusPolicy(Qt::NoFocus); + m_lineRoute->setFocusPolicy(Qt::ClickFocus); + m_lineRoute->setReadOnly(true); + m_lineRoute->setCursor(Qt::IBeamCursor); m_lineRoute->setText(IniSettings::getInstance()->getFilePath()); //路径 m_lineRoute->setTextMargins(8, 6, 8, 6); m_lineRoute->setCursorPosition(0); @@ -115,6 +120,7 @@ m_chooseRouteBtn->setText(tr("Change Directory")); m_chooseRouteBtn->setFont(font); + m_chooseRouteBtn->setFocusPolicy(Qt::NoFocus); m_chooseRouteBtn->setProperty("useButtonPalette", true); m_chooseRouteBtn->setProperty("isWindowButton", 0x1); m_chooseRouteBtn->setProperty("useIconHighlightEffect", 0x2); @@ -123,6 +129,7 @@ m_clearChatBtn->setText(tr("Clear All Chat Messages")); m_clearChatBtn->setFont(font); + m_clearChatBtn->setFocusPolicy(Qt::NoFocus); m_clearChatBtn->setProperty("useButtonPalette", true); m_clearChatBtn->setProperty("isWindowButton", 0x1); m_clearChatBtn->setProperty("useIconHighlightEffect", 0x2); @@ -131,6 +138,7 @@ m_clearCacheBtn->setText(tr("Clear the Cache")); m_clearCacheBtn->setFont(font); + m_clearCacheBtn->setFocusPolicy(Qt::NoFocus); m_clearCacheBtn->setProperty("useButtonPalette", true); m_clearCacheBtn->setProperty("isWindowButton", 0x1); m_clearCacheBtn->setProperty("useIconHighlightEffect", 0x2); diff -Nru kylin-ipmsg-1.3.1.2/src/view/trayicon/trayiconwid.cpp kylin-ipmsg-1.3.1.2/src/view/trayicon/trayiconwid.cpp --- kylin-ipmsg-1.3.1.2/src/view/trayicon/trayiconwid.cpp 2024-08-21 16:58:29.000000000 +0800 +++ kylin-ipmsg-1.3.1.2/src/view/trayicon/trayiconwid.cpp 2025-02-27 10:48:52.000000000 +0800 @@ -375,15 +375,15 @@ /* sdk功能点:托盘 */ GlobalSizeData::SDKPointTray(); - quint32 mainWindowId = KyView::getInstance()->getWindowId(); - if (mainWindowId == 0) { + QString mainWindowId = KyView::getInstance()->getWindowId(); + if (mainWindowId.isEmpty()) { qWarning() << "tray active window : window id is 0"; return; } switch (reason) { case QSystemTrayIcon::Trigger: - case QSystemTrayIcon::MiddleClick: +// case QSystemTrayIcon::MiddleClick: if (!kabase::WindowManage::isActive(mainWindowId) || kabase::WindowManage::isMinimized(mainWindowId)) { kabase::WindowManage::activateWindow(mainWindowId); KyView::getInstance()->show(); @@ -496,6 +496,8 @@ { TitleSeting *titleSetUp = new TitleSeting(this); titleSetUp->show(); + kdk::WindowManager::setSkipTaskBar(titleSetUp->windowHandle(), true); + kdk::WindowManager::setSkipSwitcher(titleSetUp->windowHandle(), true); titleSetUp->update(); return; }