From 01ac6b3544be5a1ff76c4895fce60ed79ad6e8f4 Mon Sep 17 00:00:00 2001 From: tarek_saidi Date: Fri, 15 Feb 2008 11:04:38 +0000 Subject: [PATCH] merged sniperbeamer's patches fixed bug #1828965 git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@149 b624d157-de02-0410-bad0-e51aec6abb33 --- INSTALL | 8 + changelog | 87 +- keepass.pro | 40 +- share/applications/keepassx.desktop | 14 + share/pixmaps/keepassx.xpm | 501 ++++++++ src/Application_X11.cpp | 35 + src/Application_X11.h | 34 + src/Database.cpp | 8 +- src/Kdb3Database.cpp | 28 +- src/Kdb3Database.h | 3 +- src/KpxConfig.cpp | 64 +- src/KpxConfig.h | 34 + src/crypto/sha256.h | 2 +- src/crypto/twofish.cpp | 5 +- src/dialogs/AboutDlg.cpp | 33 +- src/dialogs/AddBookmarkDlg.cpp | 2 +- src/dialogs/AutoTypeDlg.cpp | 84 ++ src/dialogs/AutoTypeDlg.h | 44 + src/dialogs/CustomizeDetailViewDlg.cpp | 35 +- src/dialogs/CustomizeDetailViewDlg.h | 12 +- src/dialogs/DatabaseSettingsDlg.cpp | 4 +- src/dialogs/DatabaseSettingsDlg.h | 2 +- src/dialogs/EditEntryDlg.cpp | 33 +- src/dialogs/EditEntryDlg.h | 6 +- src/dialogs/EditGroupDlg.cpp | 10 +- src/dialogs/EditGroupDlg.h | 2 +- src/dialogs/ExpiredEntriesDlg.cpp | 4 +- src/dialogs/ExpiredEntriesDlg.h | 2 +- src/dialogs/ManageBookmarksDlg.cpp | 2 +- src/dialogs/PasswordDlg.cpp | 28 +- src/dialogs/PasswordDlg.h | 5 +- src/dialogs/PasswordGenDlg.cpp | 6 +- src/dialogs/SearchDlg.cpp | 4 +- src/dialogs/SelectIconDlg.cpp | 16 +- src/dialogs/SelectIconDlg.h | 3 +- src/dialogs/SettingsDlg.cpp | 141 ++- src/dialogs/SettingsDlg.h | 21 +- src/dialogs/SimplePasswordDlg.cpp | 2 +- src/dialogs/TrashCanDlg.cpp | 4 +- src/dialogs/TrashCanDlg.h | 2 +- src/export/Export.cpp | 2 +- src/export/Export.h | 2 + src/export/Export_KeePassX_Xml.h | 8 +- src/export/Export_Txt.h | 6 +- src/forms/AboutDlg.ui | 20 +- src/forms/AutoTypeDlg.ui | 81 ++ src/forms/CustomizeDetailViewDlg.ui | 114 +- src/forms/DatabaseSettingsDlg.ui | 236 ++-- src/forms/EditGroupDlg.ui | 83 +- src/forms/MainWindow.ui | 122 +- src/forms/PasswordDlg.ui | 63 +- src/forms/SearchDlg.ui | 115 +- src/forms/SelectIconDlg.ui | 160 +-- src/forms/SettingsDlg.ui | 526 +++++--- src/import/Import.h | 2 + src/import/Import_GnuKeyRing.h | 2 + src/import/Import_KWalletXml.h | 4 +- src/import/Import_KeePassX_Xml.cpp | 2 +- src/import/Import_KeePassX_Xml.h | 4 +- src/import/Import_PwManager.cpp | 12 +- src/import/Import_PwManager.h | 4 +- src/lib/AutoType.h | 50 +- src/lib/AutoType_X11.cpp | 1286 +++++-------------- src/lib/EntryView.cpp | 26 +- src/lib/EntryView.h | 3 +- src/lib/FileDialogs.h | 1 + src/lib/GroupView.cpp | 22 +- src/lib/GroupView.h | 2 +- src/lib/HelperX11.cpp | 899 +++++++++++++ src/lib/HelperX11.h | 57 + src/lib/SecString.h | 4 +- src/lib/ShortcutWidget.cpp | 118 ++ src/lib/ShortcutWidget.h | 49 + src/lib/bookmarks.cpp | 75 +- src/lib/bookmarks.h | 4 +- src/lib/random.cpp | 4 +- src/main.cpp | 275 ++-- src/main.h | 11 +- src/mainwindow.cpp | 420 +++++-- src/mainwindow.h | 29 +- src/src.pro | 62 +- src/translations/keepass-cs_CS.ts | 1245 ++++++------------ src/translations/keepass-de_DE.ts | 1261 ++++++------------- src/translations/keepass-es_ES.ts | 1236 ++++++------------ src/translations/keepass-fr_FR.ts | 1279 ++++++------------- src/translations/keepass-ru_RU.ts | 1223 ++++++------------ src/translations/keepass-xx_XX.ts | 1604 ++++++++---------------- 87 files changed, 6454 insertions(+), 7729 deletions(-) create mode 100644 INSTALL create mode 100644 share/applications/keepassx.desktop create mode 100644 share/pixmaps/keepassx.xpm create mode 100644 src/Application_X11.cpp create mode 100644 src/Application_X11.h create mode 100644 src/dialogs/AutoTypeDlg.cpp create mode 100644 src/dialogs/AutoTypeDlg.h create mode 100644 src/forms/AutoTypeDlg.ui create mode 100644 src/lib/HelperX11.cpp create mode 100644 src/lib/HelperX11.h create mode 100644 src/lib/ShortcutWidget.cpp create mode 100644 src/lib/ShortcutWidget.h diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..2f765a2 --- /dev/null +++ b/INSTALL @@ -0,0 +1,8 @@ +Installation instructions for *nix: +----------------------------------- +1. qmake-qt4 / qmake + You have to use qmake of Qt >= 4.2.0, depending on your distro it is called qmake or qmake-qt4. + By default KeePassX is installed to /usr, you can change that by adding PREFIX=[PATH] to the qmake command. + You can also add RELEASE=1 to build KeePassX optimized. +2. make +3. make install diff --git a/changelog b/changelog index feecea0..042b67c 100644 --- a/changelog +++ b/changelog @@ -1,16 +1,83 @@ --------------- - 0.2.3 + 0.2.2.6 --------------- --fixed to long Auto-Type delay --fixed wrong text color in the password repeation box when using new Qt versions (Bug #???) --fixed problem with the assignment of group icons (custom icons metastream format rev 3) --more stable drag&drop implementation which also works under MacOSX --new more robust and flexible database back-end api --replaced old AES implementation by the latest version of Brian Gladman's implementation. --now using strong random number generator 'yarrow' instead of the standard library functions. --final program icon +-bookmarks and the Detail View are saved in the config file +-fixed bug that caused unlock not to work when 'Remember last opened file' is disabled or the the search is used +-loading default Detail View didn't work + +--------------- + 0.2.2.5 +--------------- +-fixed critical bug that caused the database to be only opened/saved with the keyfile when keyfile and password were selected +-fixed crash that could occur when locking a database that has unsaved changes +-don't hide window to tray if a modal window is opened +-auto-Type window is always on top and columns are automatically resized + +--------------- + 0.2.2.4 +--------------- +-window is now minimized to tray even if the unlock dialog is shown +-fixed problem when restoring window using the tray icon +-support custom commands and placeholders in entry urls +-improved custom browser selection in the settings dialog +-all dialogs use the native button order +-window title indicates if there are unsaved changes +-improved many translation strings + +--------------- + 0.2.2.3 +--------------- +-fixed a crash when the database is locked and KeePassX is restored +-fixed KeePassX is not always properly minimized after auto-type +-fixed global auto-type not working on non-ascii window titles +-added a setting to optionally use entry titles to match window for global auto-type +-added support for the delay command in auto-type +-expired entries are not used for global auto-type +-comparison of window titles is now always case-insensitive +-fixed cmd option -help didn't work +-output help on unrecognized argument +-fixed typo in desktop file +--------------- + 0.2.2.2 +--------------- +-added support for multiple Auto-Type-Window definitions + fully compatible to KeePass (http://keepass.info/help/base/autotype.html#autoglobal) +-added settings and command line options to start minimized and/or locked +-fixed window not always hidden when using 'Minimize to tray instead of taskbar' +-added pixmap and desktop file +-fixed a bunch of compiler warnings +--------------- + 0.2.2.1 +--------------- +Changes by Felix Geyer: +-added Global Auto-Type feature +-added database locking feature +-saves the sort column and order of the entry view +-added options 'Minimize to tray instead of taskbar', 'Lock workspace when minimizing the main window' and 'Global Auto-Type Shortcut' +-fixed Auto-Type while still holding modifier keys (ctrl, shift, ...) and caps lock +-fixed Auto-Type puts space at the beginning when using custom Auto-Type format +-fixed auto-typing of some non-Latin1 chars +-fixed crash when trying to auto-type invalid chars +-left click on the tray icon brings the main window to front when it's not the active window, otherwise hides it +-fixed a bunch of compiler warnings +-disabled all not yet working features + +Official changes: +-system tray icon +-fine tuning options for auto-type +-fully customizable HTML based detail view +-secure random number generator based on Yarrow including an optional entropy collector +-new dialog to view expiered entries +-calendar widget to edit expiration dates in a more confortable way +-restructured password generator +-much better appearance under MacOS X +-final program icon +-misc. visual improvements +-new more robust and flexible database back-end api +-replaced old AES implementation by the latest version of Brian Gladman's implementation. +-(maybe incomplete) --------------- 0.2.2 @@ -30,6 +97,7 @@ -alpha blending for banner icons -new standard banner icon -MacOS packages: all Qt libraries are now included in the application bundle (extra installation is not longer necessary) + --------------- 0.2.1 --------------- @@ -43,6 +111,7 @@ for entries which don't expire -entry view now gets updated after changing the column setup -added menu entry to change the size of the toolbar icons + --------------- 0.2.0 --------------- diff --git a/keepass.pro b/keepass.pro index 61dc0f5..6844e23 100755 --- a/keepass.pro +++ b/keepass.pro @@ -1,28 +1,28 @@ -message("See 'Install.txt' for configuration options.") -message("*** Build Configuration:") +message("See 'INSTALL' for configuration options.") +#message("*** Build Configuration:") TEMPLATE = subdirs isEmpty(PREFIX){ PREFIX = /usr } -isEmpty(KDEDIR){ - KDEDIR = /usr -} +#isEmpty(KDEDIR){ +# KDEDIR = /usr +#} SUBDIRS += src -contains(INT_PLUGINS,kde) { - SUBDIRS +=src/plugins/kde - message("Build KDE Plugin: yes") -} -!contains(INT_PLUGINS,kde) { - message("Build KDE Plugin: no") -} -contains(INT_PLUGINS,gtk) { - SUBDIRS +=src/plugins/gnome - message("Build Gnome Plugin: yes") -} -!contains(INT_PLUGINS,gtk) { - message("Build Gnome Plugin: no") -} +#contains(INT_PLUGINS,kde) { +# SUBDIRS +=src/plugins/kde +# message("Build KDE Plugin: yes") +#} +#!contains(INT_PLUGINS,kde) { +# message("Build KDE Plugin: no") +#} +#contains(INT_PLUGINS,gtk) { +# SUBDIRS +=src/plugins/gnome +# message("Build Gnome Plugin: yes") +#} +#!contains(INT_PLUGINS,gtk) { +# message("Build Gnome Plugin: no") +#} message("Install Prefix:" $$PREFIX) -message("KDE Prefix:" $$KDEDIR) +#message("KDE Prefix:" $$KDEDIR) message("*** Makefile successfully generated.") message("*** Start make now.") \ No newline at end of file diff --git a/share/applications/keepassx.desktop b/share/applications/keepassx.desktop new file mode 100644 index 0000000..3b0235b --- /dev/null +++ b/share/applications/keepassx.desktop @@ -0,0 +1,14 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=KeePassX +GenericName=Cross Platform Password Manager +GenericName[fr]=Gestionnaire de mot de passe +GenericName[de]=Passwortverwaltung +Exec=keepassx +Icon=keepassx.xpm +Comment=Cross Platform Password Manager +Comment[fr]=Gestionnaire de mot de passe +Comment[de]=Passwortverwaltung +Terminal=false +Type=Application +Categories=Qt;Utility; diff --git a/share/pixmaps/keepassx.xpm b/share/pixmaps/keepassx.xpm new file mode 100644 index 0000000..f58a3cf --- /dev/null +++ b/share/pixmaps/keepassx.xpm @@ -0,0 +1,501 @@ +/* XPM */ +static char * keepassx2_xpm[] = { +"32 32 466 2", +" c None", +". c #000000", +"+ c #181B16", +"@ c #0B0C0A", +"# c #6E7967", +"$ c #9BA596", +"% c #CBCFCA", +"& c #FAFAFA", +"* c #9CA696", +"= c #707D68", +"- c #0D110B", +"; c #343A30", +"> c #BCC3B8", +", c #FFFFFF", +"' c #FEFEFE", +") c #CED1CC", +"! c #ADB6A8", +"~ c #E6E7E5", +"{ c #BDC4B9", +"] c #3A4435", +"^ c #010101", +"/ c #4D5549", +"( c #EDEEED", +"_ c #FBFBFB", +": c #92A588", +"< c #66914E", +"[ c #65A142", +"} c #6EB048", +"| c #639B44", +"1 c #70975B", +"2 c #B7C0B1", +"3 c #55614D", +"4 c #030303", +"5 c #788375", +"6 c #839080", +"7 c #869283", +"8 c #899586", +"9 c #748270", +"0 c #060905", +"a c #141713", +"b c #D1D6CF", +"c c #EAECEA", +"d c #71935E", +"e c #63A93B", +"f c #64AB3C", +"g c #64AA3B", +"h c #63AA3A", +"i c #5F9F3A", +"j c #8A9E7F", +"k c #D1D7CF", +"l c #191F15", +"m c #E5E5E5", +"n c #909D8C", +"o c #111310", +"p c #8A9385", +"q c #88A07A", +"r c #6AAE44", +"s c #6BAE44", +"t c #64A93D", +"u c #628A4B", +"v c #637957", +"w c #5A903C", +"x c #67A543", +"y c #AFB8A9", +"z c #8F9B88", +"A c #E2E2E2", +"B c #AEB5AC", +"C c #BABFB8", +"D c #F9F9F9", +"E c #8E9A8A", +"F c #050805", +"G c #131513", +"H c #F2F2F2", +"I c #C2C9BE", +"J c #64A042", +"K c #6AAE43", +"L c #718367", +"M c #FCFCFC", +"N c #9D9D9D", +"O c #365424", +"P c #678F4F", +"Q c #F5F5F5", +"R c #1B2317", +"S c #DEDEDE", +"T c #B8BDB7", +"U c #2E7922", +"V c #337D24", +"W c #63825D", +"X c #869382", +"Y c #080A08", +"Z c #3E443A", +"` c #8CA281", +" . c #5FA539", +".. c #62A83B", +"+. c #5DA135", +"@. c #BFC1BE", +"#. c #30302F", +"$. c #63A240", +"%. c #BCC2B8", +"&. c #4A5742", +"*. c #D9DAD9", +"=. c #BBC0BB", +"-. c #3A7E31", +";. c #408735", +">. c #428935", +",. c #6D8866", +"'. c #869282", +"). c #0E0F0E", +"!. c #6B7667", +"~. c #7B9A6D", +"{. c #65A845", +"]. c #68AB46", +"^. c #6CAE47", +"/. c #65A440", +"(. c #A0A0A0", +"_. c #EAEAEA", +":. c #242424", +"<. c #76A45B", +"[. c #A3B29A", +"}. c #73816B", +"|. c #D2D3D2", +"1. c #FDFDFD", +"2. c #70886E", +"3. c #317A27", +"4. c #357F29", +"5. c #378029", +"6. c #6C8667", +"7. c #7C8A79", +"8. c #020301", +"9. c #7E8A79", +"0. c #689058", +"a. c #569E34", +"b. c #59A135", +"c. c #5CA437", +"d. c #5FA737", +"e. c #60A836", +"f. c #3F4F37", +"g. c #A6A6A6", +"h. c #C4C4C4", +"i. c #515151", +"j. c #0D1309", +"k. c #64AA3C", +"l. c #93AA87", +"m. c #819078", +"n. c #546153", +"o. c #6E876B", +"p. c #367E2D", +"q. c #3A832F", +"r. c #3C8430", +"s. c #728A6D", +"t. c #7C8879", +"u. c #0F0F0F", +"v. c #758071", +"w. c #809C75", +"x. c #5DA140", +"y. c #60A441", +"z. c #64A743", +"A. c #67AA45", +"B. c #6BAD47", +"C. c #5F963F", +"D. c #2E4223", +"E. c #181818", +"F. c #273420", +"G. c #6F9E55", +"H. c #AAB7A3", +"I. c #697861", +"J. c #020202", +"K. c #687468", +"L. c #6B8668", +"M. c #377F2F", +"N. c #3B8331", +"O. c #3C8230", +"P. c #758D71", +"Q. c #838E80", +"R. c #DADCD9", +"S. c #8FA289", +"T. c #559B3A", +"U. c #599E3B", +"V. c #5BA13C", +"W. c #5FA43D", +"X. c #61A73E", +"Y. c #64A93F", +"Z. c #67AC40", +"`. c #67A743", +" + c #67AC3F", +".+ c #CFD2CD", +"++ c #3C4936", +"@+ c #717E71", +"#+ c #638060", +"$+ c #2E7A26", +"%+ c #317D26", +"&+ c #337C27", +"*+ c #788D73", +"=+ c #DBDEDB", +"-+ c #558246", +";+ c #4E9734", +">+ c #529936", +",+ c #559C37", +"'+ c #59A039", +")+ c #5CA23B", +"!+ c #61A63D", +"~+ c #64A83F", +"{+ c #66AC40", +"]+ c #68AD40", +"^+ c #799669", +"/+ c #D8DBD7", +"(+ c #0F150B", +"_+ c #879287", +":+ c #F8F8F8", +"<+ c #658262", +"[+ c #3B8233", +"}+ c #3E8534", +"|+ c #3E8333", +"1+ c #7E927A", +"2+ c #EDEEEC", +"3+ c #5E8355", +"4+ c #51953C", +"5+ c #54983E", +"6+ c #579B3E", +"7+ c #5A9E3F", +"8+ c #5DA141", +"9+ c #60A442", +"0+ c #64A744", +"a+ c #66A945", +"b+ c #6AAC46", +"c+ c #67984B", +"d+ c #D9DCD8", +"e+ c #6E7C66", +"f+ c #050505", +"g+ c #090A09", +"h+ c #939E92", +"i+ c #F6F6F6", +"j+ c #5A7C57", +"k+ c #2C7823", +"l+ c #2E7A24", +"m+ c #317924", +"n+ c #7D9179", +"o+ c #5F7F58", +"p+ c #3B8628", +"q+ c #3E892A", +"r+ c #428C2B", +"s+ c #41892A", +"t+ c #468430", +"u+ c #4B952F", +"v+ c #4E9831", +"w+ c #529B32", +"x+ c #559E33", +"y+ c #59A235", +"z+ c #648F4E", +"A+ c #C3C9BF", +"B+ c #AEB7A8", +"C+ c #040603", +"D+ c #040404", +"E+ c #0A0C0A", +"F+ c #A3ADA3", +"G+ c #F3F3F3", +"H+ c #5D7E5A", +"I+ c #398132", +"J+ c #3E8434", +"K+ c #3D8132", +"L+ c #438935", +"M+ c #478C38", +"N+ c #498F39", +"O+ c #4C9039", +"P+ c #7C9275", +"Q+ c #CDD1CB", +"R+ c #7D9874", +"S+ c #658B56", +"T+ c #5E8A4C", +"U+ c #78986A", +"V+ c #92A589", +"W+ c #EEEEED", +"X+ c #BFC7BB", +"Y+ c #323D2D", +"Z+ c #080808", +"`+ c #181C18", +" @ c #B3BAB3", +".@ c #EFF0EF", +"+@ c #567B54", +"@@ c #327C2B", +"#@ c #347E2B", +"$@ c #38812D", +"%@ c #3B852E", +"&@ c #3E872E", +"*@ c #6C8965", +"=@ c #82907B", +"-@ c #141A13", +";@ c #0A0A0A", +">@ c #171817", +",@ c #ACB4AC", +"'@ c #638262", +")@ c #2A7624", +"!@ c #2E7927", +"~@ c #327C28", +"{@ c #5E8158", +"]@ c #848F81", +"^@ c #6E7E6B", +"/@ c #919F8D", +"(@ c #ABB4A8", +"_@ c #8E9C88", +":@ c #63725D", +"<@ c #313C2B", +"[@ c #0B0B0B", +"}@ c #121512", +"|@ c #ADB4AD", +"1@ c #698469", +"2@ c #2F772D", +"3@ c #337A30", +"4@ c #357D31", +"5@ c #3C8334", +"6@ c #547E4D", +"7@ c #DCDFDC", +"8@ c #EEEFEE", +"9@ c #525F4E", +"0@ c #101311", +"a@ c #A8B1A8", +"b@ c #658165", +"c@ c #1A681B", +"d@ c #1B691C", +"e@ c #1D6C1C", +"f@ c #216F1D", +"g@ c #24721F", +"h@ c #277520", +"i@ c #2B7822", +"j@ c #497843", +"k@ c #DADDD9", +"l@ c #E6E8E5", +"m@ c #3F4C3D", +"n@ c #151815", +"o@ c #AAB2AA", +"p@ c #6F876F", +"q@ c #2A722B", +"r@ c #2C752D", +"s@ c #316B32", +"t@ c #799179", +"u@ c #829882", +"v@ c #8B9F8A", +"w@ c #4F794D", +"x@ c #388032", +"y@ c #527E4C", +"z@ c #DEE0DD", +"A@ c #424D40", +"B@ c #0E110E", +"C@ c #A7B0A7", +"D@ c #708870", +"E@ c #236C24", +"F@ c #246F25", +"G@ c #236F24", +"H@ c #306431", +"I@ c #DDE0DD", +"J@ c #447341", +"K@ c #2E7827", +"L@ c #307A27", +"M@ c #4A7844", +"N@ c #D7DAD6", +"O@ c #D4D9D3", +"P@ c #2C3629", +"Q@ c #121412", +"R@ c #A6B0A6", +"S@ c #728972", +"T@ c #206A21", +"U@ c #226E23", +"V@ c #677667", +"W@ c #98A298", +"X@ c #D5DAD5", +"Y@ c #427340", +"Z@ c #317B2C", +"`@ c #357E2D", +" # c #4D7A47", +".# c #D6D9D5", +"+# c #CBD1CA", +"@# c #31382D", +"## c #131313", +"$# c #919B91", +"%# c #798D79", +"&# c #2A702B", +"*# c #286C29", +"=# c #29652A", +"-# c #365A36", +";# c #6B7A6B", +"># c #151715", +",# c #A6AEA6", +"'# c #CCD1CC", +")# c #41733F", +"!# c #357D2F", +"~# c #378030", +"{# c #4D7A46", +"]# c #D3D8D3", +"^# c #C1C7C0", +"/# c #20281F", +"(# c #B5BAB5", +"_# c #788E79", +":# c #186419", +"<# c #19681A", +"[# c #3E6E3E", +"}# c #C1C5C1", +"|# c #697A69", +"1# c #111511", +"2# c #ADB6AE", +"3# c #C1C9C1", +"4# c #346C31", +"5# c #287422", +"6# c #2C7825", +"7# c #457640", +"8# c #D1D6D0", +"9# c #AFB6AD", +"0# c #020502", +"a# c #B7BCB7", +"b# c #296C2A", +"c# c #447345", +"d# c #D7DAD7", +"e# c #D6D8D6", +"f# c #C3C7C3", +"g# c #C3C6C3", +"h# c #5F6F5F", +"i# c #161C16", +"j# c #BBC2BB", +"k# c #BAC2BA", +"l# c #3C733A", +"m# c #367E31", +"n# c #398133", +"o# c #4F744B", +"p# c #E2E3E2", +"q# c #0C110A", +"r# c #B6BBB6", +"s# c #216B22", +"t# c #396C3A", +"u# c #CDD2CD", +"v# c #B4BDB5", +"w# c #171E17", +"x# c #1F251F", +"y# c #C3C9C3", +"z# c #AEB8AE", +"A# c #2E6B2B", +"B# c #267321", +"C# c #396A34", +"D# c #DCDDDB", +"E# c #020701", +"F# c #EFEFEF", +"G# c #B1B8B1", +"H# c #D9DBD9", +"I# c #C9CFC9", +"J# c #1D271D", +"K# c #090909", +"L# c #222A23", +"M# c #CDD1CD", +"N# c #C0C7C0", +"O# c #A3B0A3", +"P# c #D7D9D7", +"Q# c #080B07", +"R# c #B1B6B1", +"S# c #F7F7F7", +"T# c #D7DAD8", +"U# c #364336", +"V# c #2F382F", +"W# c #D6DAD7", +"X# c #D0D4D0", +"Y# c #030603", +"Z# c #0C120C", +"`# c #0D150E", +" $ c #090F09", +".$ c #262F26", +"+$ c #485648", +"@$ c #475647", +"#$ c #475646", +"$$ c #404E3F", +" . . . + . . . ", +" @ # $ % & % * = - . ", +" . ; > , ' ) ! ~ , , { ] ^ ", +". . . . . . . / ( _ : < [ } | 1 2 , ( 3 . ", +"4 5 6 7 8 9 0 a b c d e f g g g h i j , k l . ", +"4 m , , , , n o ^ p , q r r s s t u v w x y , z 4 ", +". A ( B C D , E F G H I J s r r K L M , N O P Q H R . ", +". S T U V W _ , X Y Z , ` ...f f +.@., , ' #.$.%., &.. ", +". *.=.-.;.>.,.M , '.). . !., ~.{.].^.} /.(., , _.:.<.[., }.. ", +". |.1.2.3.4.5.6.1., 7.8.. 9., 0.a.b.c.d.e.f.g.h.i.j.k.l., m.. ", +". n.M M o.p.q.r.s.' , t.u.v., w.x.y.z.A.B.C.D.E.F.G.} H., I.. ", +" J.K., _ L.M.N.O.P.' , Q.R., S.T.U.V.W.X.Y.Z.`. + +i .+, ++. ", +" . @+, & #+$+%+&+*+, , , =+-+;+>+,+'+)+!+~+{+]+]+^+, /+(+. ", +" . ^ _+, :+<+[+}+|+1+, 2+3+4+5+6+7+8+9+0+a+b+^.c+d+, e+f+ ", +" . g+h+, i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+A+, B+C+D+ ", +" . E+F+, G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+, X+Y+Z+ ", +" . `+ @, .@+@@@#@$@%@&@*@1., , , , , , :+=@-@;@. ", +" >@,@, _ '@)@!@~@4.{@:+, ]@^@/@(@_@:@<@^ [@ ", +" }@|@, M 1@2@3@4@I+5@6@7@, 8@9@. . ^ f+4 . ", +" 0@a@, 1.b@c@d@e@f@g@h@i@j@k@, l@m@f+ ", +" n@o@, ' p@q@r@s@t@u@v@w@x@[+y@d+, z@A@;@ ", +" B@C@, , D@E@F@G@H@, , , I@J@K@L@M@N@, O@P@. ", +" Q@R@, , S@T@U@U@G@H@, V@W@, X@Y@Z@`@ #.#, +#@### ", +". $#, , %#&#r@r@*#=#-#, ;#>#,#, '#)#!#~#{#]#, ^#/#. ", +". (#, _#:#<#<#[#}#_.1., |#. 1#2#, 3#4#5#6#7#8#, 9#0# ", +". a#}#b#r@r@c#d#, e#f#g#h#. . i#j#, k#l#m#n#o#, p#q#. ", +". r#a#s#U@t#u#, v#w#. . . . . x#y#, z#A#B#C#, D#E#. ", +". r#F#G#G#H#, I#J#K#. . . . . L#M#, N#O#R@, P#Q#. ", +". R#S#S#S#S#T#U#;@ . V#W#, , , , X#Y#. ", +". Z#`#`#`#`# $D+. . .$+$@$@$#$$$. . ", +". . . . . . . . . . . . . . . ", +" "}; diff --git a/src/Application_X11.cpp b/src/Application_X11.cpp new file mode 100644 index 0000000..4e19a1b --- /dev/null +++ b/src/Application_X11.cpp @@ -0,0 +1,35 @@ +/*************************************************************************** + * Copyright (C) 2005-2008 by Felix Geyer * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; version 2 of the License. * + + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "Application_X11.h" +#include "lib/AutoType.h" +#include "lib/HelperX11.h" + +KeepassApplication::KeepassApplication(int& argc, char** argv) : QApplication(argc, argv){ +} + +bool KeepassApplication::x11EventFilter(XEvent* event){ + static const unsigned int remove_invalid = ControlMask|ShiftMask|Mod1Mask|Mod5Mask|Mod4Mask; + if (event->type==KeyPress && AutoType::shortcut.key!=0u && event->xkey.keycode==XKeysymToKeycode(event->xkey.display,HelperX11::getKeysym(AutoType::shortcut.key)) && (event->xkey.state&remove_invalid)==HelperX11::getShortcutModifierMask(AutoType::shortcut) && QApplication::focusWidget()==NULL ){ + AutoType::performGlobal(); + return true; + } + else + return QApplication::x11EventFilter(event); +} diff --git a/src/Application_X11.h b/src/Application_X11.h new file mode 100644 index 0000000..dc5772f --- /dev/null +++ b/src/Application_X11.h @@ -0,0 +1,34 @@ +/*************************************************************************** + * Copyright (C) 2005-2008 by Felix Geyer * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; version 2 of the License. * + + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef APPLICATION_X11_H +#define APPLICATION_X11_H + +#include + +class KeepassApplication : public QApplication +{ + Q_OBJECT + + public: + KeepassApplication(int& argc, char** argv); + bool x11EventFilter(XEvent* event); +}; + +#endif // APPLICATION_X11_H diff --git a/src/Database.cpp b/src/Database.cpp index 7cd1dba..d89d679 100644 --- a/src/Database.cpp +++ b/src/Database.cpp @@ -20,6 +20,7 @@ #include "Database.h" #include "lib/random.h" +#include KpxUuid::KpxUuid(){ Data.fill(0,16); @@ -76,12 +77,12 @@ bool KpxUuid::operator!=(const KpxUuid& other)const{ QString KpxDateTime::toString(Qt::DateFormat format) const{ - if(*this==Date_Never)return QObject::tr("Never"); + if(*this==Date_Never)return QCoreApplication::translate("Database","Never"); else return QDateTime::toString(format); } QString KpxDateTime::dateToString(Qt::DateFormat format) const{ - if(*this==Date_Never)return QObject::tr("Never"); + if(*this==Date_Never)return QCoreApplication::translate("Database","Never"); else return date().toString(format); } @@ -107,7 +108,8 @@ bool KpxDateTime::operator<(const QDateTime& other){ if(*this==Date_Never && other==Date_Never)return false; if(*this==Date_Never)return false; if(other==Date_Never)return true; - + + return false; } diff --git a/src/Kdb3Database.cpp b/src/Kdb3Database.cpp index 9cf254e..0e7bb4b 100644 --- a/src/Kdb3Database.cpp +++ b/src/Kdb3Database.cpp @@ -20,10 +20,9 @@ #include "global.h" #include #include -#include -#include -#include -#include +#include +#include +#include #include #include #include @@ -135,11 +134,13 @@ bool Kdb3Database::isMetaStream(StdEntry& p){ bool Kdb3Database::parseCustomIconsMetaStreamV1(const QByteArray& dta){ + Q_UNUSED(dta) qDebug("Removed old CuIcMeSt v1"); return true; } bool Kdb3Database::parseCustomIconsMetaStreamV2(const QByteArray& dta){ + Q_UNUSED(dta) qDebug("Removed old CuIcMeSt v2"); return true; } @@ -297,7 +298,7 @@ switch(FieldType) entry->Expire=dateFromPackedStruct5(pData); break; case 0x000D: - entry->BinaryDesc=(char*)pData; + entry->BinaryDesc=QString::fromUtf8((char*)pData); break; case 0x000E: if(FieldSize != 0) @@ -525,13 +526,13 @@ RootGroup.Handle=NULL; memcpyFromLEnd16(&FieldType, pField); pField += 2; pos += 2; if(pos >= total_size) { - error=tr("Unexpected error: Offset is out of range. [G1]"); + error=tr("Unexpected error: Offset is out of range.").append(" [G1]"); return false; } memcpyFromLEnd32(&FieldSize, pField); pField += 4; pos += 4; if(pos >= (total_size + FieldSize)){ - error=tr("Unexpected error: Offset is out of range. [G2]"); + error=tr("Unexpected error: Offset is out of range.").append(" [G2]"); return false;} bRet = readGroupField(&group,Levels, FieldType, FieldSize, (quint8 *)pField); @@ -542,7 +543,7 @@ RootGroup.Handle=NULL; pField += FieldSize; pos += FieldSize; if(pos >= total_size) { - error=tr("Unexpected error: Offset is out of range. [G1]"); + error=tr("Unexpected error: Offset is out of range.").append(" [G1]"); return false;} } @@ -555,13 +556,13 @@ StdEntry entry; memcpyFromLEnd16(&FieldType, pField); pField += 2; pos += 2; if(pos >= total_size){ - error=tr("Unexpected error: Offset is out of range. [E1]"); + error=tr("Unexpected error: Offset is out of range.").append(" [E1]"); return false;} memcpyFromLEnd32(&FieldSize, pField); pField += 4; pos += 4; if(pos >= (total_size + FieldSize)) { - error=tr("Unexpected error: Offset is out of range. [E2]"); + error=tr("Unexpected error: Offset is out of range.").append(" [E2]"); return false; } bRet = readEntryField(&entry,FieldType,FieldSize,(quint8*)pField); @@ -574,7 +575,7 @@ StdEntry entry; pField += FieldSize; pos += FieldSize; if(pos >= total_size) { - error=tr("Unexpected error: Offset is out of range. [E3]"); + error=tr("Unexpected error: Offset is out of range.").append(" [E3]"); return false; } } @@ -1200,7 +1201,8 @@ bool Kdb3Database::save(){ NumGroups = Groups.size(); NumEntries = Entries.size()+UnknownMetaStreams.size()+MetaStreams.size(); - qSort(Entries.begin(),Entries.end(),StdEntryLessThan); + QList saveEntries = Entries; + qSort(saveEntries.begin(),saveEntries.end(),StdEntryLessThan); randomize(FinalRandomSeed,16); randomize(TransfRandomSeed,32); @@ -1209,7 +1211,7 @@ bool Kdb3Database::save(){ unsigned int pos=DB_HEADER_SIZE; // Skip the header, it will be written later serializeGroups(Groups,buffer,pos); - serializeEntries(Entries,buffer,pos); + serializeEntries(saveEntries,buffer,pos); serializeEntries(UnknownMetaStreams,buffer,pos); serializeEntries(MetaStreams,buffer,pos); SHA256::hashBuffer(buffer+DB_HEADER_SIZE,ContentsHash,pos-DB_HEADER_SIZE); diff --git a/src/Kdb3Database.h b/src/Kdb3Database.h index 8e3e29c..a20d92b 100644 --- a/src/Kdb3Database.h +++ b/src/Kdb3Database.h @@ -30,8 +30,7 @@ #define PWM_FLAG_TWOFISH 8 #define PWM_STD_KEYENCROUNDS 6000 -#include -#include +#include #include #include #include diff --git a/src/KpxConfig.cpp b/src/KpxConfig.cpp index 00f9bcc..7a1071b 100644 --- a/src/KpxConfig.cpp +++ b/src/KpxConfig.cpp @@ -22,10 +22,12 @@ ***************************************************************************/ #include "KpxConfig.h" -#include +#include +#include #include KpxConfig::KpxConfig(const QString& filePath) : settings(filePath,QSettings::IniFormat){ + configFile=filePath; if (settings.contains("Options/GroupTreeRestore") && !settings.contains("Options/GroupTreeState")){ switch (settings.value("Options/GroupTreeRestore",1).toInt()){ case 0: @@ -45,6 +47,34 @@ KpxConfig::KpxConfig(const QString& filePath) : settings(filePath,QSettings::Ini setUrlCmd(QString()); } +#ifdef GLOBAL_AUTOTYPE +Shortcut KpxConfig::globalShortcut(){ + Shortcut s; + s.key = settings.value("Options/GlobalShortcutKey",0).toUInt(); + QBitArray mods = settings.value("Options/GlobalShortcutMods",QBitArray(5)).toBitArray(); + if (mods.size()!=5) + mods = QBitArray(5); + s.ctrl = mods.testBit(0); + s.shift = mods.testBit(1); + s.alt = mods.testBit(2); + s.altgr = mods.testBit(3); + s.win = mods.testBit(4); + + return s; +} + +void KpxConfig::setGlobalShortcut(const Shortcut& s){ + settings.setValue("Options/GlobalShortcutKey", s.key); + QBitArray mods(5); + mods.setBit(0, s.ctrl); + mods.setBit(1, s.shift); + mods.setBit(2, s.alt); + mods.setBit(3, s.altgr); + mods.setBit(4, s.win); + settings.setValue("Options/GlobalShortcutMods", mods); +} +#endif + unsigned KpxConfig::fileDlgHistorySize(){ settings.beginGroup("FileDlgHistory"); unsigned res=static_cast(settings.childKeys().size()); @@ -183,3 +213,35 @@ QString KpxConfig::keyTypeToString(tKeyType keyType){ } return res; } + + +QString KpxConfig::detailViewTemplate(){ + if (settings.contains("UI/DetailsView")){ + return QString::fromUtf8( qUncompress(settings.value("UI/DetailsView").toByteArray()) ); + } + else{ + return defaultDetailViewTemplate(); + } +} + +QString KpxConfig::defaultDetailViewTemplate(){ + QFile templ(":/default-detailview.html"); + templ.open(QIODevice::ReadOnly); + QString value=QString::fromUtf8(templ.readAll()); + templ.close(); + value.replace("Group",QCoreApplication::translate("DetailViewTemplate","Group")); + value.replace("Title",QCoreApplication::translate("DetailViewTemplate","Title")); + value.replace("Username",QCoreApplication::translate("DetailViewTemplate","Username")); + value.replace("Password",QCoreApplication::translate("DetailViewTemplate","Password")); + value.replace("URL",QCoreApplication::translate("DetailViewTemplate","URL")); + value.replace("Creation",QCoreApplication::translate("DetailViewTemplate","Creation")); + value.replace("Last Access",QCoreApplication::translate("DetailViewTemplate","Last Access")); + value.replace("Last Modification",QCoreApplication::translate("DetailViewTemplate","Last Modification")); + value.replace("Expiration",QCoreApplication::translate("DetailViewTemplate","Expiration")); + value.replace("Comment",QCoreApplication::translate("DetailViewTemplate","Comment")); + return value; +} + +void KpxConfig::setDetailViewTemplate(const QString& value){ + settings.setValue("UI/DetailsView", qCompress(value.toUtf8(),9) ); +} diff --git a/src/KpxConfig.h b/src/KpxConfig.h index 1632057..5cf92c4 100644 --- a/src/KpxConfig.h +++ b/src/KpxConfig.h @@ -24,6 +24,7 @@ #define _KPXCONFIG_H_ #include "main.h" +#include "AutoType.h" #include #include #include @@ -43,6 +44,8 @@ class KpxConfig{ public: + friend class KpxBookmarks; + enum IntegrPluginType{NoIntegr,KDE,Gnome}; enum GrpTreeState{DoNothing,RestoreLast,ExpandAll}; @@ -56,6 +59,8 @@ public: QBitArray columns(){return stringToBitArray(settings.value("UI/Columns","11111000000").toString(),11);} QList columnOrder(){return stringToIntArray(settings.value("UI/ColumnOrder","100,100,100,100,100,100,100,100,100,100,100").toString(),11);} QList columnSizes(){return stringToIntArray(settings.value("UI/ColumnSizes","15,10,10,10,10,10,10,10,10,10,10").toString(),11);} + int columnSort(){return settings.value("UI/ColumnSort",0).toInt();} + Qt::SortOrder columnSortOrder(){return static_cast(settings.value("UI/ColumnSortOrder",Qt::AscendingOrder).toInt());} QStringList fileDlgHistory(unsigned index){return settings.value(QString("FileDlgHistory/ENTRY%1").arg(index)).toStringList();} GrpTreeState groupTreeState(){return stringToGrpTreeState(settings.value("Options/GroupTreeState").toString());} bool hidePasswords(){return settings.value("UI/HidePasswords",true).toBool();} @@ -68,6 +73,9 @@ public: tKeyType lastKeyType(){return stringToKeyType(settings.value("Options/LastKeyType").toString());} QRect mainWindowGeometry(const QRect& defaultValue){return settings.value("UI/MainWindowGeometry",defaultValue).toRect();} bool minimizeToTray(){return settings.value("Options/MinimizeToTray",false).toBool();} + bool minimizeTray(){return settings.value("Options/MinimizeTray",false).toBool();} + bool startMinimized(){return settings.value("Options/StartMinimized",false).toBool();} + bool startLocked(){return settings.value("Options/StartLocked",false).toBool();} QString mountDir(){return settings.value("Options/MountDir",DEFAULT_MOUNT_DIR).toString();} bool openLastFile(){return settings.value("Options/OpenLastFile",true).toBool();} QString pwGenCharList(){return settings.value("Options/PwGenCharList").toString();} @@ -80,15 +88,23 @@ public: bool showEntryDetails(){return settings.value("UI/ShowEntryDetails",true).toBool();} bool showPasswords(){return settings.value("Options/ShowPasswords",false).toBool();} bool showPasswordsPasswordDlg(){return settings.value("Options/ShowPasswordsPasswordDlg",false).toBool();} + bool lockOnMinimize(){return settings.value("Options/LockOnMinimize",false).toBool();} bool showStatusbar(){return settings.value("UI/ShowStatusbar",true).toBool();} bool showSysTrayIcon(){return settings.value("Options/ShowSysTrayIcon",false).toBool();} bool showToolbar(){return settings.value("UI/ShowToolbar",true).toBool();} int toolbarIconSize(){return settings.value("UI/ToolbarIconSize",16).toInt();} QString urlCmd(){return settings.value("Options/UrlCmd").toString();} + bool urlCmdDef(){return settings.value("Options/UrlCmdDef",true).toBool();} QByteArray vSplitterPos(){return settings.value("UI/VSplitterPos").toByteArray();} bool askBeforeDelete(){return settings.value("Options/AskBeforeDelete",true).toBool();} +#ifdef AUTOTYPE int autoTypePreGap(){return settings.value("Options/AutoTypePreGap",500).toInt();} int autoTypeKeyStrokeDelay(){return settings.value("Options/AutoTypeKeyStrokeDelay",0).toInt();} +#endif +#ifdef GLOBAL_AUTOTYPE + Shortcut globalShortcut(); + bool entryTitlesMatch(){return settings.value("Options/EntryTitlesMatch",true).toBool();} +#endif bool featureBookmarks(){return settings.value("Features/Bookmarks",true).toBool();} void setAlternatingRowColors(bool value){settings.setValue("Options/AlternatingRowColors",value);} @@ -99,6 +115,8 @@ public: void setColumns(const QBitArray& value){settings.setValue("UI/Columns",bitArrayToString(value));} void setColumnOrder(const QList& value){settings.setValue("UI/ColumnOrder",intArrayToString(value));} void setColumnSizes(const QList& value){settings.setValue("UI/ColumnSizes",intArrayToString(value));} + void setColumnSort(int value){settings.setValue("UI/ColumnSort",value);} + void setColumnSortOrder(int value){settings.setValue("UI/ColumnSortOrder",value);} void setFileDlgHistory(unsigned index,const QStringList& value){settings.setValue(QString("FileDlgHistory/ENTRY%1").arg(index), value);} void setGroupTreeState(GrpTreeState value){settings.setValue("Options/GroupTreeState",grpTreeStateToString(value));} void setHidePasswords(bool value){settings.setValue("UI/HidePasswords",value);} @@ -111,6 +129,9 @@ public: void setLastKeyType(tKeyType value){settings.setValue("Options/LastKeyType",keyTypeToString(value));} void setMainWindowGeometry(const QRect& value){settings.setValue("UI/MainWindowGeometry",value);} void setMinimizeToTray(bool value){settings.setValue("Options/MinimizeToTray",value);} + void setMinimizeTray(bool value){settings.setValue("Options/MinimizeTray",value);} + void setStartMinimized(bool value){settings.setValue("Options/StartMinimized",value);} + void setStartLocked(bool value){settings.setValue("Options/StartLocked",value);} void setMountDir(const QString& value){settings.setValue("Options/MountDir",value);} void setOpenLastFile(bool value){settings.setValue("Options/OpenLastFile",value);} void setPwGenCharList(const QString& value){settings.setValue("Options/PwGenCharList",value);} @@ -123,22 +144,35 @@ public: void setShowEntryDetails(bool value){settings.setValue("UI/ShowEntryDetails",value);} void setShowPasswords(bool value){settings.setValue("Options/ShowPasswords",value);} void setShowPasswordsPasswordDlg(bool value){settings.setValue("Options/ShowPasswordsPasswordDlg",value);} + void setLockOnMinimize(bool value){settings.setValue("Options/LockOnMinimize",value);} void setShowStatusbar(bool value){settings.setValue("UI/ShowStatusbar",value);} void setShowSysTrayIcon(bool value){settings.setValue("Options/ShowSysTrayIcon",value);} void setShowToolbar(bool value){settings.setValue("UI/ShowToolbar",value);} void setToolbarIconSize(int value){settings.setValue("UI/ToolbarIconSize",value);} void setUrlCmd(const QString& value){settings.setValue("Options/UrlCmd",value);} + void setUrlCmdDef(bool value){settings.setValue("Options/UrlCmdDef",value);} void setVSplitterPos(const QByteArray& value){settings.setValue("UI/VSplitterPos",value);} void setAskBeforeDelete(bool value){settings.setValue("Options/AskBeforeDelete",value);} +#ifdef AUTOTYPE void setAutoTypePreGap(int value){settings.setValue("Options/AutoTypePreGap",value);} void setAutoTypeKeyStrokeDelay(int value){settings.setValue("Options/AutoTypeKeyStrokeDelay",value);} +#endif +#ifdef GLOBAL_AUTOTYPE + void setGlobalShortcut(const Shortcut& s); + void setEntryTitlesMatch(bool value){settings.setValue("Options/EntryTitlesMatch",value);} +#endif void setFeatureBookmarks(bool value){settings.setValue("Features/Bookmarks",value);} unsigned fileDlgHistorySize(); void clearFileDlgHistory(){settings.remove("FileDlgHistory");}; + + QString detailViewTemplate(); + QString defaultDetailViewTemplate(); + void setDetailViewTemplate(const QString& value); private: QSettings settings; + QString configFile; QColor stringToColor(const QString& str); QBitArray stringToBitArray(const QString& str, unsigned count); diff --git a/src/crypto/sha256.h b/src/crypto/sha256.h index e3b852a..e6b851c 100755 --- a/src/crypto/sha256.h +++ b/src/crypto/sha256.h @@ -22,7 +22,7 @@ #ifndef _SHA256_H #define _SHA256_H -#include +#include typedef struct { diff --git a/src/crypto/twofish.cpp b/src/crypto/twofish.cpp index bd33b29..dddf87c 100755 --- a/src/crypto/twofish.cpp +++ b/src/crypto/twofish.cpp @@ -171,7 +171,8 @@ * Standard include files will probably be ok. */ -#include /* for memset(), memcpy(), and memcmp() */ +#include /* for memset(), memcpy(), and memcmp() */ +#include #include "twofish.h" @@ -476,7 +477,7 @@ void Twofish_fatal(char* msg){ - qCritical("Twofish: Fatal Error"); + qCritical("Twofish: Fatal Error: %s",msg); exit(1); } diff --git a/src/dialogs/AboutDlg.cpp b/src/dialogs/AboutDlg.cpp index 9fbb016..a440772 100755 --- a/src/dialogs/AboutDlg.cpp +++ b/src/dialogs/AboutDlg.cpp @@ -17,7 +17,7 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include +#include #include #include "AboutDlg.h" @@ -26,41 +26,42 @@ AboutDialog::AboutDialog(QWidget* parent):QDialog(parent) { setupUi(this); - createBanner(&BannerPixmap,getPixmap("keepassx_large"),tr("%1 %2").arg(APP_DISPLAY_NAME, APP_VERSION),width()); + createBanner(&BannerPixmap,getPixmap("keepassx_large"),QString("%1 %2").arg(APP_DISPLAY_NAME, APP_VERSION),width()); loadLicFromFile(); - labelAppName->setText(tr(APP_DISPLAY_NAME)); - labelAppFunc->setText(tr(" - %1").arg(APP_LONG_FUNC)); + labelAppName->setText(APP_DISPLAY_NAME); + labelAppFunc->setText(QString(" - ").append(APP_LONG_FUNC)); QString AboutTr=tr("Current Translation: None

","Please replace 'None' with the language of your translation"); if(TrActive){ AboutTr+=tr("Author: %1
").arg(tr("$TRANSLATION_AUTHOR")); QString mail=tr("$TRANSLATION_AUTHOR_EMAIL","Here you can enter your email or homepage if you want."); - if(mail!=QString()){ + if(!mail.isEmpty()){ AboutTr+=mail+"
"; } AboutTr+="
"; } - Edit_Translation->setHtml(AboutTr+tr("\ - Information on how to translate KeePassX can be found under:\n\ - http://keepassx.sourceforge.net/")); + Edit_Translation->setHtml(AboutTr+tr("Information on how to translate KeePassX can be found under:") + +"
http://keepassx.sourceforge.net/"); QString str; str+=""+tr("Team")+"
"; str+="
"; - str+=""+tr("Tarek Saidi")+"
"+tr("Developer, Project Admin")+"
"+tr("tarek_saidi@users.sf.net")+"
"; + str+="Tarek Saidi
"+tr("Developer, Project Admin")+"
tarek_saidi@users.sf.net
"; str+="
"; - str+=""+tr("Eugen Gorschenin")+"
"+tr("Web Designer")+"
"+tr("geugen@users.sf.de")+"
"; + str+="Eugen Gorschenin
"+tr("Web Designer")+"
geugen@users.sf.de
"; str+="
"; - str+=""+tr("Juan J González Cárdenas [Jota Jota]")+"
"+tr("Developer")+"
"+tr("myxelf@users.sf.net")+"
"; + str+="Juan J González Cárdenas [Jota Jota]
"+tr("Developer")+"
myxelf@users.sf.net
"; str+="

"; str+=""+tr("Thanks To")+"
"; str+="
"; - str+=""+tr("Matthias Miller")+"
"+tr("Patches for better MacOS X support")+"
"+tr("www.outofhanwell.com")+"
"; + str+="Matthias Miller
"+tr("Patches for better MacOS X support")+"
www.outofhanwell.com
"; str+="
"; - str+=""+tr("James Nicholls")+"
"+tr("Main Application Icon")/*+"
"+tr("mailto:???")*/+"
"; + str+="James Nicholls
"+tr("Main Application Icon")/*+"
"+tr("mailto:???")*/+"
"; str+="
"; - str+=""+tr("Constantin Makshin")+"
"+tr("Various fixes and improvements")+"
"+tr("dinosaur-rus@users.sourceforge.net")+"
"; + str+="Constantin Makshin
"+tr("Various fixes and improvements")+"
dinosaur-rus@users.sourceforge.net
"; Edit_Thanks->setHtml(str); + + connect(ButtonBox, SIGNAL(accepted()), SLOT(close())); } void AboutDialog::paintEvent(QPaintEvent *event){ @@ -87,7 +88,7 @@ return; if(!gpl.open(QIODevice::ReadOnly)){ QMessageBox::critical(this,tr("Error"),tr("Could not open file '%1'") - .arg("'license.txt'")+tr("The following error occured:\n%1").arg(gpl.errorString()) + .arg("'license.txt'")+"\n"+tr("The following error occured:")+"\n"+gpl.errorString() ,tr("OK"),0,0,2,1); return; } @@ -100,7 +101,7 @@ delete buffer; } void AboutDialog::OnHomepageClicked(){ -openBrowser(tr("http://keepassx.sf.net")); +openBrowser("http://keepassx.sf.net"); } void AboutDialog::OnEMailClicked(){ diff --git a/src/dialogs/AddBookmarkDlg.cpp b/src/dialogs/AddBookmarkDlg.cpp index 4bc797e..3323e2d 100644 --- a/src/dialogs/AddBookmarkDlg.cpp +++ b/src/dialogs/AddBookmarkDlg.cpp @@ -35,7 +35,7 @@ AddBookmarkDlg::AddBookmarkDlg(QWidget* parent, QString DefaultFilename, int _It if(ItemID==-1){ createBanner(&BannerPixmap,getPixmap("bookmark_add"),tr("Add Bookmark"),width()); - if(DefaultFilename==QString()) + if(DefaultFilename.isEmpty()) OnButtonBrowse(); else Edit_Filename->setText(DefaultFilename); diff --git a/src/dialogs/AutoTypeDlg.cpp b/src/dialogs/AutoTypeDlg.cpp new file mode 100644 index 0000000..422d0e5 --- /dev/null +++ b/src/dialogs/AutoTypeDlg.cpp @@ -0,0 +1,84 @@ +/*************************************************************************** + * Copyright (C) 2005-2008 by Felix Geyer * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; version 2 of the License. * + + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "AutoTypeDlg.h" +#include "KpxConfig.h" +#include +#include +#include + +AutoTypeDlg::AutoTypeDlg(QList entries, QList numbers){ + setupUi(this); + createBanner(&BannerPixmap,getPixmap("keepassx_large"),tr("Auto-Type"),width()); + setAttribute(Qt::WA_DeleteOnClose); + setWindowFlags(windowFlags()|Qt::WindowStaysOnTopHint); + setGeometry( QRect(QApplication::desktop()->screenGeometry(QCursor::pos()).center() - rect().center(), size()) ); + setWindowIcon(getIcon("keepassx")); + entryList->setAlternatingRowColors(config->alternatingRowColors()); + + QList itemList; + AutoTypeEntry autoTypeEntry; + for (int i=0; igroup()->title() << entries[i]->title(); + if (config->hideUsernames()) + cols << "****"; + else + cols << entries[i]->username(); + + QTreeWidgetItem* widgetItem = new QTreeWidgetItem(cols); + itemList.append(widgetItem); + autoTypeEntry.dbHandle = entries[i]; + autoTypeEntry.nr = numbers[i]; + itemToEntry.insert(widgetItem, autoTypeEntry); + } + + qSort(itemList.begin(), itemList.end(), itemLessThan); + for (int i=0; iaddTopLevelItem(itemList[i]); + + entryList->resizeColumnToContents(0); + entryList->resizeColumnToContents(1); + entryList->resizeColumnToContents(2); + + connect(ButtonBox, SIGNAL(rejected()), SLOT(close())); + connect(entryList, SIGNAL(itemClicked(QTreeWidgetItem*,int)), SLOT(itemSelected(QTreeWidgetItem*))); +} + +bool AutoTypeDlg::itemLessThan(QTreeWidgetItem* i1, QTreeWidgetItem* i2){ + if (i1->text(0) != i2->text(0)) + return i1->text(0) < i2->text(0); + else if (i1->text(1) != i2->text(1)) + return i1->text(1) < i2->text(1); + else + return i1->text(2) < i2->text(2); +} + +void AutoTypeDlg::paintEvent(QPaintEvent* event){ + QWidget::paintEvent(event); + QPainter painter(this); + painter.setClipRegion(event->region()); + painter.drawPixmap(QPoint(0,0),BannerPixmap); +} + +void AutoTypeDlg::itemSelected(QTreeWidgetItem* item){ + close(); + QString err; + AutoType::perform(itemToEntry[item].dbHandle,err,false,itemToEntry[item].nr); +} diff --git a/src/dialogs/AutoTypeDlg.h b/src/dialogs/AutoTypeDlg.h new file mode 100644 index 0000000..6f4ba9c --- /dev/null +++ b/src/dialogs/AutoTypeDlg.h @@ -0,0 +1,44 @@ +/*************************************************************************** + * Copyright (C) 2005-2008 by Felix Geyer * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; version 2 of the License. * + + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "ui_AutoTypeDlg.h" +#include "Database.h" + +class AutoTypeDlg : public QWidget, private Ui::AutoTypeDlg +{ + Q_OBJECT + + public: + AutoTypeDlg(QList entries, QList numbers); + + protected: + void paintEvent(QPaintEvent* event); + + private slots: + void itemSelected(QTreeWidgetItem* item); + + private: + struct AutoTypeEntry { + IEntryHandle* dbHandle; + int nr; + }; + static bool itemLessThan(QTreeWidgetItem* i1, QTreeWidgetItem* i2); + QHash itemToEntry; + QPixmap BannerPixmap; +}; diff --git a/src/dialogs/CustomizeDetailViewDlg.cpp b/src/dialogs/CustomizeDetailViewDlg.cpp index 4f5a641..9bb0622 100644 --- a/src/dialogs/CustomizeDetailViewDlg.cpp +++ b/src/dialogs/CustomizeDetailViewDlg.cpp @@ -27,6 +27,7 @@ #include #include "main.h" #include "CustomizeDetailViewDlg.h" +#include "KpxConfig.h" bool DisableButtonSlots=false; @@ -59,14 +60,14 @@ CustomizeDetailViewDialog::CustomizeDetailViewDialog(QWidget* parent):QDialog(pa connect(BtnBold,SIGNAL(toggled(bool)),this,SLOT(OnBtnBold(bool))); connect(BtnItalic,SIGNAL(toggled(bool)),this,SLOT(OnBtnItalic(bool))); connect(BtnUnderline,SIGNAL(toggled(bool)),this,SLOT(OnBtnUnderline(bool))); - connect(BtnAlignLeft,SIGNAL(toggled(bool)),this,SLOT(OnBtnAlignLeft(bool))); - connect(BtnAlignRight,SIGNAL(toggled(bool)),this,SLOT(OnBtnAlignRight(bool))); - connect(BtnAlignCenter,SIGNAL(toggled(bool)),this,SLOT(OnBtnAlignCenter(bool))); - connect(BtnAlignBlock,SIGNAL(toggled(bool)),this,SLOT(OnBtnAlignBlock(bool))); + connect(BtnAlignLeft,SIGNAL(toggled(bool)),this,SLOT(OnBtnAlignLeft())); + connect(BtnAlignRight,SIGNAL(toggled(bool)),this,SLOT(OnBtnAlignRight())); + connect(BtnAlignCenter,SIGNAL(toggled(bool)),this,SLOT(OnBtnAlignCenter())); + connect(BtnAlignBlock,SIGNAL(toggled(bool)),this,SLOT(OnBtnAlignBlock())); connect(BtnColor,SIGNAL(clicked()),this,SLOT(OnBtnColor())); - connect(ButtonSave,SIGNAL(clicked()),this,SLOT(OnSave())); - connect(ButtonCancel,SIGNAL(clicked()),this,SLOT(OnCancel())); - connect(ButtonRestore,SIGNAL(clicked()),this,SLOT(OnRestoreDefault())); + connect(ButtonBox,SIGNAL(accepted()),this,SLOT(OnSave())); + connect(ButtonBox,SIGNAL(rejected()),this,SLOT(OnCancel())); + connect(ButtonBox,SIGNAL(clicked(QAbstractButton*)),this,SLOT(OnRestoreDefault(QAbstractButton*))); connect(tmplmenu,SIGNAL(triggered(QAction*)),this,SLOT(OnInsertTemplate(QAction*))); connect(RichEdit,SIGNAL(cursorPositionChanged()),this,SLOT(OnCursorPositionChanged())); connect(TabWidget,SIGNAL(currentChanged(int)),this,SLOT(OnTabChanged(int))); @@ -160,25 +161,25 @@ void CustomizeDetailViewDialog::OnBtnUnderline(bool toggled){ } -void CustomizeDetailViewDialog::OnBtnAlignLeft(bool toggled){ +void CustomizeDetailViewDialog::OnBtnAlignLeft(){ if(DisableButtonSlots)return; RichEdit->setAlignment(Qt::AlignLeft); OnCursorPositionChanged(); } -void CustomizeDetailViewDialog::OnBtnAlignRight(bool toggled){ +void CustomizeDetailViewDialog::OnBtnAlignRight(){ if(DisableButtonSlots)return; RichEdit->setAlignment(Qt::AlignRight); OnCursorPositionChanged(); } -void CustomizeDetailViewDialog::OnBtnAlignCenter(bool toggled){ +void CustomizeDetailViewDialog::OnBtnAlignCenter(){ if(DisableButtonSlots)return; RichEdit->setAlignment(Qt::AlignHCenter); OnCursorPositionChanged(); } -void CustomizeDetailViewDialog::OnBtnAlignBlock(bool toggled){ +void CustomizeDetailViewDialog::OnBtnAlignBlock(){ if(DisableButtonSlots)return; RichEdit->setAlignment(Qt::AlignJustify); OnCursorPositionChanged(); @@ -203,6 +204,8 @@ void CustomizeDetailViewDialog::OnSave(){ else if(TabWidget->currentIndex()==1) DetailViewTemplate=HtmlEdit->toPlainText(); + config->setDetailViewTemplate(DetailViewTemplate); + done(1); } @@ -210,8 +213,10 @@ void CustomizeDetailViewDialog::OnCancel(){ done(0); } -void CustomizeDetailViewDialog::OnRestoreDefault(){ - loadDefaultDetailViewTemplate(); - HtmlEdit->setPlainText(DetailViewTemplate); - RichEdit->setHtml(DetailViewTemplate); +void CustomizeDetailViewDialog::OnRestoreDefault(QAbstractButton* button){ + if (button==ButtonBox->button(QDialogButtonBox::RestoreDefaults)){ + DetailViewTemplate = config->defaultDetailViewTemplate(); + HtmlEdit->setPlainText(DetailViewTemplate); + RichEdit->setHtml(DetailViewTemplate); + } } diff --git a/src/dialogs/CustomizeDetailViewDlg.h b/src/dialogs/CustomizeDetailViewDlg.h index 17ad844..1e7844d 100644 --- a/src/dialogs/CustomizeDetailViewDlg.h +++ b/src/dialogs/CustomizeDetailViewDlg.h @@ -20,7 +20,7 @@ #ifndef _CUSTOMIZE_DETAIL_VIEW_H_ #define _CUSTOMIZE_DETAIL_VIEW_H_ -#include "ui_CustomizeDetailViewDlg.h"; +#include "ui_CustomizeDetailViewDlg.h" #include #include @@ -33,14 +33,14 @@ class CustomizeDetailViewDialog : public QDialog, public Ui_CustomizeDetailViewD void OnBtnBold(bool); void OnBtnItalic(bool); void OnBtnUnderline(bool); - void OnBtnAlignLeft(bool); - void OnBtnAlignRight(bool); - void OnBtnAlignCenter(bool); - void OnBtnAlignBlock(bool); + void OnBtnAlignLeft(); + void OnBtnAlignRight(); + void OnBtnAlignCenter(); + void OnBtnAlignBlock(); void OnBtnColor(); void OnSave(); void OnCancel(); - void OnRestoreDefault(); + void OnRestoreDefault(QAbstractButton* button); void OnInsertTemplate(QAction*); void OnCursorPositionChanged(); void OnTabChanged(int index); diff --git a/src/dialogs/DatabaseSettingsDlg.cpp b/src/dialogs/DatabaseSettingsDlg.cpp index eba87df..107e5b5 100755 --- a/src/dialogs/DatabaseSettingsDlg.cpp +++ b/src/dialogs/DatabaseSettingsDlg.cpp @@ -37,8 +37,8 @@ CDbSettingsDlg::CDbSettingsDlg(QWidget* parent,IDatabase* db, bool modal, Qt::W ComboAlgo->insertItem(1,tr("Twofish: 256 Bit")); ComboAlgo->setCurrentIndex(database->cryptAlgorithm()); //Achtung: AlgoID muss gleich dem ComboBox Index sein! EditRounds->setText(QString::number(database->keyTransfRounds())); - connect( ButtonOK, SIGNAL( clicked() ), this, SLOT( OnOK() ) ); - connect( ButtonCancel, SIGNAL( clicked() ), this, SLOT( OnCancel() ) ); + connect( ButtonBox, SIGNAL( accepted() ), this, SLOT( OnOK() ) ); + connect( ButtonBox, SIGNAL( rejected() ), this, SLOT( OnCancel() ) ); } CDbSettingsDlg::~CDbSettingsDlg() diff --git a/src/dialogs/DatabaseSettingsDlg.h b/src/dialogs/DatabaseSettingsDlg.h index 867c335..0327192 100755 --- a/src/dialogs/DatabaseSettingsDlg.h +++ b/src/dialogs/DatabaseSettingsDlg.h @@ -26,7 +26,7 @@ #include "Database.h" #include -class CDbSettingsDlg : public QDialog, public Ui_dbsettingdlg_base +class CDbSettingsDlg : public QDialog, public Ui_DatabaseSettingsDlg { Q_OBJECT public: diff --git a/src/dialogs/EditEntryDlg.cpp b/src/dialogs/EditEntryDlg.cpp index 61201ee..ee22158 100755 --- a/src/dialogs/EditEntryDlg.cpp +++ b/src/dialogs/EditEntryDlg.cpp @@ -20,21 +20,16 @@ #include "main.h" #include "KpxConfig.h" -#include -#include -#include -#include -#include +#include +#include #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include #include -#include -#include +#include +#include #include #include #include @@ -59,8 +54,8 @@ CEditEntryDlg::CEditEntryDlg(IDatabase* _db, IEntryHandle* _entry,QWidget* paren connect(Edit_Title, SIGNAL(textChanged(const QString&)), this, SLOT( OnTitleTextChanged(const QString&))); connect(Edit_Password_w, SIGNAL(editingFinished()), this, SLOT(OnPasswordwLostFocus())); - connect(Edit_Password_w, SIGNAL(textChanged(const QString&)), this, SLOT( OnPasswordwTextChanged(const QString&))); - connect(Edit_Password, SIGNAL(textChanged(const QString&)), this, SLOT( OnPasswordTextChanged(const QString&))); + connect(Edit_Password_w, SIGNAL(textChanged(const QString&)), this, SLOT( OnPasswordwTextChanged())); + connect(Edit_Password, SIGNAL(textChanged(const QString&)), this, SLOT( OnPasswordTextChanged())); connect(ButtonEchoMode, SIGNAL(clicked()), this, SLOT( ChangeEchoMode())); connect(buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT( OnButtonCancel())); connect(ButtonOpenAttachment, SIGNAL(clicked()), this, SLOT( OnNewAttachment())); @@ -71,7 +66,7 @@ CEditEntryDlg::CEditEntryDlg(IDatabase* _db, IEntryHandle* _entry,QWidget* paren connect(CheckBox_ExpiresNever,SIGNAL(stateChanged(int)),this,SLOT(OnCheckBoxExpiresNeverChanged(int))); connect(Button_Icons,SIGNAL(clicked()),this,SLOT(OnButtonIcons())); connect(ExpirePresetsMenu,SIGNAL(triggered(QAction*)),this,SLOT(OnExpirePreset(QAction*))); - connect(ButtonExpirePresets,SIGNAL(triggered(QAction*)),this,SLOT(OnCalendar(QAction*))); + connect(ButtonExpirePresets,SIGNAL(triggered(QAction*)),this,SLOT(OnCalendar())); // QAction::data() contains the time until expiration in days. ExpirePresetsMenu->addAction(tr("Today"))->setData(0); @@ -281,7 +276,7 @@ void CEditEntryDlg::OnTitleTextChanged(const QString& txt) setWindowTitle((txt=="") ? tr("[Untitled Entry]") : txt); } -void CEditEntryDlg::OnPasswordTextChanged(const QString& txt) +void CEditEntryDlg::OnPasswordTextChanged() { Edit_Password_w->setText(QString()); int bits=(Edit_Password->text().length()*8); @@ -290,7 +285,7 @@ if(bits>128)bits=128; Progress_Quali->setValue(100*bits/128); } -void CEditEntryDlg::OnPasswordwTextChanged(const QString& w) +void CEditEntryDlg::OnPasswordwTextChanged() { if(QString::compare(Edit_Password_w->text(),Edit_Password->text().mid(0,(Edit_Password_w->text().length())))!=0){ @@ -430,7 +425,7 @@ void CEditEntryDlg::OnExpirePreset(QAction* action){ DateTime_Expire->setTime(QTime(0,0,0)); } -void CEditEntryDlg::OnCalendar(QAction* action){ +void CEditEntryDlg::OnCalendar(){ CalendarDialog dlg(this); if(dlg.exec()==QDialog::Accepted){ CheckBox_ExpiresNever->setChecked(false); diff --git a/src/dialogs/EditEntryDlg.h b/src/dialogs/EditEntryDlg.h index 72c7bbb..1d7aa12 100755 --- a/src/dialogs/EditEntryDlg.h +++ b/src/dialogs/EditEntryDlg.h @@ -48,8 +48,8 @@ class CEditEntryDlg : public QDialog, public Ui_EditEntryDialog public slots: void OnTitleTextChanged(const QString&); void OnPasswordwLostFocus(); - void OnPasswordwTextChanged(const QString&); - void OnPasswordTextChanged(const QString&); + void OnPasswordwTextChanged(); + void OnPasswordTextChanged(); void ChangeEchoMode(); void OnButtonCancel(); void OnNewAttachment(); @@ -60,7 +60,7 @@ class CEditEntryDlg : public QDialog, public Ui_EditEntryDialog void OnButtonIcons(); void OnButtonOK(); void OnExpirePreset(QAction*); - void OnCalendar(QAction*); + void OnCalendar(); private: virtual void showEvent(QShowEvent *); diff --git a/src/dialogs/EditGroupDlg.cpp b/src/dialogs/EditGroupDlg.cpp index fe3d34d..b3b9a5d 100755 --- a/src/dialogs/EditGroupDlg.cpp +++ b/src/dialogs/EditGroupDlg.cpp @@ -20,8 +20,6 @@ #include "main.h" -#include -#include #include #include "EditGroupDlg.h" #include "SelectIconDlg.h" @@ -35,8 +33,8 @@ CEditGroupDialog::CEditGroupDialog(IDatabase* database,IGroupHandle* Handle,QWid group=new CGroup(); group->Title=handle->title(); group->Image=handle->image(); - connect( ButtonOK, SIGNAL( clicked() ), this, SLOT( OnOK() ) ); - connect( ButtonCancel, SIGNAL( clicked() ), this, SLOT( OnCancel() ) ); + connect( ButtonBox, SIGNAL( accepted() ), this, SLOT( OnOK() ) ); + connect( ButtonBox, SIGNAL( rejected() ), this, SLOT( OnCancel() ) ); connect( Button_Icon, SIGNAL( clicked() ), this, SLOT( OnIconDlg() )); } @@ -48,8 +46,8 @@ CEditGroupDialog::CEditGroupDialog(IDatabase* database,CGroup* Group,QWidget* pa db=database; group=Group; handle=NULL; - connect( ButtonOK, SIGNAL( clicked() ), this, SLOT( OnOK() ) ); - connect( ButtonCancel, SIGNAL( clicked() ), this, SLOT( OnCancel() ) ); + connect( ButtonBox, SIGNAL( accepted() ), this, SLOT( OnOK() ) ); + connect( ButtonBox, SIGNAL( rejected() ), this, SLOT( OnCancel() ) ); connect( Button_Icon, SIGNAL( clicked() ), this, SLOT( OnIconDlg() )); } diff --git a/src/dialogs/EditGroupDlg.h b/src/dialogs/EditGroupDlg.h index 02e28bb..d57070a 100755 --- a/src/dialogs/EditGroupDlg.h +++ b/src/dialogs/EditGroupDlg.h @@ -22,7 +22,7 @@ #define EDITGROUPDLG_H #include "ui_EditGroupDlg.h" -#include +#include #include #include "Database.h" diff --git a/src/dialogs/ExpiredEntriesDlg.cpp b/src/dialogs/ExpiredEntriesDlg.cpp index f2ceb3e..fc16507 100644 --- a/src/dialogs/ExpiredEntriesDlg.cpp +++ b/src/dialogs/ExpiredEntriesDlg.cpp @@ -39,7 +39,7 @@ ExpiredEntriesDialog::ExpiredEntriesDialog(QWidget* parent,IDatabase* database,c item->setIcon(1,database->icon(Entries[i]->image())); } - connect(treeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(OnItemDoubleClicked(QTreeWidgetItem*,int))); + connect(treeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(OnItemDoubleClicked(QTreeWidgetItem*))); } @@ -55,7 +55,7 @@ void ExpiredEntriesDialog::resizeEvent(QResizeEvent* event){ QDialog::resizeEvent(event); } -void ExpiredEntriesDialog::OnItemDoubleClicked(QTreeWidgetItem* item, int column){ +void ExpiredEntriesDialog::OnItemDoubleClicked(QTreeWidgetItem* item){ SelectedEntry=Entries[item->data(0,Qt::UserRole).toInt()]; accept(); } diff --git a/src/dialogs/ExpiredEntriesDlg.h b/src/dialogs/ExpiredEntriesDlg.h index c916e2d..8730d67 100644 --- a/src/dialogs/ExpiredEntriesDlg.h +++ b/src/dialogs/ExpiredEntriesDlg.h @@ -38,7 +38,7 @@ class ExpiredEntriesDialog:public QDialog, public Ui_ExpiredEntriesDialog{ virtual void resizeEvent(QResizeEvent *); private slots: - void OnItemDoubleClicked(QTreeWidgetItem*,int); + void OnItemDoubleClicked(QTreeWidgetItem*); }; diff --git a/src/dialogs/ManageBookmarksDlg.cpp b/src/dialogs/ManageBookmarksDlg.cpp index d132371..6a8e9fd 100644 --- a/src/dialogs/ManageBookmarksDlg.cpp +++ b/src/dialogs/ManageBookmarksDlg.cpp @@ -128,4 +128,4 @@ void ManageBookmarksDlg::closeEvent(QCloseEvent * event){ } KpxBookmarks::resort(Order); event->accept(); -} \ No newline at end of file +} diff --git a/src/dialogs/PasswordDlg.cpp b/src/dialogs/PasswordDlg.cpp index 143f3f3..5eb2573 100755 --- a/src/dialogs/PasswordDlg.cpp +++ b/src/dialogs/PasswordDlg.cpp @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include @@ -56,7 +55,7 @@ CPasswordDialog::CPasswordDialog(QWidget* parent,QString filename,IDatabase* DB, } Combo_Dirs->setEditText(QString()); - if(config->rememberLastKey() && !ChangeKeyMode){ + if(config->rememberLastKey() && config->openLastFile() && !ChangeKeyMode){ switch(config->lastKeyType()){ case KEYFILE: setStateKeyFileOnly(); @@ -101,24 +100,22 @@ CPasswordDialog::CPasswordDialog(QWidget* parent,QString filename,IDatabase* DB, } connect(Combo_Dirs, SIGNAL( editTextChanged(const QString&) ),this, SLOT( OnComboTextChanged(const QString&))); - connect(ButtonCancel, SIGNAL( clicked() ), this, SLOT( OnCancel() ) ); + connect(ButtonBox, SIGNAL( rejected() ), this, SLOT( OnCancel() ) ); connect(Edit_Password, SIGNAL( textChanged(const QString&) ), this, SLOT( OnPasswordChanged(const QString&) ) ); connect(CheckBox_Both, SIGNAL( stateChanged(int) ), this, SLOT( OnCheckBox_BothChanged(int) ) ); connect(ButtonChangeEchoMode, SIGNAL( clicked() ), this, SLOT( ChangeEchoModeDatabaseKey() ) ); connect(Edit_Password, SIGNAL( returnPressed() ), this, SLOT( OnOK() ) ); connect(Edit_PasswordRep, SIGNAL( returnPressed() ), this, SLOT( OnOK() ) ); - connect(ButtonExit, SIGNAL( clicked()),this,SLOT(OnButtonExit())); connect(BookmarkMenu,SIGNAL(triggered(QAction*)),this,SLOT(OnBookmarkTriggered(QAction*))); - ButtonExit->setVisible(IsAuto); Mode_Set=ChangeKeyMode; if(!ChangeKeyMode){ Edit_PasswordRep->hide(); Label_PasswordRep->hide(); - connect( ButtonOK, SIGNAL( clicked() ), this, SLOT( OnOK() ) ); + connect( ButtonBox, SIGNAL( accepted() ), this, SLOT( OnOK() ) ); connect( ButtonBrowse, SIGNAL( clicked() ), this, SLOT( OnButtonBrowse() ) ); }else{ - connect( ButtonOK, SIGNAL( clicked() ), this, SLOT( OnOK_Set() ) ); + connect( ButtonBox, SIGNAL( accepted() ), this, SLOT( OnOK_Set() ) ); connect( ButtonBrowse, SIGNAL( clicked() ), this, SLOT( OnButtonBrowse_Set() ) ); } @@ -168,7 +165,7 @@ void CPasswordDialog::setStateBoth(){ void CPasswordDialog::OnButtonBrowse() { QString filename=KpxFileDialogs::openExistingFile(this,"PasswordDlg",tr("Select a Key File"), - QStringList() << tr("All Files (*)") << tr("Key Files (*.key)")); + QStringList() << tr("Key Files (*.key)") << tr("All Files (*)")); if(filename!=QString()){ Combo_Dirs->setEditText(filename); } @@ -178,7 +175,7 @@ void CPasswordDialog::OnButtonBrowse() void CPasswordDialog::OnButtonBrowse_Set() { QString filename=KpxFileDialogs::saveFile(this,"PasswordDlg",tr("Select a Key File"), - QStringList() << tr("All Files (*)") << tr("Key Files (*.key)"), + QStringList() << tr("Key Files (*.key)") << tr("All Files (*)"), false); if(filename!=QString()){ Combo_Dirs->setEditText(filename); @@ -307,14 +304,14 @@ bool CPasswordDialog::doAuth(){ if(!password.isEmpty() && keyfile.isEmpty()){ DbAuth->authByPwd(password); } - if(password.isEmpty() && !keyfile.isEmpty()){ + else if(password.isEmpty() && !keyfile.isEmpty()){ if(!DbAuth->authByFile(keyfile))return false; } - if(!password.isEmpty() && !keyfile.isEmpty()){ - if(!DbAuth->authByFile(keyfile))return false; + else if(!password.isEmpty() && !keyfile.isEmpty()){ + if(!DbAuth->authByFileAndPwd(password, keyfile))return false; } - if(config->rememberLastKey()){ + if(config->rememberLastKey() && config->openLastFile()){ QString KeyLocation=keyfile; if(config->saveRelativePaths()){ KeyLocation=KeyLocation.left(KeyLocation.lastIndexOf("/")); @@ -371,11 +368,6 @@ else{ Edit_PasswordRep->setEchoMode(QLineEdit::Normal);} } - -void CPasswordDialog::OnButtonExit(){ - done(2); -} - void CPasswordDialog::paintEvent(QPaintEvent* event){ QDialog::paintEvent(event); QPainter painter(this); diff --git a/src/dialogs/PasswordDlg.h b/src/dialogs/PasswordDlg.h index d3e723a..372aa42 100755 --- a/src/dialogs/PasswordDlg.h +++ b/src/dialogs/PasswordDlg.h @@ -48,15 +48,14 @@ class CPasswordDialog : public QDialog, public Ui_PasswordDlg QString BookmarkFilename; tKeyType KeyType; bool OverwriteKeyFile; - CPasswordDialog(QWidget* parent,QString filename,IDatabase* DB,bool ShowExitButton = false, bool KeyMode_Set=false); + CPasswordDialog(QWidget* parent,QString filename,IDatabase* DB,bool IsAuto=false,bool ChangeKeyMode=false); - public slots: + private slots: void OnOK(); void OnOK_Set(); void OnCancel(); void OnButtonBrowse(); void OnButtonBrowse_Set(); - void OnButtonExit(); void OnPasswordChanged(const QString &txt); void OnCheckBox_BothChanged(int state); void ChangeEchoModeDatabaseKey(); diff --git a/src/dialogs/PasswordGenDlg.cpp b/src/dialogs/PasswordGenDlg.cpp index 719e872..d211a7a 100755 --- a/src/dialogs/PasswordGenDlg.cpp +++ b/src/dialogs/PasswordGenDlg.cpp @@ -58,12 +58,12 @@ CGenPwDialog::CGenPwDialog(QWidget* parent, bool StandAloneMode,Qt::WFlags fl) connect(Edit_chars,SIGNAL(textEdited(const QString&)),this,SLOT(OnCharsChanged(const QString&))); if(!StandAloneMode){ - AcceptButton=DialogButtons->addButton(tr("Accept"),QDialogButtonBox::AcceptRole); + AcceptButton=DialogButtons->addButton(QDialogButtonBox::Ok); AcceptButton->setDisabled(true); DialogButtons->addButton(QDialogButtonBox::Cancel); } else{ - DialogButtons->addButton(tr("OK"),QDialogButtonBox::AcceptRole); + DialogButtons->addButton(QDialogButtonBox::Close); AcceptButton=NULL; } @@ -259,7 +259,7 @@ void CGenPwDialog::estimateQuality(){ Progress_Quali->setFormat(tr("%1 Bits").arg((int)bits)); Progress_Quali->update(); if(bits>128)bits=128; - Progress_Quali->setValue(bits); + Progress_Quali->setValue((int)bits); } void CGenPwDialog::OnCharsChanged(const QString& str){ diff --git a/src/dialogs/SearchDlg.cpp b/src/dialogs/SearchDlg.cpp index 79ef148..bcb4acd 100755 --- a/src/dialogs/SearchDlg.cpp +++ b/src/dialogs/SearchDlg.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -32,8 +33,9 @@ SearchDialog::SearchDialog(IDatabase* database,IGroupHandle* Group,QWidget* parent):QDialog(parent) { setupUi(this); + QPushButton* Button_Search = ButtonBox->addButton(tr("Search"),QDialogButtonBox::ActionRole); connect( Button_Search, SIGNAL( clicked() ), this, SLOT( OnSearch() ) ); - connect( Button_Close, SIGNAL( clicked() ), this, SLOT( OnClose() ) ); + connect( ButtonBox, SIGNAL( rejected() ), this, SLOT( OnClose() ) ); db=database; group=Group; createBanner(&BannerPixmap,getPixmap("search"),tr("Search"),width()); diff --git a/src/dialogs/SelectIconDlg.cpp b/src/dialogs/SelectIconDlg.cpp index fef205f..b3dc6fe 100644 --- a/src/dialogs/SelectIconDlg.cpp +++ b/src/dialogs/SelectIconDlg.cpp @@ -22,12 +22,12 @@ #include #include #include +#include #include #include #include "SelectIconDlg.h" - CSelectIconDlg::CSelectIconDlg(IDatabase* database,int CurrentId,QWidget* parent, bool modal, Qt::WFlags fl):QDialog(parent,fl){ setupUi(this); db=database; @@ -35,12 +35,14 @@ CSelectIconDlg::CSelectIconDlg(IDatabase* database,int CurrentId,QWidget* parent CtxMenu=new QMenu(this); ReplaceAction=CtxMenu->addAction(getIcon("swap"),tr("Replace...")); DeleteAction=CtxMenu->addAction(getIcon("delete"),tr("Delete")); + QPushButton* Button_AddIcon = ButtonBox->addButton(tr("Add Custom Icon"), QDialogButtonBox::ActionRole); + Button_PickIcon = ButtonBox->addButton(tr("Pick"), QDialogButtonBox::AcceptRole); connect(Button_AddIcon, SIGNAL(clicked()), this, SLOT(OnAddIcon())); connect(Button_PickIcon, SIGNAL(clicked()), this, SLOT(OnPickIcon())); - connect(Button_Cancel, SIGNAL(clicked()), this, SLOT(OnCancel())); + connect(ButtonBox, SIGNAL(rejected()), this, SLOT(OnCancel())); connect(DeleteAction,SIGNAL(triggered()),this,SLOT(OnDelete())); connect(ReplaceAction,SIGNAL(triggered()),this,SLOT(OnReplace())); - connect(List,SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),this,SLOT(OnSelectionChanged(QListWidgetItem*,QListWidgetItem*))); + connect(List,SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),this,SLOT(OnSelectionChanged(QListWidgetItem*))); } void CSelectIconDlg::updateView(){ @@ -64,12 +66,12 @@ void CSelectIconDlg::OnAddIcon(){ for(int i=0;i(db)->addIcon(icon.scaled(16,16,Qt::KeepAspectRatio,Qt::SmoothTransformation)); } if(errors.size()) - QMessageBox::warning(this,tr("Error"),tr("An error occured while loading the icon(s):\n%1").arg(errors)); + QMessageBox::warning(this,tr("Error"),tr("An error occured while loading the icon(s):").append("\n").append(errors)); updateView(); List->setCurrentItem(List->item(List->count()-1)); } @@ -96,7 +98,7 @@ void CSelectIconDlg::OnDelete(){ void CSelectIconDlg::OnReplace(){ QString filename=QFileDialog::getOpenFileName(this,tr("Add Icons..."),QDir::homePath(),tr("Images (%1)") .arg("*.png *.jpeg *.jpg *.bmp *.gif *.bpm *.pgm *.ppm *.xbm *xpm")); - if(filename==QString())return; + if(filename.isEmpty())return; QPixmap icon; if(!icon.load(filename)){ QMessageBox::warning(this,tr("Error"),tr("An error occured while loading the icon.")); @@ -114,7 +116,7 @@ void CSelectIconDlg::OnCancel(){ done(-1); } -void CSelectIconDlg::OnSelectionChanged(QListWidgetItem* cur,QListWidgetItem* prev){ +void CSelectIconDlg::OnSelectionChanged(QListWidgetItem* cur){ Button_PickIcon->setEnabled(cur); } diff --git a/src/dialogs/SelectIconDlg.h b/src/dialogs/SelectIconDlg.h index 2ef9b1f..4eab889 100644 --- a/src/dialogs/SelectIconDlg.h +++ b/src/dialogs/SelectIconDlg.h @@ -39,7 +39,7 @@ public slots: void OnCancel(); void OnDelete(); void OnReplace(); - void OnSelectionChanged(QListWidgetItem*,QListWidgetItem*); + void OnSelectionChanged(QListWidgetItem*); private: int Id; @@ -48,6 +48,7 @@ private: QMenu* CtxMenu; QAction* DeleteAction; QAction* ReplaceAction; + QPushButton* Button_PickIcon; protected: virtual void contextMenuEvent(QContextMenuEvent *event); diff --git a/src/dialogs/SettingsDlg.cpp b/src/dialogs/SettingsDlg.cpp index 376e4e4..2d13672 100755 --- a/src/dialogs/SettingsDlg.cpp +++ b/src/dialogs/SettingsDlg.cpp @@ -19,11 +19,8 @@ #include "main.h" #include "KpxConfig.h" -#include -#include -#include -#include -#include +#include +#include #include #include #include @@ -40,29 +37,49 @@ CSettingsDlg::CSettingsDlg(QWidget* parent):QDialog(parent,Qt::Dialog) connect(DialogButtons, SIGNAL( accepted() ), this, SLOT( OnOK() ) ); connect(DialogButtons, SIGNAL( rejected() ), this, SLOT( OnCancel() ) ); connect(DialogButtons, SIGNAL( clicked(QAbstractButton*)), this, SLOT(OnOtherButton(QAbstractButton*))); - + + connect(CheckBox_ShowSysTrayIcon, SIGNAL( toggled(bool) ), CheckBox_CloseToTray, SLOT( setEnabled(bool) ) ); + connect(CheckBox_ShowSysTrayIcon, SIGNAL( toggled(bool) ), CheckBox_MinimizeTray, SLOT( setEnabled(bool) ) ); + connect(CheckBox_OpenLast, SIGNAL( toggled(bool) ), CheckBox_RememberLastKey, SLOT( setEnabled(bool) ) ); + connect(CheckBox_OpenLast, SIGNAL( toggled(bool) ), CheckBox_StartMinimized, SLOT( setEnabled(bool) ) ); + connect(CheckBox_OpenLast, SIGNAL( toggled(bool) ), CheckBox_StartLocked, SLOT( setEnabled(bool) ) ); + connect(Button_ClearFileDlgHistory, SIGNAL(clicked()), &fileDlgHistory, SLOT(clear())); connect(ButtonColor1, SIGNAL( clicked() ), this, SLOT( OnColor1() ) ); connect(ButtonColor2, SIGNAL( clicked() ), this, SLOT( OnColor2() ) ); connect(ButtonTextColor, SIGNAL( clicked() ), this, SLOT( OnTextColor() ) ); - connect(CheckBox_OpenLast,SIGNAL(stateChanged(int)),this,SLOT(OnCheckBoxOpenLastChanged(int))); connect(Button_MountDirBrowse,SIGNAL(clicked()),this,SLOT(OnMountDirBrowse())); + connect(Button_BrowserCmdBrowse,SIGNAL(clicked()),this,SLOT(OnBrowserCmdBrowse())); - connect(Radio_IntPlugin_None,SIGNAL(toggled(bool)),this,SLOT(OnIntPluginNone(bool))); - connect(Radio_IntPlugin_Gnome,SIGNAL(toggled(bool)),this,SLOT(OnIntPluginGnome(bool))); - connect(Radio_IntPlugin_Kde,SIGNAL(toggled(bool)),this,SLOT(OnIntPluginKde(bool))); + connect(Radio_IntPlugin_None,SIGNAL(toggled(bool)),this,SLOT(OnIntPluginNone())); + connect(Radio_IntPlugin_Gnome,SIGNAL(toggled(bool)),this,SLOT(OnIntPluginGnome())); + connect(Radio_IntPlugin_Kde,SIGNAL(toggled(bool)),this,SLOT(OnIntPluginKde())); - connect(CheckBox_BrowserDefault,SIGNAL(stateChanged(int)),this,SLOT(OnCheckBoxBrowserDefaultChanged(int))); connect(Button_CustomizeEntryDetails,SIGNAL(clicked()),this,SLOT(OnCustomizeEntryDetails())); - + +#if !defined(AUTOTYPE) + Box_AutoType->setVisible(false); +#endif +#if !defined(GLOBAL_AUTOTYPE) + Label_GlobalShortcut->setVisible(false); + Edit_GlobalShortcut->setVisible(false); +#endif + +#ifdef GLOBAL_AUTOTYPE + pShortcut = AutoType::shortcut; + connect(this,SIGNAL(rejected()),SLOT(resetGlobalShortcut())); +#endif createBanner(&BannerPixmap,getPixmap("appsettings"),tr("Settings"),width()); //General CheckBox_OpenLast->setChecked(config->openLastFile()); CheckBox_RememberLastKey->setChecked(config->rememberLastKey()); - checkBox_ShowSysTrayIcon->setChecked(config->showSysTrayIcon()); - checkBox_MinimizeToTray->setChecked(config->minimizeToTray()); + CheckBox_ShowSysTrayIcon->setChecked(config->showSysTrayIcon()); + CheckBox_CloseToTray->setChecked(config->minimizeToTray()); + CheckBox_MinimizeTray->setChecked(config->minimizeTray()); + CheckBox_StartMinimized->setChecked(config->startMinimized()); + CheckBox_StartLocked->setChecked(config->startLocked()); checkBox_SaveFileDlgHistory->setChecked(config->saveFileDlgHistory()); checkBox_AskBeforeDelete->setChecked(config->askBeforeDelete()); @@ -103,13 +120,15 @@ CSettingsDlg::CSettingsDlg(QWidget* parent):QDialog(parent,Qt::Dialog) SpinBox_ClipboardTime->setValue(config->clipboardTimeOut()); CheckBox_ShowPasswords->setChecked(config->showPasswords()); CheckBox_ShowPasswords_PasswordDlg->setChecked(config->showPasswordsPasswordDlg()); + CheckBox_LockMinimize->setChecked(config->lockOnMinimize()); //Features CheckBox_FeatureBookmarks->setChecked(config->featureBookmarks()); - //Desktop Integration - if(PluginLoadError==QString()) + // TODO Desktop Integration + tabWidgetSettings->removeTab(tabWidgetSettings->indexOf(tabIntegration)); + /*if(PluginLoadError==QString()) Label_IntPlugin_Error->hide(); else Label_IntPlugin_Error->setText(QString("

%1

") @@ -126,24 +145,23 @@ CSettingsDlg::CSettingsDlg(QWidget* parent):QDialog(parent,Qt::Dialog) Radio_IntPlugin_None->setChecked(true); } if(!PluginsModified) - Label_IntPlugin_Info->hide(); + Label_IntPlugin_Info->hide();*/ //Advanced - QString BrowserCmd=config->urlCmd(); - if(BrowserCmd.isEmpty()){ - CheckBox_BrowserDefault->setChecked(true); - Edit_BrowserCmd->setDisabled(true); - } - else{ - Edit_BrowserCmd->setText(BrowserCmd); - CheckBox_BrowserDefault->setChecked(false); - } + Box_BrowserCmd->setChecked(!config->urlCmdDef()); + Edit_BrowserCmd->setText(config->urlCmd()); Edit_MountDir->setText(config->mountDir()); CheckBox_SaveRelativePaths->setChecked(config->saveRelativePaths()); +#ifdef AUTOTYPE SpinBox_AutoTypePreGap->setValue(config->autoTypePreGap()); SpinBox_AutoTypeKeyStrokeDelay->setValue(config->autoTypeKeyStrokeDelay()); +#endif +#ifdef GLOBAL_AUTOTYPE + Edit_GlobalShortcut->setShortcut(config->globalShortcut()); + CheckBox_EntryTitlesMatch->setChecked(config->entryTitlesMatch()); +#endif } CSettingsDlg::~CSettingsDlg() @@ -157,16 +175,6 @@ void CSettingsDlg::paintEvent(QPaintEvent *event){ painter.drawPixmap(QPoint(0,0),BannerPixmap); } -void CSettingsDlg::OnCheckBoxBrowserDefaultChanged(int state){ - if(state==Qt::Checked){ - Edit_BrowserCmd->setDisabled(true); - Edit_BrowserCmd->setText(QString()); - } - else{ - Edit_BrowserCmd->setDisabled(false); - } -} - void CSettingsDlg::OnOK() { apply(); @@ -184,10 +192,13 @@ void CSettingsDlg::OnOtherButton(QAbstractButton* button){ } void CSettingsDlg::apply(){ - + //General - config->setShowSysTrayIcon(checkBox_ShowSysTrayIcon->isChecked()); - config->setMinimizeToTray(checkBox_MinimizeToTray->isChecked()); + config->setShowSysTrayIcon(CheckBox_ShowSysTrayIcon->isChecked()); + config->setMinimizeToTray(CheckBox_CloseToTray->isChecked()); + config->setMinimizeTray(CheckBox_MinimizeTray->isChecked()); + config->setStartMinimized(CheckBox_StartMinimized->isChecked()); + config->setStartLocked(CheckBox_StartLocked->isChecked()); config->setSaveFileDlgHistory(checkBox_SaveFileDlgHistory->isChecked()); if(Radio_GroupTreeRestore->isChecked())config->setGroupTreeState(KpxConfig::RestoreLast); else if(Radio_GroupTreeExpand->isChecked())config->setGroupTreeState(KpxConfig::ExpandAll); @@ -206,27 +217,32 @@ void CSettingsDlg::apply(){ config->setClipboardTimeOut(SpinBox_ClipboardTime->value()); config->setShowPasswords(CheckBox_ShowPasswords->isChecked()); config->setShowPasswordsPasswordDlg(CheckBox_ShowPasswords_PasswordDlg->isChecked()); + config->setLockOnMinimize(CheckBox_LockMinimize->isChecked()); //Features config->setFeatureBookmarks(CheckBox_FeatureBookmarks->isChecked()); - //Desktop Integration - PluginsModified=Label_IntPlugin_Info->isVisible(); + //TODO Desktop Integration + /*PluginsModified=Label_IntPlugin_Info->isVisible(); if(Radio_IntPlugin_Kde->isChecked())config->setIntegrPlugin(KpxConfig::KDE); else if(Radio_IntPlugin_Gnome->isChecked())config->setIntegrPlugin(KpxConfig::Gnome); - else config->setIntegrPlugin(KpxConfig::NoIntegr); + else config->setIntegrPlugin(KpxConfig::NoIntegr);*/ //Advanced + config->setUrlCmdDef(!Box_BrowserCmd->isChecked()); config->setUrlCmd(Edit_BrowserCmd->text()); config->setMountDir(Edit_MountDir->text()); if(!config->mountDir().isEmpty() && config->mountDir().right(1)!="/") config->setMountDir(config->mountDir()+"/"); - if(CheckBox_BrowserDefault->isChecked())config->setUrlCmd(QString()); - else config->setUrlCmd(Edit_BrowserCmd->text()); config->setSaveRelativePaths(CheckBox_SaveRelativePaths->isChecked()); +#ifdef AUTOTYPE config->setAutoTypePreGap(SpinBox_AutoTypePreGap->value()); config->setAutoTypeKeyStrokeDelay(SpinBox_AutoTypeKeyStrokeDelay->value()); - +#endif +#ifdef GLOBAL_AUTOTYPE + config->setGlobalShortcut(Edit_GlobalShortcut->shortcut()); + config->setEntryTitlesMatch(CheckBox_EntryTitlesMatch->isChecked()); +#endif } void CSettingsDlg::OnTextColor() @@ -270,31 +286,29 @@ void CSettingsDlg::OnColor1() } } -void CSettingsDlg::OnCheckBoxOpenLastChanged(int state){ -if(state==Qt::Checked){ - CheckBox_RememberLastKey->setEnabled(true); -}else{ - CheckBox_RememberLastKey->setEnabled(false); - CheckBox_RememberLastKey->setChecked(false); -} -} - void CSettingsDlg::OnMountDirBrowse(){ -QString dir=QFileDialog::getExistingDirectory(this,tr("Select a directory..."),"/"); -if(dir!=QString()){ - Edit_MountDir->setText(dir); + QString dir=QFileDialog::getExistingDirectory(this,tr("Select a directory...")); + if(!dir.isEmpty()){ + Edit_MountDir->setText(dir); + } } + +void CSettingsDlg::OnBrowserCmdBrowse(){ + QString filename=QFileDialog::getOpenFileName(this,tr("Select an executable...")); + if(!filename.isEmpty()){ + Edit_BrowserCmd->setText(filename); + } } -void CSettingsDlg::OnIntPluginNone(bool toggled){ +void CSettingsDlg::OnIntPluginNone(){ Label_IntPlugin_Info->show(); } -void CSettingsDlg::OnIntPluginGnome(bool toggled){ +void CSettingsDlg::OnIntPluginGnome(){ Label_IntPlugin_Info->show(); } -void CSettingsDlg::OnIntPluginKde(bool toggled){ +void CSettingsDlg::OnIntPluginKde(){ Label_IntPlugin_Info->show(); } @@ -303,3 +317,10 @@ void CSettingsDlg::OnCustomizeEntryDetails(){ CustomizeDetailViewDialog dlg(this); dlg.exec(); } + +#ifdef GLOBAL_AUTOTYPE +void CSettingsDlg::resetGlobalShortcut(){ + AutoType::unregisterGlobalShortcut(); + AutoType::registerGlobalShortcut(pShortcut); +} +#endif diff --git a/src/dialogs/SettingsDlg.h b/src/dialogs/SettingsDlg.h index bc8ed9e..984cb85 100755 --- a/src/dialogs/SettingsDlg.h +++ b/src/dialogs/SettingsDlg.h @@ -27,6 +27,7 @@ #include #include "ui_SettingsDlg.h" #include "main.h" +#include "lib/AutoType.h" class CSettingsDlg : public QDialog, public Ui_SettingsDialog { @@ -42,19 +43,27 @@ class CSettingsDlg : public QDialog, public Ui_SettingsDialog virtual void OnColor2(); virtual void OnColor1(); void OnOtherButton(QAbstractButton*); - void OnIntPluginNone(bool); - void OnIntPluginGnome(bool); - void OnIntPluginKde(bool); - void OnCheckBoxOpenLastChanged(int state); - void OnCheckBoxBrowserDefaultChanged(int state); + void OnIntPluginNone(); + void OnIntPluginGnome(); + void OnIntPluginKde(); void OnMountDirBrowse(); + void OnBrowserCmdBrowse(); void OnCustomizeEntryDetails(); - + + +#ifdef GLOBAL_AUTOTYPE + private slots: + void resetGlobalShortcut(); +#endif + private: virtual void paintEvent(QPaintEvent*); void apply(); QColor color1,color2,textcolor; QPixmap BannerPixmap; +#ifdef GLOBAL_AUTOTYPE + Shortcut pShortcut; +#endif static bool PluginsModified; }; diff --git a/src/dialogs/SimplePasswordDlg.cpp b/src/dialogs/SimplePasswordDlg.cpp index 5985b5d..8706591 100755 --- a/src/dialogs/SimplePasswordDlg.cpp +++ b/src/dialogs/SimplePasswordDlg.cpp @@ -41,7 +41,7 @@ SimplePasswordDialog::~SimplePasswordDialog() } void SimplePasswordDialog::OnTextChanged(const QString& txt){ - if(txt==QString()) + if(txt.isEmpty()) buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); else buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); diff --git a/src/dialogs/TrashCanDlg.cpp b/src/dialogs/TrashCanDlg.cpp index 774ced4..eb728d9 100644 --- a/src/dialogs/TrashCanDlg.cpp +++ b/src/dialogs/TrashCanDlg.cpp @@ -39,7 +39,7 @@ TrashCanDialog::TrashCanDialog(QWidget* parent,IDatabase* database,const QListsetIcon(1,database->icon(Entries[i]->image())); } - connect(treeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(OnItemDoubleClicked(QTreeWidgetItem*,int))); + connect(treeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(OnItemDoubleClicked(QTreeWidgetItem*))); connect(treeWidget,SIGNAL(customContextMenuRequested(const QPoint&)),this,SLOT(OnContextMenu(const QPoint&))); ContextMenu=new QMenu(this); ContextMenu->addAction(getIcon("restore"),"Restore"); @@ -59,7 +59,7 @@ void TrashCanDialog::resizeEvent(QResizeEvent* event){ QDialog::resizeEvent(event); } -void TrashCanDialog::OnItemDoubleClicked(QTreeWidgetItem* item, int column){ +void TrashCanDialog::OnItemDoubleClicked(QTreeWidgetItem* item){ SelectedEntry=Entries[item->data(0,Qt::UserRole).toInt()]; accept(); } diff --git a/src/dialogs/TrashCanDlg.h b/src/dialogs/TrashCanDlg.h index f9613b0..7992817 100644 --- a/src/dialogs/TrashCanDlg.h +++ b/src/dialogs/TrashCanDlg.h @@ -41,7 +41,7 @@ class TrashCanDialog:public QDialog, public Ui_TrashCanDialog{ virtual void resizeEvent(QResizeEvent *); private slots: - void OnItemDoubleClicked(QTreeWidgetItem*,int); + void OnItemDoubleClicked(QTreeWidgetItem*); void OnContextMenu(const QPoint&); diff --git a/src/export/Export.cpp b/src/export/Export.cpp index 02cdfa1..8dac57d 100644 --- a/src/export/Export.cpp +++ b/src/export/Export.cpp @@ -26,7 +26,7 @@ QFile* ExporterBase::openFile(QWidget* parent, QString id, QStringList Filters){ QString filename=KpxFileDialogs::saveFile(parent,id,tr("Import File..."),Filters); - if(filename==QString())return NULL; + if(filename.isEmpty())return NULL; QFile* file=new QFile(filename); if(!file->open(QIODevice::ReadWrite|QIODevice::Truncate)){ QMessageBox::critical(parent,tr("Export Failed"),decodeFileError(file->error())); diff --git a/src/export/Export.h b/src/export/Export.h index 8c2ae6b..2423b14 100644 --- a/src/export/Export.h +++ b/src/export/Export.h @@ -34,6 +34,8 @@ class IExport{ }; class ExporterBase:public QObject{ + Q_OBJECT + protected: virtual QFile* openFile(QWidget* GuiParent,QString id,QStringList Filter); }; diff --git a/src/export/Export_KeePassX_Xml.h b/src/export/Export_KeePassX_Xml.h index 9e6b0cc..800c648 100644 --- a/src/export/Export_KeePassX_Xml.h +++ b/src/export/Export_KeePassX_Xml.h @@ -21,14 +21,16 @@ #ifndef _EXPORT_KPX_XML_H_ #define _EXPORT_KPX_XML_H_ -#include +#include #include "Export.h" -class Export_KeePassX_Xml:public IExport, public ExporterBase{ +class Export_KeePassX_Xml:public ExporterBase, public IExport{ + Q_OBJECT + public: virtual bool exportDatabase(QWidget* GuiParent, IDatabase* Database); virtual QString identifier(){return "EXPORT_KEEPASSX_XML";} - virtual QString title(){return "KeePassX XML File";} + virtual QString title(){return tr("KeePassX XML File");} private: void addGroup(IGroupHandle* group,QDomElement& parent,QDomDocument& doc); void addEntry(IEntryHandle* group,QDomElement& parent,QDomDocument& doc); diff --git a/src/export/Export_Txt.h b/src/export/Export_Txt.h index d598a4a..42b8c22 100644 --- a/src/export/Export_Txt.h +++ b/src/export/Export_Txt.h @@ -23,11 +23,13 @@ #include #include "Export.h" -class Export_Txt:public IExport, public ExporterBase{ +class Export_Txt:public ExporterBase, public IExport{ + Q_OBJECT + public: virtual bool exportDatabase(QWidget* GuiParent, IDatabase* Database); virtual QString identifier(){return "e_txt";} - virtual QString title(){return "Text File";} + virtual QString title(){return tr("Text File");} }; #endif diff --git a/src/forms/AboutDlg.ui b/src/forms/AboutDlg.ui index 3bc6bf6..2e3677e 100644 --- a/src/forms/AboutDlg.ui +++ b/src/forms/AboutDlg.ui @@ -6,7 +6,7 @@ 0 0 419 - 268 + 305 @@ -18,13 +18,13 @@ 419 - 268 + 305 419 - 268 + 309 @@ -65,7 +65,7 @@ - 0 + 3 @@ -167,9 +167,6 @@ - - 12 - 0 @@ -183,7 +180,7 @@ 0 - + http://keepassx.sourceforge.net @@ -303,6 +300,13 @@ General Public License (GPL) version 2. + + + + QDialogButtonBox::Ok + + + diff --git a/src/forms/AutoTypeDlg.ui b/src/forms/AutoTypeDlg.ui new file mode 100644 index 0000000..c22c180 --- /dev/null +++ b/src/forms/AutoTypeDlg.ui @@ -0,0 +1,81 @@ + + AutoTypeDlg + + + + 0 + 0 + 502 + 300 + + + + KeePassX - Auto-Type + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 481 + 50 + + + + + + + + Click on an entry to auto-type it. + + + + + + + PointingHandCursor + + + false + + + false + + + true + + + + Group + + + + + Title + + + + + Username + + + + + + + + QDialogButtonBox::Cancel + + + + + + + + diff --git a/src/forms/CustomizeDetailViewDlg.ui b/src/forms/CustomizeDetailViewDlg.ui index d10362d..e1cced5 100644 --- a/src/forms/CustomizeDetailViewDlg.ui +++ b/src/forms/CustomizeDetailViewDlg.ui @@ -13,12 +13,21 @@ Dialog - - 9 - 6 + + 9 + + + 9 + + + 9 + + + 9 + @@ -29,20 +38,38 @@ Rich Text Editor - - 9 - 6 + + 9 + + + 9 + + + 9 + + + 9 + - - 0 - 6 + + 0 + + + 0 + + + 0 + + + 0 + @@ -291,12 +318,21 @@ HTML - - 9 - 6 + + 9 + + + 9 + + + 9 + + + 9 + @@ -309,57 +345,11 @@ - - - 0 - - - 6 + + + QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults - - - - Restore Default - - - false - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Save - - - false - - - - - - - Cancel - - - false - - - - + diff --git a/src/forms/DatabaseSettingsDlg.ui b/src/forms/DatabaseSettingsDlg.ui index d837baa..5882660 100644 --- a/src/forms/DatabaseSettingsDlg.ui +++ b/src/forms/DatabaseSettingsDlg.ui @@ -1,139 +1,113 @@ - - - - - dbsettingdlg_base - + + DatabaseSettingsDlg + + + + 0 + 0 + 440 + 213 + + + + + 0 + 0 + + + + + 440 + 213 + + + + + 440 + 213 + + + + Database Settings + + + + + 10 + 60 + 420 + 110 + + + + Encryption + + - - 0 - 0 - 440 - 213 - + + 10 + 30 + 90 + 20 + - - - 0 - 0 - 0 - 0 - + + Algorithm: - - - 440 - 213 - + + + + + 109 + 30 + 300 + 21 + - - - 440 - 213 - + + + + + 180 + 70 + 230 + 21 + - - Database Settings + + + + + 10 + 70 + 150 + 20 + - - - - 10 - 60 - 420 - 110 - - - - Encryption - - - - - 10 - 30 - 90 - 20 - - - - Algorithm: - - - - - - 109 - 30 - 300 - 21 - - - - - - - 180 - 70 - 230 - 21 - - - - - - - 10 - 70 - 150 - 20 - - - - Encryption Rounds: - - - - - - - 210 - 180 - 102 - 23 - - - - O&K - - - Ctrl+K - - - - - - 320 - 180 - 102 - 23 - - - - &Cancel - - - Ctrl+C - - + + Encryption Rounds: + + + + + + + 12 + 180 + 411 + 27 + + + + QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok + - - - - ComboAlgo - EditRounds - ButtonOK - ButtonCancel - pushButton1 - + + + + ComboAlgo + EditRounds + + + diff --git a/src/forms/EditGroupDlg.ui b/src/forms/EditGroupDlg.ui index 81fb52d..35b462c 100644 --- a/src/forms/EditGroupDlg.ui +++ b/src/forms/EditGroupDlg.ui @@ -1,7 +1,5 @@ Tarek Saidi - - EditGroupDialog @@ -13,9 +11,7 @@ - - 0 - 0 + 0 0 @@ -36,18 +32,39 @@ Group Properties - - 9 - 6 + + 9 + + + 9 + + + 9 + + + 9 + - + + 0 + + + 0 + + 0 - + + 0 + + + 6 + + 6 @@ -106,47 +123,11 @@ - - - 0 + + + QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok - - 6 - - - - - Qt::Horizontal - - - - 121 - 20 - - - - - - - - O&K - - - Alt+K - - - - - - - &Cancel - - - Alt+C - - - - + @@ -155,8 +136,6 @@ EditTitle ComboIconPicker - ButtonOK - ButtonCancel diff --git a/src/forms/MainWindow.ui b/src/forms/MainWindow.ui index 4b9c64c..133ed72 100644 --- a/src/forms/MainWindow.ui +++ b/src/forms/MainWindow.ui @@ -34,82 +34,90 @@ 9 - + + + Qt::Horizontal + + + + false + + + + 30 + 0 + + + + true + + + true + + + false + + + + Groups + + + + + + + 70 + 0 + + - Qt::Horizontal + Qt::Vertical - + false - 30 - 0 + 0 + 70 - - true - - - true + + QAbstractItemView::ExtendedSelection - + false - - - - - 70 - 0 - - - - Qt::Vertical + + true - + + false 0 - 70 + 30 - - QAbstractItemView::ExtendedSelection + + + 0 + 30 + - + + true + + false - - - false - - - - 0 - 30 - - - - - 0 - 30 - - - - true - - - false - - @@ -144,14 +152,14 @@ &Import from... - + Bookmarks - + @@ -279,9 +287,9 @@ - - &Lock Workspace - + + &Lock Workspace + @@ -479,6 +487,9 @@ &KeePassX Handbook... + + false + @@ -554,6 +565,9 @@ Recycle Bin... + + false + diff --git a/src/forms/PasswordDlg.ui b/src/forms/PasswordDlg.ui index a8f6dc8..266f559 100644 --- a/src/forms/PasswordDlg.ui +++ b/src/forms/PasswordDlg.ui @@ -6,7 +6,7 @@ 0 0 578 - 275 + 280 @@ -18,13 +18,13 @@ 578 - 275 + 280 578 - 275 + 280 @@ -306,57 +306,11 @@ - - - 6 - - - 0 - - - 0 - - - 0 + + + QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok - - 0 - - - - - Qt::Horizontal - - - - 351 - 20 - - - - - - - - OK - - - - - - - Cancel - - - - - - - Exit - - - - + @@ -367,9 +321,6 @@ Combo_Dirs ButtonBrowse CheckBox_Both - ButtonOK - ButtonCancel - ButtonExit Button_Bookmarks ButtonChangeEchoMode diff --git a/src/forms/SearchDlg.ui b/src/forms/SearchDlg.ui index 5eba4e9..fcd885d 100644 --- a/src/forms/SearchDlg.ui +++ b/src/forms/SearchDlg.ui @@ -10,9 +10,7 @@ - - 0 - 0 + 0 0 @@ -33,12 +31,21 @@ Search... - - 9 - 6 + + 9 + + + 9 + + + 9 + + + 9 + @@ -57,10 +64,22 @@ - + + 0 + + + 0 + + + 0 + + 0 - + + 4 + + 4 @@ -85,10 +104,22 @@ Include: - + + 9 + + + 9 + + 9 - + + 9 + + + 6 + + 6 @@ -156,10 +187,19 @@ - + 0 - + + 0 + + + 0 + + + 0 + + 0 @@ -217,52 +257,11 @@ - - - 0 - - - 6 + + + QDialogButtonBox::Close - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - 0 - 0 - - - - Search - - - - - - - Clo&se - - - Alt+S - - - - + @@ -277,8 +276,6 @@ checkBox_Comment checkBox_URL checkBox_Attachment - Button_Search - Button_Close diff --git a/src/forms/SelectIconDlg.ui b/src/forms/SelectIconDlg.ui index 4e1701d..ef89e8e 100644 --- a/src/forms/SelectIconDlg.ui +++ b/src/forms/SelectIconDlg.ui @@ -1,7 +1,4 @@ - - - SelectIconDlg @@ -9,13 +6,11 @@ 0 0 478 - 280 + 284 - - 5 - 5 + 0 0 @@ -23,124 +18,47 @@ Icon Selection - - - 9 - - - 6 - - - - - 0 + + + + + + 16 + 16 + - - 6 + + QListView::Static - - - - Add Custom Icon... - - - - - - - Pick - - - - - - - Cancel - - - - - - - Qt::Horizontal - - - - 131 - 31 - - - - - - - - - 16 - 16 - - - - QListView::Static - - - QListView::LeftToRight - - - true - - - QListView::Fixed - - - - 32 - 44 - - - - QListView::IconMode - - - - + + QListView::LeftToRight + + + true + + + QListView::Fixed + + + + 32 + 44 + + + + QListView::IconMode + + + + + + + QDialogButtonBox::Cancel + + - - - - Button_PickIcon - clicked() - SelectIconDlg - accept() - - - 278 - 253 - - - 96 - 254 - - - - - Button_Cancel - clicked() - SelectIconDlg - reject() - - - 369 - 253 - - - 179 - 282 - - - - + diff --git a/src/forms/SettingsDlg.ui b/src/forms/SettingsDlg.ui index 7e39081..1b155fc 100644 --- a/src/forms/SettingsDlg.ui +++ b/src/forms/SettingsDlg.ui @@ -6,19 +6,25 @@ 0 0 571 - 420 + 440 + + + 0 + 0 + + 571 - 420 + 440 571 - 420 + 441 @@ -60,7 +66,7 @@ - + QTabWidget::North @@ -70,7 +76,7 @@ 0 - + The integration plugins provide features like usage of the native file dialogs and message boxes of the particular desktop environments. @@ -79,46 +85,14 @@ - + Show system tray icon - - - - Minimize to tray when clicking the main window's close button - - - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Remember last opened file - - - Alt+Ö - - - @@ -129,32 +103,156 @@ - 10 - 20 + 25 + 10 - + + + false + - Remember last key type and location + Minimize to tray instead of taskbar + + + + Qt::Horizontal + + QSizePolicy::Fixed + - 40 - 20 + 25 + 10 + + + + false + + + Minimize to tray when clicking the main window's close button + + + + + + + + + + + Remember last opened file + + + Alt+Ö + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 25 + 10 + + + + + + + + false + + + Remember last key type and location + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 25 + 10 + + + + + + + + false + + + Start minimized + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 25 + 10 + + + + + + + + false + + + Start locked + + + + + @@ -226,88 +324,6 @@ - - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 6 - - - 6 - - - - - Group tree at start-up: - - - - - - - Restore last state - - - - - - - Expand all items - - - - - - - Do not expand any item - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - @@ -626,13 +642,6 @@ - - - - Unified Title and Toolbar - - - @@ -672,6 +681,73 @@ + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 6 + + + 6 + + + + + Group tree at start-up: + + + + + + + Restore last state + + + + + + + Expand all items + + + + + + + Do not expand any item + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + @@ -687,7 +763,7 @@ - + Security @@ -815,6 +891,13 @@ + + + + Lock workspace when minimizing the main window + + + @@ -830,7 +913,7 @@ - + Features @@ -867,7 +950,7 @@ - + Desktop Integration @@ -1015,7 +1098,7 @@ - + Advanced @@ -1036,7 +1119,7 @@ 9 - + Auto-Type Fine Tuning @@ -1122,82 +1205,86 @@ - - - 0 - - - 0 - - - 0 - - - 0 - - - 6 + + + Custom Browser Command - - 6 + + true - - - - - 0 - 23 - - - - - 16777215 - 23 - - + + + + + + + + Browse + + + + + + + + + + - Browse... + Media Root: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + The directory where storage devices like CDs and memory sticks are normally mounted. - - + + - Media Root: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Browse... - - + + + + + + Enable this if you want to use your bookmarks and the last opened file independet from their absolute paths. This is especially useful when using KeePassX portably and therefore with changing mount points in the file system. + + + Save relative paths (bookmarks and last file) + + + + + + + - Browser Command: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Global Auto-Type Shortcut: - - + + + + true + + - + Qt::Horizontal - - QSizePolicy::Maximum - 40 @@ -1206,28 +1293,12 @@ - - - - - 0 - 0 - - - - System Default - - - - - - Enable this if you want to use your bookmarks and the last opened file independet from their absolute paths. This is especially useful when using KeePassX portably and therefore with changing mount points in the file system. - + - Save relative paths (bookmarks and last file) + Use entry titles to match the window for Global Auto-Type @@ -1261,11 +1332,48 @@ + + + ShortcutWidget + QLineEdit +
lib/ShortcutWidget.h
+
+
- tabWidget4 + tabWidgetSettings + CheckBox_ShowSysTrayIcon + CheckBox_MinimizeTray + CheckBox_CloseToTray + CheckBox_OpenLast + CheckBox_RememberLastKey + CheckBox_StartMinimized + CheckBox_StartLocked + checkBox_SaveFileDlgHistory + Button_ClearFileDlgHistory + checkBox_AskBeforeDelete ButtonColor1 - ButtonTextColor ButtonColor2 + ButtonTextColor + CheckBox_AlternatingRowColors + Button_CustomizeEntryDetails + Radio_GroupTreeRestore + Radio_GroupTreeExpand + Radio_GroupTreeDoNothing + CheckBox_ShowPasswords + CheckBox_ShowPasswords_PasswordDlg + SpinBox_ClipboardTime + CheckBox_LockMinimize + CheckBox_FeatureBookmarks + Radio_IntPlugin_None + Radio_IntPlugin_Gnome + Radio_IntPlugin_Kde + IntPlugin_Button_Config + SpinBox_AutoTypePreGap + SpinBox_AutoTypeKeyStrokeDelay + CheckBox_SaveRelativePaths + Edit_GlobalShortcut + CheckBox_EntryTitlesMatch + DialogButtons diff --git a/src/import/Import.h b/src/import/Import.h index 94eb847..e097e9e 100644 --- a/src/import/Import.h +++ b/src/import/Import.h @@ -34,6 +34,8 @@ class IImport{ }; class ImporterBase:public QObject{ + Q_OBJECT + protected: virtual QFile* openFile(QWidget* GuiParent,QString id,QStringList Filter); virtual QString getPassword(QWidget* GuiParent); diff --git a/src/import/Import_GnuKeyRing.h b/src/import/Import_GnuKeyRing.h index 302d957..ec63bc5 100644 --- a/src/import/Import_GnuKeyRing.h +++ b/src/import/Import_GnuKeyRing.h @@ -25,6 +25,8 @@ #include "Database.h" class Import_GnuKeyRing:public QObject,public IImport{ + Q_OBJECT + public: virtual QString importDatabase(QWidget* GuiParent, IDatabase* Database); virtual QString name(){return "GnuKeyRing";} diff --git a/src/import/Import_KWalletXml.h b/src/import/Import_KWalletXml.h index dc1c4a6..c9484f7 100755 --- a/src/import/Import_KWalletXml.h +++ b/src/import/Import_KWalletXml.h @@ -23,7 +23,9 @@ #include "Database.h" #include "Import.h" -class Import_KWalletXml:public IImport, public ImporterBase{ +class Import_KWalletXml:public ImporterBase, public IImport{ + Q_OBJECT + public: virtual bool importDatabase(QWidget* GuiParent, IDatabase* Database); virtual QString identifier(){return "KWalletXml";} diff --git a/src/import/Import_KeePassX_Xml.cpp b/src/import/Import_KeePassX_Xml.cpp index 64679b8..1d3ba0f 100644 --- a/src/import/Import_KeePassX_Xml.cpp +++ b/src/import/Import_KeePassX_Xml.cpp @@ -47,7 +47,7 @@ bool Import_KeePassX_Xml::importDatabase(QWidget* Parent, IDatabase* database){ QStringList GroupNames; for(int i=0;isize()) buffer=new char[len]; - else {QMessageBox::critical(GuiParent,tr("Import Failed"),tr("File is empty.")); delete file; return false;} + if(len=file->size()){ + buffer=new char[len]; + } + else { + QMessageBox::critical(GuiParent,tr("Import Failed"),tr("File is empty.")); + delete file; + return false; + } file->read(buffer,len); file->close(); delete file; diff --git a/src/import/Import_PwManager.h b/src/import/Import_PwManager.h index d47f8db..36f05a0 100755 --- a/src/import/Import_PwManager.h +++ b/src/import/Import_PwManager.h @@ -26,7 +26,9 @@ #include "Import.h" -class Import_PwManager:public IImport, public ImporterBase{ +class Import_PwManager:public ImporterBase, public IImport{ + Q_OBJECT + public: virtual bool importDatabase(QWidget* GuiParent, IDatabase* Database); virtual QString identifier(){return "PwManager";} diff --git a/src/lib/AutoType.h b/src/lib/AutoType.h index 5eefe51..3a00462 100644 --- a/src/lib/AutoType.h +++ b/src/lib/AutoType.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2006 by Tarek Saidi * + * Copyright (C) 2005-2006 by Tarek Saidi, Felix Geyer * * tarek.saidi@arcor.de * * * * This program is free software; you can redistribute it and/or modify * @@ -21,42 +21,30 @@ #ifndef _AUTOTYPE_H_ #define _AUTOTYPE_H_ -#include -#include #include -#ifdef Q_WS_X11 - #define XK_MISCELLANY - #define XK_XKB_KEYS - #define XK_3270 - #include - #include - #include -#endif #include "Database.h" -typedef struct tKeysymMap{ - quint16 keysym; - quint16 unicode; +#ifdef GLOBAL_AUTOTYPE +struct Shortcut{ + bool ctrl, shift, alt, altgr, win; + quint32 key; }; - -class AutoType:public QObject{ -public: - static QWidget* MainWin; - static void perform(IEntryHandle* entry,QString& errors); -private: -#ifdef Q_WS_X11 - static tKeysymMap KeysymMap[]; - static quint16 getKeysym(const QChar& unicode); - static int getModifiers(Display*,KeySym,int); - static void pressModifiers(Display*,int,bool Press=true); - static void releaseModifiers(Display*,int); - static void templateToKeysyms(const QString& Template, QList& KeySymList,IEntryHandle* entry); - static void stringToKeysyms(const QString& string,QList& KeySymList); #endif - - +#ifdef AUTOTYPE +class KeepassMainWindow; + +class AutoType{ + public: + static KeepassMainWindow* MainWin; + static void perform(IEntryHandle* entry, QString& err,bool hideWindow=true,int nr=0); +#ifdef GLOBAL_AUTOTYPE + static Shortcut shortcut; + static void performGlobal(); + static bool registerGlobalShortcut(const Shortcut& s); + static void unregisterGlobalShortcut(); +#endif // GLOBAL_AUTOTYPE }; - +#endif // AUTOTYPE #endif diff --git a/src/lib/AutoType_X11.cpp b/src/lib/AutoType_X11.cpp index bcc3539..91afaf9 100644 --- a/src/lib/AutoType_X11.cpp +++ b/src/lib/AutoType_X11.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2006 by Tarek Saidi * + * Copyright (C) 2005-2006 by Tarek Saidi, Felix Geyer * * tarek.saidi@arcor.de * * * * This program is free software; you can redistribute it and/or modify * @@ -19,92 +19,75 @@ ***************************************************************************/ #include "KpxConfig.h" -#include #include "AutoType.h" -#include +#include "mainwindow.h" #include #include +#include +#include "HelperX11.h" +#include +#ifdef GLOBAL_AUTOTYPE +#include "dialogs/AutoTypeDlg.h" +#endif -QWidget* AutoType::MainWin=NULL; - - -#ifdef Q_WS_X11 - - -int AutoType::getModifiers(Display *d,KeySym keysym, int keycode){ - int SymsPerKey; - KeySym* Syms=XGetKeyboardMapping(d,keycode,1,&SymsPerKey); - int c=-1; - for(int i=0;i<4;i++) - if(Syms[i]==keysym){ - c=i; break;} - Q_ASSERT(c!=-1); - XFree(Syms); - return c; -} +enum AutoTypeActionType{ + TypeKey, Delay +}; -void AutoType::releaseModifiers(Display* d,int mods){ -pressModifiers(d,mods,False); -} +struct AutoTypeAction{ + AutoTypeAction(AutoTypeActionType t, quint16 d); + AutoTypeActionType type; + quint16 data; +}; -void AutoType::pressModifiers(Display* d,int mods,bool press){ - int keycode; - switch(mods){ - case 0: //no modifier - break; - case 1: //Shift - XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,2); - break; - case 2: //AltGr - XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,2); - break; - case 3: //Shift+AltGr - XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,2); - XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,2); - break; - } -} +class AutoTypePrivate{ + public: + static void sleep(int msec); + inline static void sleepKeyStrokeDelay(){ sleep(config->autoTypeKeyStrokeDelay()); }; + static void templateToKeysyms(const QString& Template, QList& KeySymList,IEntryHandle* entry); + static void stringToKeysyms(const QString& string,QList& KeySymList); +}; -void sleepKeyStrokeDelay(){ - if(config->autoTypeKeyStrokeDelay()==0)return; - struct timespec timeOut,remains; - timeOut.tv_sec = 0; - timeOut.tv_nsec = config->autoTypeKeyStrokeDelay()*100000; - nanosleep(&timeOut, &remains); -} +// AutoType -void AutoType::perform(IEntryHandle* entry, QString& err){ - struct timespec timeOut,remains; - timeOut.tv_sec = 0; - timeOut.tv_nsec = config->autoTypePreGap()*100000; - for(int i=0;i<10;i++)nanosleep(&timeOut, &remains); +KeepassMainWindow* AutoType::MainWin=NULL; +#ifdef GLOBAL_AUTOTYPE +Shortcut AutoType::shortcut; +#endif +void AutoType::perform(IEntryHandle* entry, QString& err,bool hideWindow,int nr){ + QString indexStr; + if (nr==0) + indexStr = "Auto-Type: "; + else + indexStr = QString("Auto-Type-%1: ").arg(nr); QString str; QString comment=entry->comment(); - int c=comment.count("Auto-Type:"); + int c=comment.count(indexStr); if(c>1){ - err=tr("More than one 'Auto-Type:' key sequence found.\nAllowed is only one per entry."); - return;} + err=QCoreApplication::translate("AutoType","More than one 'Auto-Type:' key sequence found.\nAllowed is only one per entry."); + return; + } if(c==1){ - int start=comment.indexOf("Auto-Type:")+10; + int indexLen = indexStr.length(); + int start=comment.indexOf(indexStr)+indexLen; int len; - if(comment.size()==10)return; - for(len=0;len Keys; + QList Keys; for(int i=0;i=str.size()){ - err=tr("Syntax Error in Auto-Type sequence near character %1\n\ + err=QCoreApplication::translate("AutoType","Syntax Error in Auto-Type sequence near character %1\n\ Found '{' without closing '}'").arg(i+10); return; } - templateToKeysyms(tmpl.toLower(),Keys,entry); + AutoTypePrivate::templateToKeysyms(tmpl.toLower(),Keys,entry); continue; } - else - Keys << getKeysym(str[i]); + else{ + Keys << AutoTypeAction(TypeKey, HelperX11::getKeysym(str[i])); + } + } + + if (hideWindow) + MainWin->hide(); + + AutoTypePrivate::sleep(config->autoTypePreGap()); + + Display* pDisplay = QX11Info::display(); + + bool capsEnabled = HelperX11::keyboardModifiers(pDisplay)&LockMask; + if (capsEnabled){ + XTestFakeKeyEvent(pDisplay,XKeysymToKeycode(pDisplay,XK_Caps_Lock),true,CurrentTime); + XTestFakeKeyEvent(pDisplay,XKeysymToKeycode(pDisplay,XK_Caps_Lock),false,CurrentTime); + AutoTypePrivate::sleepKeyStrokeDelay(); } - MainWin->hide(); - Display* pDisplay = XOpenDisplay( NULL ); + char keys_return[32]; + XQueryKeymap(pDisplay, keys_return); + for (int i=0; i<32; i++) + for (int j=0; j<8; j++) + if ( keys_return[i] & (1<showMinimized(); + XIconifyWindow(pDisplay, MainWin->winId(), MainWin->x11Info().screen()); // workaround for Gnome + } +} + +#ifdef GLOBAL_AUTOTYPE +void AutoType::performGlobal(){ + if (MainWin->db==NULL) return; + + Display* d = QX11Info::display(); + Window w; + int revert_to_return; + XGetInputFocus(d, &w, &revert_to_return); + char** list; + int tree; + do { + XTextProperty textProp; + XGetWMName(d, w, &textProp); + int count; + Xutf8TextPropertyToTextList(d, &textProp, &list, &count); + if (list) break; + Window root = 0; + Window parent = 0; + Window* children = NULL; + unsigned int num_children; + tree = XQueryTree(d, w, &root, &parent, &children, &num_children); + w=parent; + if (children) XFree(children); + } while (tree && w); + if (!list) return; + QString title = QString::fromUtf8(list[0]).toLower(); + XFreeStringList(list); + + QList validEntries; + QList entryNumbers; + QList entries = MainWin->db->entries(); + QRegExp lineMatch("^Auto-Type-Window(?:-(\\d+)|): (.+)$", Qt::CaseSensitive, QRegExp::RegExp2); + QDateTime now = QDateTime::currentDateTime(); + for (int i=0; iexpire()!=Date_Never && entries[i]->expire()comment().split("\n", QString::SkipEmptyParts); + for (int j=0; jentryTitlesMatch()){ + QString entryTitle = entries[i]->title().toLower(); + if (!entryTitle.isEmpty() && title.contains(entryTitle)){ + validEntries << entries[i]; + entryNumbers << 0; + } + } + } + + if (validEntries.size()==1){ + QString err; + perform(validEntries[0],err,false,entryNumbers[0]); + } + else if (validEntries.size()>1){ + AutoTypeDlg* dlg = new AutoTypeDlg(validEntries, entryNumbers); + dlg->show(); + } +} + +bool AutoType::registerGlobalShortcut(const Shortcut& s){ + if (s.key==shortcut.key && s.ctrl==shortcut.ctrl && s.shift==shortcut.shift && s.alt==shortcut.alt && s.altgr==shortcut.altgr && s.win==shortcut.win) + return true; + + Display* display = QX11Info::display(); + Window root = XDefaultRootWindow(display); + int code=XKeysymToKeycode(display, HelperX11::getKeysym(s.key)); + int mod=HelperX11::getShortcutModifierMask(s); + + HelperX11::startCatchErrors(); + XGrabKey(display, code, mod, root, True, GrabModeAsync, GrabModeAsync); + XGrabKey(display, code, mod | Mod2Mask, root, True, GrabModeAsync, GrabModeAsync); + XGrabKey(display, code, mod | LockMask, root, True, GrabModeAsync, GrabModeAsync); + XGrabKey(display, code, mod | Mod2Mask | LockMask, root, True, GrabModeAsync, GrabModeAsync); + HelperX11::stopCatchErrors(); + + if (HelperX11::errorOccurred()){ + XUngrabKey(display, code, mod, root); + XUngrabKey(display, code, mod | Mod2Mask, root); + XUngrabKey(display, code, mod | LockMask, root); + XUngrabKey(display, code, mod | Mod2Mask | LockMask, root); + return false; + } + else { + unregisterGlobalShortcut(); + shortcut = s; + return true; } - XCloseDisplay(pDisplay); - MainWin->show(); } -void AutoType::templateToKeysyms(const QString& tmpl, QList& keys,IEntryHandle* entry){ +void AutoType::unregisterGlobalShortcut(){ + if (shortcut.key==0) return; + + Display* display = QX11Info::display(); + Window root = XDefaultRootWindow(display); + int code=XKeysymToKeycode(display, HelperX11::getKeysym(shortcut.key)); + int mod=HelperX11::getShortcutModifierMask(shortcut); + + XUngrabKey(display, code, mod, root); + XUngrabKey(display, code, mod | Mod2Mask, root); + XUngrabKey(display, code, mod | LockMask, root); + XUngrabKey(display, code, mod | Mod2Mask | LockMask, root); + + shortcut.key = 0; +} + +#endif // GLOBAL_AUTOTYPE + +AutoTypeAction::AutoTypeAction(AutoTypeActionType t, quint16 d) : type(t), data(d){ +} + + +// AutoTypePrivate + +void AutoTypePrivate::sleep(int msec){ + if (msec==0) return; + timespec timeOut, remains; + timeOut.tv_sec = msec/1000; + timeOut.tv_nsec = (msec%1000)*1000000; + nanosleep(&timeOut, &remains); +} + +void AutoTypePrivate::templateToKeysyms(const QString& tmpl, QList& keys,IEntryHandle* entry){ //tmpl must be lower case!!! if(!tmpl.compare("title")){ stringToKeysyms(entry->title(),keys); @@ -159,1027 +350,222 @@ void AutoType::templateToKeysyms(const QString& tmpl, QList& keys,IEntr return; } if(!tmpl.compare("space")){ - keys << getKeysym(' '); + keys << AutoTypeAction(TypeKey, HelperX11::getKeysym(' ')); return;} if(!tmpl.compare("backspace") || !tmpl.compare("bs") || !tmpl.compare("bksp")){ - keys << XK_BackSpace; + keys << AutoTypeAction(TypeKey, XK_BackSpace); return;} if(!tmpl.compare("break")){ - keys << XK_Break; + keys << AutoTypeAction(TypeKey, XK_Break); return;} if(!tmpl.compare("capslock")){ - keys << XK_Caps_Lock; + keys << AutoTypeAction(TypeKey, XK_Caps_Lock); return;} if(!tmpl.compare("del") || !tmpl.compare("delete")){ - keys << XK_Delete; + keys << AutoTypeAction(TypeKey, XK_Delete); return;} if(!tmpl.compare("end")){ - keys << XK_End; + keys << AutoTypeAction(TypeKey, XK_End); return;} if(!tmpl.compare("enter")){ - keys << XK_Return; + keys << AutoTypeAction(TypeKey, XK_Return); return;} if(!tmpl.compare("esc")){ - keys << XK_Escape; + keys << AutoTypeAction(TypeKey, XK_Escape); return;} if(!tmpl.compare("help")){ - keys << XK_Help; + keys << AutoTypeAction(TypeKey, XK_Help); return;} if(!tmpl.compare("home")){ - keys << XK_Home; + keys << AutoTypeAction(TypeKey, XK_Home); return;} - if(!tmpl.compare("ins")){ - keys << XK_Insert; + if(!tmpl.compare("insert") || !tmpl.compare("ins")){ + keys << AutoTypeAction(TypeKey, XK_Insert); return;} if(!tmpl.compare("numlock")){ - keys << XK_Num_Lock; + keys << AutoTypeAction(TypeKey, XK_Num_Lock); return;} if(!tmpl.compare("scroll")){ - keys << XK_Scroll_Lock; + keys << AutoTypeAction(TypeKey, XK_Scroll_Lock); return;} if(!tmpl.compare("pgdn")){ - keys << XK_Page_Down; + keys << AutoTypeAction(TypeKey, XK_Page_Down); return;} if(!tmpl.compare("pgup")){ - keys << XK_Page_Up; + keys << AutoTypeAction(TypeKey, XK_Page_Up); return;} if(!tmpl.compare("prtsc")){ - keys << XK_3270_PrintScreen; + keys << AutoTypeAction(TypeKey, XK_3270_PrintScreen); return;} if(!tmpl.compare("up")){ - keys << XK_Up; + keys << AutoTypeAction(TypeKey, XK_Up); return;} if(!tmpl.compare("down")){ - keys << XK_Down; + keys << AutoTypeAction(TypeKey, XK_Down); return;} if(!tmpl.compare("left")){ - keys << XK_Left; + keys << AutoTypeAction(TypeKey, XK_Left); return;} if(!tmpl.compare("right")){ - keys << XK_Right; + keys << AutoTypeAction(TypeKey, XK_Right); return;} if(!tmpl.compare("f1")){ - keys << XK_F1; + keys << AutoTypeAction(TypeKey, XK_F1); return;} if(!tmpl.compare("f2")){ - keys << XK_F2; + keys << AutoTypeAction(TypeKey, XK_F2); return;} if(!tmpl.compare("f3")){ - keys << XK_F3; + keys << AutoTypeAction(TypeKey, XK_F3); return;} if(!tmpl.compare("f4")){ - keys << XK_F4; + keys << AutoTypeAction(TypeKey, XK_F4); return;} if(!tmpl.compare("f5")){ - keys << XK_F5; + keys << AutoTypeAction(TypeKey, XK_F5); return;} if(!tmpl.compare("f6")){ - keys << XK_F6; + keys << AutoTypeAction(TypeKey, XK_F6); return;} if(!tmpl.compare("f7")){ - keys << XK_F7; + keys << AutoTypeAction(TypeKey, XK_F7); return;} if(!tmpl.compare("f8")){ - keys << XK_F8; + keys << AutoTypeAction(TypeKey, XK_F8); return;} if(!tmpl.compare("f9")){ - keys << XK_F9; + keys << AutoTypeAction(TypeKey, XK_F9); return;} if(!tmpl.compare("f10")){ - keys << XK_F10; + keys << AutoTypeAction(TypeKey, XK_F10); return;} if(!tmpl.compare("f11")){ - keys << XK_F11; + keys << AutoTypeAction(TypeKey, XK_F11); return;} if(!tmpl.compare("f12")){ - keys << XK_F12; + keys << AutoTypeAction(TypeKey, XK_F12); return;} if(!tmpl.compare("f13")){ - keys << XK_F13; + keys << AutoTypeAction(TypeKey, XK_F13); return;} if(!tmpl.compare("f14")){ - keys << XK_F14; + keys << AutoTypeAction(TypeKey, XK_F14); return;} if(!tmpl.compare("f15")){ - keys << XK_F15; + keys << AutoTypeAction(TypeKey, XK_F15); return;} if(!tmpl.compare("f16")){ - keys << XK_F16; + keys << AutoTypeAction(TypeKey, XK_F16); return;} if(!tmpl.compare("add") || !tmpl.compare("plus")){ - keys << getKeysym('+'); + keys << AutoTypeAction(TypeKey, HelperX11::getKeysym('+')); return;} if(!tmpl.compare("subtract")){ - keys << getKeysym('-'); + keys << AutoTypeAction(TypeKey, HelperX11::getKeysym('-')); return;} if(!tmpl.compare("multiply")){ - keys << getKeysym('+'); + keys << AutoTypeAction(TypeKey, HelperX11::getKeysym('+')); return;} if(!tmpl.compare("divide")){ - keys << getKeysym('/'); + keys << AutoTypeAction(TypeKey, HelperX11::getKeysym('/')); return;} if(!tmpl.compare("at")){ - keys << getKeysym('@'); + keys << AutoTypeAction(TypeKey, HelperX11::getKeysym('@')); return;} if(!tmpl.compare("percent")){ - keys << getKeysym('%'); + keys << AutoTypeAction(TypeKey, HelperX11::getKeysym('%')); return;} if(!tmpl.compare("caret")){ - keys << getKeysym('^'); + keys << AutoTypeAction(TypeKey, HelperX11::getKeysym('^')); return;} if(!tmpl.compare("tilde")){ - keys << getKeysym('~'); + keys << AutoTypeAction(TypeKey, HelperX11::getKeysym('~')); return;} if(!tmpl.compare("leftbrace")){ - keys << getKeysym('{'); + keys << AutoTypeAction(TypeKey, HelperX11::getKeysym('{')); return;} if(!tmpl.compare("rightbrace")){ - keys << getKeysym('}'); + keys << AutoTypeAction(TypeKey, HelperX11::getKeysym('}')); return;} if(!tmpl.compare("leftparen")){ - keys << getKeysym('('); + keys << AutoTypeAction(TypeKey, HelperX11::getKeysym('(')); return;} if(!tmpl.compare("rightparen")){ - keys << getKeysym(')'); + keys << AutoTypeAction(TypeKey, HelperX11::getKeysym(')')); return;} if(!tmpl.compare("winl")){ - keys << XK_Super_L; + keys << AutoTypeAction(TypeKey, XK_Super_L); return;} if(!tmpl.compare("winr")){ - keys << XK_Super_R; + keys << AutoTypeAction(TypeKey, XK_Super_R); return;} if(!tmpl.compare("win")){ - keys << XK_Super_L; + keys << AutoTypeAction(TypeKey, XK_Super_L); return;} if(!tmpl.compare("tab")){ - keys << XK_Tab; + keys << AutoTypeAction(TypeKey, XK_Tab); return;} + + if(tmpl.startsWith("delay ") && tmpl.length()>6){ + bool ok; + quint16 delay = tmpl.right(tmpl.length()-6).toInt(&ok); + if (ok && delay>0 && delay<=10000) + keys << AutoTypeAction(Delay, delay); + } } - - - - -void AutoType::stringToKeysyms(const QString& string,QList& KeySymList){ -for(int i=0; i GREATER-THAN SIGN */ - { 0x0ba8, 0x2228 }, /* downcaret ∨ LOGICAL OR */ - { 0x0ba9, 0x2227 }, /* upcaret ∧ LOGICAL AND */ - { 0x0bc0, 0x00af }, /* overbar ¯ MACRON */ - { 0x0bc2, 0x22a5 }, /* downtack ⊥ UP TACK */ - { 0x0bc3, 0x2229 }, /* upshoe ∩ INTERSECTION */ - { 0x0bc4, 0x230a }, /* downstile ⌊ LEFT FLOOR */ - { 0x0bc6, 0x005f }, /* underbar _ LOW LINE */ - { 0x0bca, 0x2218 }, /* jot ∘ RING OPERATOR */ - { 0x0bcc, 0x2395 }, /* quad ⎕ APL FUNCTIONAL SYMBOL QUAD */ - { 0x0bce, 0x22a4 }, /* uptack ⊤ DOWN TACK */ - { 0x0bcf, 0x25cb }, /* circle ○ WHITE CIRCLE */ - { 0x0bd3, 0x2308 }, /* upstile ⌈ LEFT CEILING */ - { 0x0bd6, 0x222a }, /* downshoe ∪ UNION */ - { 0x0bd8, 0x2283 }, /* rightshoe ⊃ SUPERSET OF */ - { 0x0bda, 0x2282 }, /* leftshoe ⊂ SUBSET OF */ - { 0x0bdc, 0x22a2 }, /* lefttack ⊢ RIGHT TACK */ - { 0x0bfc, 0x22a3 }, /* righttack ⊣ LEFT TACK */ - { 0x0cdf, 0x2017 }, /* hebrew_doublelowline ‗ DOUBLE LOW LINE */ - { 0x0ce0, 0x05d0 }, /* hebrew_aleph א HEBREW LETTER ALEF */ - { 0x0ce1, 0x05d1 }, /* hebrew_bet ב HEBREW LETTER BET */ - { 0x0ce2, 0x05d2 }, /* hebrew_gimel ג HEBREW LETTER GIMEL */ - { 0x0ce3, 0x05d3 }, /* hebrew_dalet ד HEBREW LETTER DALET */ - { 0x0ce4, 0x05d4 }, /* hebrew_he ה HEBREW LETTER HE */ - { 0x0ce5, 0x05d5 }, /* hebrew_waw ו HEBREW LETTER VAV */ - { 0x0ce6, 0x05d6 }, /* hebrew_zain ז HEBREW LETTER ZAYIN */ - { 0x0ce7, 0x05d7 }, /* hebrew_chet ח HEBREW LETTER HET */ - { 0x0ce8, 0x05d8 }, /* hebrew_tet ט HEBREW LETTER TET */ - { 0x0ce9, 0x05d9 }, /* hebrew_yod י HEBREW LETTER YOD */ - { 0x0cea, 0x05da }, /* hebrew_finalkaph ך HEBREW LETTER FINAL KAF */ - { 0x0ceb, 0x05db }, /* hebrew_kaph כ HEBREW LETTER KAF */ - { 0x0cec, 0x05dc }, /* hebrew_lamed ל HEBREW LETTER LAMED */ - { 0x0ced, 0x05dd }, /* hebrew_finalmem ם HEBREW LETTER FINAL MEM */ - { 0x0cee, 0x05de }, /* hebrew_mem מ HEBREW LETTER MEM */ - { 0x0cef, 0x05df }, /* hebrew_finalnun ן HEBREW LETTER FINAL NUN */ - { 0x0cf0, 0x05e0 }, /* hebrew_nun נ HEBREW LETTER NUN */ - { 0x0cf1, 0x05e1 }, /* hebrew_samech ס HEBREW LETTER SAMEKH */ - { 0x0cf2, 0x05e2 }, /* hebrew_ayin ע HEBREW LETTER AYIN */ - { 0x0cf3, 0x05e3 }, /* hebrew_finalpe ף HEBREW LETTER FINAL PE */ - { 0x0cf4, 0x05e4 }, /* hebrew_pe פ HEBREW LETTER PE */ - { 0x0cf5, 0x05e5 }, /* hebrew_finalzade ץ HEBREW LETTER FINAL TSADI */ - { 0x0cf6, 0x05e6 }, /* hebrew_zade צ HEBREW LETTER TSADI */ - { 0x0cf7, 0x05e7 }, /* hebrew_qoph ק HEBREW LETTER QOF */ - { 0x0cf8, 0x05e8 }, /* hebrew_resh ר HEBREW LETTER RESH */ - { 0x0cf9, 0x05e9 }, /* hebrew_shin ש HEBREW LETTER SHIN */ - { 0x0cfa, 0x05ea }, /* hebrew_taw ת HEBREW LETTER TAV */ - { 0x0da1, 0x0e01 }, /* Thai_kokai ก THAI CHARACTER KO KAI */ - { 0x0da2, 0x0e02 }, /* Thai_khokhai ข THAI CHARACTER KHO KHAI */ - { 0x0da3, 0x0e03 }, /* Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT */ - { 0x0da4, 0x0e04 }, /* Thai_khokhwai ค THAI CHARACTER KHO KHWAI */ - { 0x0da5, 0x0e05 }, /* Thai_khokhon ฅ THAI CHARACTER KHO KHON */ - { 0x0da6, 0x0e06 }, /* Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG */ - { 0x0da7, 0x0e07 }, /* Thai_ngongu ง THAI CHARACTER NGO NGU */ - { 0x0da8, 0x0e08 }, /* Thai_chochan จ THAI CHARACTER CHO CHAN */ - { 0x0da9, 0x0e09 }, /* Thai_choching ฉ THAI CHARACTER CHO CHING */ - { 0x0daa, 0x0e0a }, /* Thai_chochang ช THAI CHARACTER CHO CHANG */ - { 0x0dab, 0x0e0b }, /* Thai_soso ซ THAI CHARACTER SO SO */ - { 0x0dac, 0x0e0c }, /* Thai_chochoe ฌ THAI CHARACTER CHO CHOE */ - { 0x0dad, 0x0e0d }, /* Thai_yoying ญ THAI CHARACTER YO YING */ - { 0x0dae, 0x0e0e }, /* Thai_dochada ฎ THAI CHARACTER DO CHADA */ - { 0x0daf, 0x0e0f }, /* Thai_topatak ฏ THAI CHARACTER TO PATAK */ - { 0x0db0, 0x0e10 }, /* Thai_thothan ฐ THAI CHARACTER THO THAN */ - { 0x0db1, 0x0e11 }, /* Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO */ - { 0x0db2, 0x0e12 }, /* Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO */ - { 0x0db3, 0x0e13 }, /* Thai_nonen ณ THAI CHARACTER NO NEN */ - { 0x0db4, 0x0e14 }, /* Thai_dodek ด THAI CHARACTER DO DEK */ - { 0x0db5, 0x0e15 }, /* Thai_totao ต THAI CHARACTER TO TAO */ - { 0x0db6, 0x0e16 }, /* Thai_thothung ถ THAI CHARACTER THO THUNG */ - { 0x0db7, 0x0e17 }, /* Thai_thothahan ท THAI CHARACTER THO THAHAN */ - { 0x0db8, 0x0e18 }, /* Thai_thothong ธ THAI CHARACTER THO THONG */ - { 0x0db9, 0x0e19 }, /* Thai_nonu น THAI CHARACTER NO NU */ - { 0x0dba, 0x0e1a }, /* Thai_bobaimai บ THAI CHARACTER BO BAIMAI */ - { 0x0dbb, 0x0e1b }, /* Thai_popla ป THAI CHARACTER PO PLA */ - { 0x0dbc, 0x0e1c }, /* Thai_phophung ผ THAI CHARACTER PHO PHUNG */ - { 0x0dbd, 0x0e1d }, /* Thai_fofa ฝ THAI CHARACTER FO FA */ - { 0x0dbe, 0x0e1e }, /* Thai_phophan พ THAI CHARACTER PHO PHAN */ - { 0x0dbf, 0x0e1f }, /* Thai_fofan ฟ THAI CHARACTER FO FAN */ - { 0x0dc0, 0x0e20 }, /* Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO */ - { 0x0dc1, 0x0e21 }, /* Thai_moma ม THAI CHARACTER MO MA */ - { 0x0dc2, 0x0e22 }, /* Thai_yoyak ย THAI CHARACTER YO YAK */ - { 0x0dc3, 0x0e23 }, /* Thai_rorua ร THAI CHARACTER RO RUA */ - { 0x0dc4, 0x0e24 }, /* Thai_ru ฤ THAI CHARACTER RU */ - { 0x0dc5, 0x0e25 }, /* Thai_loling ล THAI CHARACTER LO LING */ - { 0x0dc6, 0x0e26 }, /* Thai_lu ฦ THAI CHARACTER LU */ - { 0x0dc7, 0x0e27 }, /* Thai_wowaen ว THAI CHARACTER WO WAEN */ - { 0x0dc8, 0x0e28 }, /* Thai_sosala ศ THAI CHARACTER SO SALA */ - { 0x0dc9, 0x0e29 }, /* Thai_sorusi ษ THAI CHARACTER SO RUSI */ - { 0x0dca, 0x0e2a }, /* Thai_sosua ส THAI CHARACTER SO SUA */ - { 0x0dcb, 0x0e2b }, /* Thai_hohip ห THAI CHARACTER HO HIP */ - { 0x0dcc, 0x0e2c }, /* Thai_lochula ฬ THAI CHARACTER LO CHULA */ - { 0x0dcd, 0x0e2d }, /* Thai_oang อ THAI CHARACTER O ANG */ - { 0x0dce, 0x0e2e }, /* Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK */ - { 0x0dcf, 0x0e2f }, /* Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI */ - { 0x0dd0, 0x0e30 }, /* Thai_saraa ะ THAI CHARACTER SARA A */ - { 0x0dd1, 0x0e31 }, /* Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT */ - { 0x0dd2, 0x0e32 }, /* Thai_saraaa า THAI CHARACTER SARA AA */ - { 0x0dd3, 0x0e33 }, /* Thai_saraam ำ THAI CHARACTER SARA AM */ - { 0x0dd4, 0x0e34 }, /* Thai_sarai ิ THAI CHARACTER SARA I */ - { 0x0dd5, 0x0e35 }, /* Thai_saraii ี THAI CHARACTER SARA II */ - { 0x0dd6, 0x0e36 }, /* Thai_saraue ึ THAI CHARACTER SARA UE */ - { 0x0dd7, 0x0e37 }, /* Thai_sarauee ื THAI CHARACTER SARA UEE */ - { 0x0dd8, 0x0e38 }, /* Thai_sarau ุ THAI CHARACTER SARA U */ - { 0x0dd9, 0x0e39 }, /* Thai_sarauu ู THAI CHARACTER SARA UU */ - { 0x0dda, 0x0e3a }, /* Thai_phinthu ฺ THAI CHARACTER PHINTHU */ -/* 0x0dde Thai_maihanakat_maitho ? ??? */ - { 0x0ddf, 0x0e3f }, /* Thai_baht ฿ THAI CURRENCY SYMBOL BAHT */ - { 0x0de0, 0x0e40 }, /* Thai_sarae เ THAI CHARACTER SARA E */ - { 0x0de1, 0x0e41 }, /* Thai_saraae แ THAI CHARACTER SARA AE */ - { 0x0de2, 0x0e42 }, /* Thai_sarao โ THAI CHARACTER SARA O */ - { 0x0de3, 0x0e43 }, /* Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN */ - { 0x0de4, 0x0e44 }, /* Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI */ - { 0x0de5, 0x0e45 }, /* Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO */ - { 0x0de6, 0x0e46 }, /* Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK */ - { 0x0de7, 0x0e47 }, /* Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU */ - { 0x0de8, 0x0e48 }, /* Thai_maiek ่ THAI CHARACTER MAI EK */ - { 0x0de9, 0x0e49 }, /* Thai_maitho ้ THAI CHARACTER MAI THO */ - { 0x0dea, 0x0e4a }, /* Thai_maitri ๊ THAI CHARACTER MAI TRI */ - { 0x0deb, 0x0e4b }, /* Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA */ - { 0x0dec, 0x0e4c }, /* Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT */ - { 0x0ded, 0x0e4d }, /* Thai_nikhahit ํ THAI CHARACTER NIKHAHIT */ - { 0x0df0, 0x0e50 }, /* Thai_leksun ๐ THAI DIGIT ZERO */ - { 0x0df1, 0x0e51 }, /* Thai_leknung ๑ THAI DIGIT ONE */ - { 0x0df2, 0x0e52 }, /* Thai_leksong ๒ THAI DIGIT TWO */ - { 0x0df3, 0x0e53 }, /* Thai_leksam ๓ THAI DIGIT THREE */ - { 0x0df4, 0x0e54 }, /* Thai_leksi ๔ THAI DIGIT FOUR */ - { 0x0df5, 0x0e55 }, /* Thai_lekha ๕ THAI DIGIT FIVE */ - { 0x0df6, 0x0e56 }, /* Thai_lekhok ๖ THAI DIGIT SIX */ - { 0x0df7, 0x0e57 }, /* Thai_lekchet ๗ THAI DIGIT SEVEN */ - { 0x0df8, 0x0e58 }, /* Thai_lekpaet ๘ THAI DIGIT EIGHT */ - { 0x0df9, 0x0e59 }, /* Thai_lekkao ๙ THAI DIGIT NINE */ - { 0x0ea1, 0x3131 }, /* Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK */ - { 0x0ea2, 0x3132 }, /* Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK */ - { 0x0ea3, 0x3133 }, /* Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS */ - { 0x0ea4, 0x3134 }, /* Hangul_Nieun ㄴ HANGUL LETTER NIEUN */ - { 0x0ea5, 0x3135 }, /* Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC */ - { 0x0ea6, 0x3136 }, /* Hangul_NieunHieuh ㄶ HANGUL LETTER NIEUN-HIEUH */ - { 0x0ea7, 0x3137 }, /* Hangul_Dikeud ㄷ HANGUL LETTER TIKEUT */ - { 0x0ea8, 0x3138 }, /* Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT */ - { 0x0ea9, 0x3139 }, /* Hangul_Rieul ㄹ HANGUL LETTER RIEUL */ - { 0x0eaa, 0x313a }, /* Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK */ - { 0x0eab, 0x313b }, /* Hangul_RieulMieum ㄻ HANGUL LETTER RIEUL-MIEUM */ - { 0x0eac, 0x313c }, /* Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP */ - { 0x0ead, 0x313d }, /* Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS */ - { 0x0eae, 0x313e }, /* Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH */ - { 0x0eaf, 0x313f }, /* Hangul_RieulPhieuf ㄿ HANGUL LETTER RIEUL-PHIEUPH */ - { 0x0eb0, 0x3140 }, /* Hangul_RieulHieuh ㅀ HANGUL LETTER RIEUL-HIEUH */ - { 0x0eb1, 0x3141 }, /* Hangul_Mieum ㅁ HANGUL LETTER MIEUM */ - { 0x0eb2, 0x3142 }, /* Hangul_Pieub ㅂ HANGUL LETTER PIEUP */ - { 0x0eb3, 0x3143 }, /* Hangul_SsangPieub ㅃ HANGUL LETTER SSANGPIEUP */ - { 0x0eb4, 0x3144 }, /* Hangul_PieubSios ㅄ HANGUL LETTER PIEUP-SIOS */ - { 0x0eb5, 0x3145 }, /* Hangul_Sios ㅅ HANGUL LETTER SIOS */ - { 0x0eb6, 0x3146 }, /* Hangul_SsangSios ㅆ HANGUL LETTER SSANGSIOS */ - { 0x0eb7, 0x3147 }, /* Hangul_Ieung ㅇ HANGUL LETTER IEUNG */ - { 0x0eb8, 0x3148 }, /* Hangul_Jieuj ㅈ HANGUL LETTER CIEUC */ - { 0x0eb9, 0x3149 }, /* Hangul_SsangJieuj ㅉ HANGUL LETTER SSANGCIEUC */ - { 0x0eba, 0x314a }, /* Hangul_Cieuc ㅊ HANGUL LETTER CHIEUCH */ - { 0x0ebb, 0x314b }, /* Hangul_Khieuq ㅋ HANGUL LETTER KHIEUKH */ - { 0x0ebc, 0x314c }, /* Hangul_Tieut ㅌ HANGUL LETTER THIEUTH */ - { 0x0ebd, 0x314d }, /* Hangul_Phieuf ㅍ HANGUL LETTER PHIEUPH */ - { 0x0ebe, 0x314e }, /* Hangul_Hieuh ㅎ HANGUL LETTER HIEUH */ - { 0x0ebf, 0x314f }, /* Hangul_A ㅏ HANGUL LETTER A */ - { 0x0ec0, 0x3150 }, /* Hangul_AE ㅐ HANGUL LETTER AE */ - { 0x0ec1, 0x3151 }, /* Hangul_YA ㅑ HANGUL LETTER YA */ - { 0x0ec2, 0x3152 }, /* Hangul_YAE ㅒ HANGUL LETTER YAE */ - { 0x0ec3, 0x3153 }, /* Hangul_EO ㅓ HANGUL LETTER EO */ - { 0x0ec4, 0x3154 }, /* Hangul_E ㅔ HANGUL LETTER E */ - { 0x0ec5, 0x3155 }, /* Hangul_YEO ㅕ HANGUL LETTER YEO */ - { 0x0ec6, 0x3156 }, /* Hangul_YE ㅖ HANGUL LETTER YE */ - { 0x0ec7, 0x3157 }, /* Hangul_O ㅗ HANGUL LETTER O */ - { 0x0ec8, 0x3158 }, /* Hangul_WA ㅘ HANGUL LETTER WA */ - { 0x0ec9, 0x3159 }, /* Hangul_WAE ㅙ HANGUL LETTER WAE */ - { 0x0eca, 0x315a }, /* Hangul_OE ㅚ HANGUL LETTER OE */ - { 0x0ecb, 0x315b }, /* Hangul_YO ㅛ HANGUL LETTER YO */ - { 0x0ecc, 0x315c }, /* Hangul_U ㅜ HANGUL LETTER U */ - { 0x0ecd, 0x315d }, /* Hangul_WEO ㅝ HANGUL LETTER WEO */ - { 0x0ece, 0x315e }, /* Hangul_WE ㅞ HANGUL LETTER WE */ - { 0x0ecf, 0x315f }, /* Hangul_WI ㅟ HANGUL LETTER WI */ - { 0x0ed0, 0x3160 }, /* Hangul_YU ㅠ HANGUL LETTER YU */ - { 0x0ed1, 0x3161 }, /* Hangul_EU ㅡ HANGUL LETTER EU */ - { 0x0ed2, 0x3162 }, /* Hangul_YI ㅢ HANGUL LETTER YI */ - { 0x0ed3, 0x3163 }, /* Hangul_I ㅣ HANGUL LETTER I */ - { 0x0ed4, 0x11a8 }, /* Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK */ - { 0x0ed5, 0x11a9 }, /* Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK */ - { 0x0ed6, 0x11aa }, /* Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS */ - { 0x0ed7, 0x11ab }, /* Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN */ - { 0x0ed8, 0x11ac }, /* Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC */ - { 0x0ed9, 0x11ad }, /* Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH */ - { 0x0eda, 0x11ae }, /* Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT */ - { 0x0edb, 0x11af }, /* Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL */ - { 0x0edc, 0x11b0 }, /* Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK */ - { 0x0edd, 0x11b1 }, /* Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM */ - { 0x0ede, 0x11b2 }, /* Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP */ - { 0x0edf, 0x11b3 }, /* Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS */ - { 0x0ee0, 0x11b4 }, /* Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH */ - { 0x0ee1, 0x11b5 }, /* Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH */ - { 0x0ee2, 0x11b6 }, /* Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH */ - { 0x0ee3, 0x11b7 }, /* Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM */ - { 0x0ee4, 0x11b8 }, /* Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP */ - { 0x0ee5, 0x11b9 }, /* Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS */ - { 0x0ee6, 0x11ba }, /* Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS */ - { 0x0ee7, 0x11bb }, /* Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS */ - { 0x0ee8, 0x11bc }, /* Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG */ - { 0x0ee9, 0x11bd }, /* Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC */ - { 0x0eea, 0x11be }, /* Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH */ - { 0x0eeb, 0x11bf }, /* Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH */ - { 0x0eec, 0x11c0 }, /* Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH */ - { 0x0eed, 0x11c1 }, /* Hangul_J_Phieuf ᇁ HANGUL JONGSEONG PHIEUPH */ - { 0x0eee, 0x11c2 }, /* Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH */ - { 0x0eef, 0x316d }, /* Hangul_RieulYeorinHieuh ㅭ HANGUL LETTER RIEUL-YEORINHIEUH */ - { 0x0ef0, 0x3171 }, /* Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM */ - { 0x0ef1, 0x3178 }, /* Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP */ - { 0x0ef2, 0x317f }, /* Hangul_PanSios ㅿ HANGUL LETTER PANSIOS */ - { 0x0ef3, 0x3181 }, /* Hangul_KkogjiDalrinIeung ㆁ HANGUL LETTER YESIEUNG */ - { 0x0ef4, 0x3184 }, /* Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */ - { 0x0ef5, 0x3186 }, /* Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */ - { 0x0ef6, 0x318d }, /* Hangul_AraeA ㆍ HANGUL LETTER ARAEA */ - { 0x0ef7, 0x318e }, /* Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */ - { 0x0ef8, 0x11eb }, /* Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS */ - { 0x0ef9, 0x11f0 }, /* Hangul_J_KkogjiDalrinIeung ᇰ HANGUL JONGSEONG YESIEUNG */ - { 0x0efa, 0x11f9 }, /* Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */ - { 0x0eff, 0x20a9 }, /* Korean_Won ₩ WON SIGN */ - { 0x13a4, 0x20ac }, /* Euro € EURO SIGN */ - { 0x13bc, 0x0152 }, /* OE Œ LATIN CAPITAL LIGATURE OE */ - { 0x13bd, 0x0153 }, /* oe œ LATIN SMALL LIGATURE OE */ - { 0x13be, 0x0178 }, /* Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */ - { 0x20ac, 0x20ac }, /* EuroSign € EURO SIGN */ -}; - -quint16 AutoType::getKeysym(const QChar& c){ -int MapSize=sizeof(KeysymMap); -quint16 unicode=c.unicode(); -/* first check for Latin-1 characters (1:1 mapping) */ -if ((unicode >= 0x0020 && unicode <= 0x007e) || - (unicode >= 0x00a0 && unicode <= 0x00ff)) - return unicode; - -/*if((unicode & 0xFF000000)==0x00) - return (unicode & 0x00FFFFFF)|0x01FFFFFF;*/ - -for(int i=0; i -void AutoType::perform(IEntryHandle* entry, QString& err){ -QMessageBox::warning(NULL,"AutoType","Sorry, but Auto-Type does not work under Mac OS X yet.","OK"); +void AutoTypePrivate::stringToKeysyms(const QString& string,QList& KeySymList){ + for(int i=0; i* pItems; KeepassEntryView* pEntryView; KeepassEntryView::KeepassEntryView(QWidget* parent):QTreeWidget(parent){ + ViewMode=Normal; AutoResizeColumns=true; header()->setResizeMode(QHeaderView::Interactive); header()->setStretchLastSection(false); @@ -51,6 +52,7 @@ KeepassEntryView::KeepassEntryView(QWidget* parent):QTreeWidget(parent){ ColumnOrder=config->columnOrder(); updateColumns(); + header()->setSortIndicator(config->columnSort(), config->columnSortOrder()); connect(header(),SIGNAL(sectionResized(int,int,int)),this,SLOT(OnColumnResized(int,int,int))); connect(this,SIGNAL(itemSelectionChanged()),this,SLOT(OnItemsChanged())); @@ -69,6 +71,8 @@ KeepassEntryView::~KeepassEntryView(){ config->setColumnSizes(ColumnSizes); config->setColumns(Columns); config->setColumnOrder(ColumnOrder); + config->setColumnSort(header()->sortIndicatorSection()); + config->setColumnSortOrder(header()->sortIndicatorOrder()); } void KeepassEntryView::OnGroupChanged(IGroupHandle* group){ @@ -106,14 +110,11 @@ bool sortSearchResultsLessThan(const IEntryHandle* a, const IEntryHandle* b){ void KeepassEntryView::OnHeaderSectionClicked(int index){ - if(header()->isSortIndicatorShown() && header()->sortIndicatorSection()==index){ + if(header()->sortIndicatorSection()==index){ header()->setSortIndicator(index,header()->sortIndicatorOrder() ? Qt::DescendingOrder : Qt::AscendingOrder); - sortItems(index,header()->sortIndicatorOrder()); } else{ header()->setSortIndicator(index,Qt::AscendingOrder); - header()->setSortIndicatorShown(true); - sortItems(index,Qt::AscendingOrder); } if(ViewMode==Normal){ @@ -272,7 +273,7 @@ void KeepassEntryView::OnEditEntry(){ void KeepassEntryView::OnEditOpenUrl(){ if (selectedItems().size() == 0) return; - openBrowser(((EntryViewItem*)selectedItems().first())->text(logicalColIndex(2))); + openBrowser( ((EntryViewItem*)selectedItems().first())->EntryHandle ); } void KeepassEntryView::OnUsernameToClipboard(){ @@ -360,7 +361,6 @@ void KeepassEntryView::showGroup(IGroupHandle* group){ } void KeepassEntryView::createItems(QList& entries){ - header()->setSortIndicatorShown(false); for(int i=0;iisValid())continue; EntryViewItem* item=new EntryViewItem(this); @@ -480,6 +480,7 @@ int KeepassEntryView::logicalColIndex(int LstIndex){ if(i==LstIndex)return c; } Q_ASSERT(false); + return -1; } void KeepassEntryView::resizeColumns(){ @@ -514,8 +515,8 @@ void KeepassEntryView::resizeColumns(){ } int KeepassEntryView::columnListIndex(int LogicalIndex){ - int c=-1; int i=0; - for(i;isetData("text/plain;charset=UTF-8",DragItems.first()->text(0).toUtf8()); mimeData->setData("application/x-keepassx-entry",QByteArray((char*)&pDragItems,sizeof(void*))); drag->setMimeData(mimeData); - drag->setPixmap(DragPixmap); - drag->start(); + drag->exec(Qt::MoveAction); } @@ -591,11 +591,13 @@ void KeepassEntryView::removeDragItems(){ } } +#ifdef AUTOTYPE void KeepassEntryView::OnAutoType(){ if (selectedItems().size() == 0) return; QString error; AutoType::perform(((EntryViewItem*)selectedItems().first())->EntryHandle,error); } +#endif void KeepassEntryView::paintEvent(QPaintEvent * event){ QTreeWidget::paintEvent(event); @@ -653,8 +655,8 @@ bool EntryViewItem::operator<(const QTreeWidgetItem& other)const{ void KeepassEntryView::setCurrentEntry(IEntryHandle* entry){ bool found=false; - int i=0; - for(i;iEntryHandle==entry){found=true; break;} if(!found)return; setCurrentItem(Items.at(i)); diff --git a/src/lib/EntryView.h b/src/lib/EntryView.h index 78c3f23..7a6a9ca 100644 --- a/src/lib/EntryView.h +++ b/src/lib/EntryView.h @@ -65,7 +65,6 @@ class KeepassEntryView:public QTreeWidget{ bool AutoResizeColumns; QPoint DragStartPos; QList DragItems; - QPixmap DragPixmap; IGroupHandle* CurrentGroup; enum EntryViewMode {Normal, ShowSearchResults}; EntryViewMode ViewMode; @@ -94,7 +93,9 @@ class KeepassEntryView:public QTreeWidget{ void OnCloneEntry(); void OnDeleteEntry(); void OnSaveAttachment(); +#ifdef AUTOTYPE void OnAutoType(); +#endif void removeDragItems(); void OnColumnMoved(int LogIndex,int OldVisIndex,int NewVisIndex); void OnEditOpenUrl(); diff --git a/src/lib/FileDialogs.h b/src/lib/FileDialogs.h index d5bd7fb..f69e44c 100644 --- a/src/lib/FileDialogs.h +++ b/src/lib/FileDialogs.h @@ -81,6 +81,7 @@ class KpxFileDialogs{ class QtStandardFileDialogs:public QObject,public IFileDialog{ Q_OBJECT + Q_INTERFACES(IFileDialog); public: QString openExistingFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters,int SelectedFilter); QStringList openExistingFilesDialog(QWidget* parent,QString title,QString dir,QStringList Filters,int SelectedFilter); diff --git a/src/lib/GroupView.cpp b/src/lib/GroupView.cpp index ff8cf5c..67e3c98 100644 --- a/src/lib/GroupView.cpp +++ b/src/lib/GroupView.cpp @@ -41,12 +41,10 @@ #define INSERT_AREA_WIDTH 4 KeepassGroupView::KeepassGroupView(QWidget* parent):QTreeWidget(parent){ - db=NULL; - setHeaderLabels(QStringList()<popup(e->globalPos()); } -void KeepassGroupView::OnCurrentGroupChanged(QTreeWidgetItem* cur,QTreeWidgetItem* prev){ +void KeepassGroupView::OnCurrentGroupChanged(QTreeWidgetItem* cur){ if(cur){ if(cur==SearchResultItem) emit searchResultsSelected(); @@ -181,8 +179,8 @@ void KeepassGroupView::OnCurrentGroupChanged(QTreeWidgetItem* cur,QTreeWidgetIte void KeepassGroupView::setCurrentGroup(IGroupHandle* group){ bool found=false; - int i=0; - for(i;iGroupHandle==group){found=true; break;} if(!found)return; setCurrentItem(Items[i]); @@ -194,13 +192,13 @@ void KeepassGroupView::dragEnterEvent ( QDragEnterEvent * event ){ if(event->mimeData()->hasFormat("application/x-keepassx-group")){ DragType=GroupDrag; - event->accept(); + event->acceptProposedAction(); return; } if(event->mimeData()->hasFormat("application/x-keepassx-entry")){ DragType=EntryDrag; memcpy(&EntryDragItems,event->mimeData()->data("application/x-keepassx-entry").data(),sizeof(void*)); - event->accept(); + event->acceptProposedAction(); return; } @@ -371,7 +369,7 @@ void KeepassGroupView::entryDragMoveEvent( QDragMoveEvent * event ){ Item->setForeground(0,QBrush(QApplication::palette().color(QPalette::HighlightedText))); LastHoverItem=Item; } - event->accept(); + event->acceptProposedAction(); return; } @@ -393,7 +391,7 @@ void KeepassGroupView::dragMoveEvent( QDragMoveEvent * event ){ InsLinePos=-1; viewport()->update(QRegion(0,RemoveLine-2,viewport()->width(),4)); } - event->accept(); + event->acceptProposedAction(); return; } if(Item==DragItem || Item==SearchResultItem){ @@ -435,7 +433,7 @@ void KeepassGroupView::dragMoveEvent( QDragMoveEvent * event ){ InsLineStart=ItemRect.x(); viewport()->update(QRegion(0,InsLinePos-2,viewport()->width(),4)); } - event->accept(); + event->acceptProposedAction(); return; } @@ -486,7 +484,7 @@ void KeepassGroupView::mouseMoveEvent(QMouseEvent *event){ mimeData->setData("application/x-keepassx-group",QByteArray()); drag->setMimeData(mimeData); - Qt::DropAction dropAction = drag->start(Qt::MoveAction); + drag->exec(Qt::MoveAction); } void KeepassGroupView::OnItemExpanded(QTreeWidgetItem* item){ diff --git a/src/lib/GroupView.h b/src/lib/GroupView.h index 710779d..7e3ce26 100644 --- a/src/lib/GroupView.h +++ b/src/lib/GroupView.h @@ -62,7 +62,7 @@ class KeepassGroupView:public QTreeWidget{ QList* EntryDragItems; public slots: - void OnCurrentGroupChanged(QTreeWidgetItem*,QTreeWidgetItem*); + void OnCurrentGroupChanged(QTreeWidgetItem*); void OnDeleteGroup(); void OnNewGroup(); void OnEditGroup(); diff --git a/src/lib/HelperX11.cpp b/src/lib/HelperX11.cpp new file mode 100644 index 0000000..6ecfffd --- /dev/null +++ b/src/lib/HelperX11.cpp @@ -0,0 +1,899 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 by Tarek Saidi, Felix Geyer * + * tarek.saidi@arcor.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; version 2 of the License. * + + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "HelperX11.h" + +#include + +int HelperX11::getModifiers(Display *d,KeySym keysym, int keycode){ + int SymsPerKey; + KeySym* Syms=XGetKeyboardMapping(d,keycode,1,&SymsPerKey); + int c=-1; + for(int i=0;i<4;i++) + if(Syms[i]==keysym){ + c=i; break; + } + Q_ASSERT(c!=-1); + XFree(Syms); + return c; +} + +void HelperX11::pressModifiers(Display* d,int mods,bool press){ + switch(mods){ + case 0: //no modifier + break; + case 1: //Shift + XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,2); + break; + case 2: //AltGr + XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,2); + break; + case 3: //Shift+AltGr + XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,2); + XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,2); + break; + } +} + +void HelperX11::releaseModifiers(Display* d,int mods){ + pressModifiers(d,mods,False); +} + +#ifdef GLOBAL_AUTOTYPE +int HelperX11::getShortcutModifierMask(const Shortcut& s){ + int mod=0; + if (s.ctrl) mod |= ControlMask; + if (s.shift) mod |= ShiftMask; + if (s.alt) mod |= Mod1Mask; + if (s.altgr) mod |= Mod5Mask; + if (s.win) mod |= Mod4Mask; + return mod; +} +#endif + +unsigned int HelperX11::keyboardModifiers(Display* d){ + Window root, child; + int root_x, root_y, x, y; + unsigned int mask; + XQueryPointer(d, RootWindow(d, DefaultScreen(d)), &root, &child, &root_x, &root_y, &x, &y, &mask); + return mask; +} + +void HelperX11:: startCatchErrors(){ + Q_ASSERT(!catchErrors); + catchErrors = true; + pErrorOccurred = false; + oldHandler = XSetErrorHandler(x11ErrorHandler); +} + +void HelperX11::stopCatchErrors(){ + Q_ASSERT(catchErrors); + XSync(QX11Info::display(), false); + XSetErrorHandler(oldHandler); + catchErrors = false; +} + +int HelperX11::x11ErrorHandler(Display* display, XErrorEvent* error){ + Q_UNUSED(display) + Q_UNUSED(error) + if (catchErrors) + pErrorOccurred = true; + return 1; +} + +int (*HelperX11::oldHandler) (Display*, XErrorEvent*) = NULL; +bool HelperX11::catchErrors = false; +bool HelperX11::pErrorOccurred = false; + +const quint16 HelperX11::KeysymMap[][2] = { + { 0x01a1, 0x0104 }, /* Aogonek Ą LATIN CAPITAL LETTER A WITH OGONEK */ + { 0x01a2, 0x02d8 }, /* breve ˘ BREVE */ + { 0x01a3, 0x0141 }, /* Lstroke Ł LATIN CAPITAL LETTER L WITH STROKE */ + { 0x01a5, 0x013d }, /* Lcaron Ľ LATIN CAPITAL LETTER L WITH CARON */ + { 0x01a6, 0x015a }, /* Sacute Ś LATIN CAPITAL LETTER S WITH ACUTE */ + { 0x01a9, 0x0160 }, /* Scaron Š LATIN CAPITAL LETTER S WITH CARON */ + { 0x01aa, 0x015e }, /* Scedilla Ş LATIN CAPITAL LETTER S WITH CEDILLA */ + { 0x01ab, 0x0164 }, /* Tcaron Ť LATIN CAPITAL LETTER T WITH CARON */ + { 0x01ac, 0x0179 }, /* Zacute Ź LATIN CAPITAL LETTER Z WITH ACUTE */ + { 0x01ae, 0x017d }, /* Zcaron Ž LATIN CAPITAL LETTER Z WITH CARON */ + { 0x01af, 0x017b }, /* Zabovedot Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE */ + { 0x01b1, 0x0105 }, /* aogonek ą LATIN SMALL LETTER A WITH OGONEK */ + { 0x01b2, 0x02db }, /* ogonek ˛ OGONEK */ + { 0x01b3, 0x0142 }, /* lstroke ł LATIN SMALL LETTER L WITH STROKE */ + { 0x01b5, 0x013e }, /* lcaron ľ LATIN SMALL LETTER L WITH CARON */ + { 0x01b6, 0x015b }, /* sacute ś LATIN SMALL LETTER S WITH ACUTE */ + { 0x01b7, 0x02c7 }, /* caron ˇ CARON */ + { 0x01b9, 0x0161 }, /* scaron š LATIN SMALL LETTER S WITH CARON */ + { 0x01ba, 0x015f }, /* scedilla ş LATIN SMALL LETTER S WITH CEDILLA */ + { 0x01bb, 0x0165 }, /* tcaron ť LATIN SMALL LETTER T WITH CARON */ + { 0x01bc, 0x017a }, /* zacute ź LATIN SMALL LETTER Z WITH ACUTE */ + { 0x01bd, 0x02dd }, /* doubleacute ˝ DOUBLE ACUTE ACCENT */ + { 0x01be, 0x017e }, /* zcaron ž LATIN SMALL LETTER Z WITH CARON */ + { 0x01bf, 0x017c }, /* zabovedot ż LATIN SMALL LETTER Z WITH DOT ABOVE */ + { 0x01c0, 0x0154 }, /* Racute Ŕ LATIN CAPITAL LETTER R WITH ACUTE */ + { 0x01c3, 0x0102 }, /* Abreve Ă LATIN CAPITAL LETTER A WITH BREVE */ + { 0x01c5, 0x0139 }, /* Lacute Ĺ LATIN CAPITAL LETTER L WITH ACUTE */ + { 0x01c6, 0x0106 }, /* Cacute Ć LATIN CAPITAL LETTER C WITH ACUTE */ + { 0x01c8, 0x010c }, /* Ccaron Č LATIN CAPITAL LETTER C WITH CARON */ + { 0x01ca, 0x0118 }, /* Eogonek Ę LATIN CAPITAL LETTER E WITH OGONEK */ + { 0x01cc, 0x011a }, /* Ecaron Ě LATIN CAPITAL LETTER E WITH CARON */ + { 0x01cf, 0x010e }, /* Dcaron Ď LATIN CAPITAL LETTER D WITH CARON */ + { 0x01d0, 0x0110 }, /* Dstroke Đ LATIN CAPITAL LETTER D WITH STROKE */ + { 0x01d1, 0x0143 }, /* Nacute Ń LATIN CAPITAL LETTER N WITH ACUTE */ + { 0x01d2, 0x0147 }, /* Ncaron Ň LATIN CAPITAL LETTER N WITH CARON */ + { 0x01d5, 0x0150 }, /* Odoubleacute Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ + { 0x01d8, 0x0158 }, /* Rcaron Ř LATIN CAPITAL LETTER R WITH CARON */ + { 0x01d9, 0x016e }, /* Uring Ů LATIN CAPITAL LETTER U WITH RING ABOVE */ + { 0x01db, 0x0170 }, /* Udoubleacute Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ + { 0x01de, 0x0162 }, /* Tcedilla Ţ LATIN CAPITAL LETTER T WITH CEDILLA */ + { 0x01e0, 0x0155 }, /* racute ŕ LATIN SMALL LETTER R WITH ACUTE */ + { 0x01e3, 0x0103 }, /* abreve ă LATIN SMALL LETTER A WITH BREVE */ + { 0x01e5, 0x013a }, /* lacute ĺ LATIN SMALL LETTER L WITH ACUTE */ + { 0x01e6, 0x0107 }, /* cacute ć LATIN SMALL LETTER C WITH ACUTE */ + { 0x01e8, 0x010d }, /* ccaron č LATIN SMALL LETTER C WITH CARON */ + { 0x01ea, 0x0119 }, /* eogonek ę LATIN SMALL LETTER E WITH OGONEK */ + { 0x01ec, 0x011b }, /* ecaron ě LATIN SMALL LETTER E WITH CARON */ + { 0x01ef, 0x010f }, /* dcaron ď LATIN SMALL LETTER D WITH CARON */ + { 0x01f0, 0x0111 }, /* dstroke đ LATIN SMALL LETTER D WITH STROKE */ + { 0x01f1, 0x0144 }, /* nacute ń LATIN SMALL LETTER N WITH ACUTE */ + { 0x01f2, 0x0148 }, /* ncaron ň LATIN SMALL LETTER N WITH CARON */ + { 0x01f5, 0x0151 }, /* odoubleacute ő LATIN SMALL LETTER O WITH DOUBLE ACUTE */ + { 0x01f8, 0x0159 }, /* rcaron ř LATIN SMALL LETTER R WITH CARON */ + { 0x01f9, 0x016f }, /* uring ů LATIN SMALL LETTER U WITH RING ABOVE */ + { 0x01fb, 0x0171 }, /* udoubleacute ű LATIN SMALL LETTER U WITH DOUBLE ACUTE */ + { 0x01fe, 0x0163 }, /* tcedilla ţ LATIN SMALL LETTER T WITH CEDILLA */ + { 0x01ff, 0x02d9 }, /* abovedot ˙ DOT ABOVE */ + { 0x02a1, 0x0126 }, /* Hstroke Ħ LATIN CAPITAL LETTER H WITH STROKE */ + { 0x02a6, 0x0124 }, /* Hcircumflex Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ + { 0x02a9, 0x0130 }, /* Iabovedot İ LATIN CAPITAL LETTER I WITH DOT ABOVE */ + { 0x02ab, 0x011e }, /* Gbreve Ğ LATIN CAPITAL LETTER G WITH BREVE */ + { 0x02ac, 0x0134 }, /* Jcircumflex Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ + { 0x02b1, 0x0127 }, /* hstroke ħ LATIN SMALL LETTER H WITH STROKE */ + { 0x02b6, 0x0125 }, /* hcircumflex ĥ LATIN SMALL LETTER H WITH CIRCUMFLEX */ + { 0x02b9, 0x0131 }, /* idotless ı LATIN SMALL LETTER DOTLESS I */ + { 0x02bb, 0x011f }, /* gbreve ğ LATIN SMALL LETTER G WITH BREVE */ + { 0x02bc, 0x0135 }, /* jcircumflex ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX */ + { 0x02c5, 0x010a }, /* Cabovedot Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE */ + { 0x02c6, 0x0108 }, /* Ccircumflex Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ + { 0x02d5, 0x0120 }, /* Gabovedot Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE */ + { 0x02d8, 0x011c }, /* Gcircumflex Ĝ LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ + { 0x02dd, 0x016c }, /* Ubreve Ŭ LATIN CAPITAL LETTER U WITH BREVE */ + { 0x02de, 0x015c }, /* Scircumflex Ŝ LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ + { 0x02e5, 0x010b }, /* cabovedot ċ LATIN SMALL LETTER C WITH DOT ABOVE */ + { 0x02e6, 0x0109 }, /* ccircumflex ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX */ + { 0x02f5, 0x0121 }, /* gabovedot ġ LATIN SMALL LETTER G WITH DOT ABOVE */ + { 0x02f8, 0x011d }, /* gcircumflex ĝ LATIN SMALL LETTER G WITH CIRCUMFLEX */ + { 0x02fd, 0x016d }, /* ubreve ŭ LATIN SMALL LETTER U WITH BREVE */ + { 0x02fe, 0x015d }, /* scircumflex ŝ LATIN SMALL LETTER S WITH CIRCUMFLEX */ + { 0x03a2, 0x0138 }, /* kra ĸ LATIN SMALL LETTER KRA */ + { 0x03a3, 0x0156 }, /* Rcedilla Ŗ LATIN CAPITAL LETTER R WITH CEDILLA */ + { 0x03a5, 0x0128 }, /* Itilde Ĩ LATIN CAPITAL LETTER I WITH TILDE */ + { 0x03a6, 0x013b }, /* Lcedilla Ļ LATIN CAPITAL LETTER L WITH CEDILLA */ + { 0x03aa, 0x0112 }, /* Emacron Ē LATIN CAPITAL LETTER E WITH MACRON */ + { 0x03ab, 0x0122 }, /* Gcedilla Ģ LATIN CAPITAL LETTER G WITH CEDILLA */ + { 0x03ac, 0x0166 }, /* Tslash Ŧ LATIN CAPITAL LETTER T WITH STROKE */ + { 0x03b3, 0x0157 }, /* rcedilla ŗ LATIN SMALL LETTER R WITH CEDILLA */ + { 0x03b5, 0x0129 }, /* itilde ĩ LATIN SMALL LETTER I WITH TILDE */ + { 0x03b6, 0x013c }, /* lcedilla ļ LATIN SMALL LETTER L WITH CEDILLA */ + { 0x03ba, 0x0113 }, /* emacron ē LATIN SMALL LETTER E WITH MACRON */ + { 0x03bb, 0x0123 }, /* gcedilla ģ LATIN SMALL LETTER G WITH CEDILLA */ + { 0x03bc, 0x0167 }, /* tslash ŧ LATIN SMALL LETTER T WITH STROKE */ + { 0x03bd, 0x014a }, /* ENG Ŋ LATIN CAPITAL LETTER ENG */ + { 0x03bf, 0x014b }, /* eng ŋ LATIN SMALL LETTER ENG */ + { 0x03c0, 0x0100 }, /* Amacron Ā LATIN CAPITAL LETTER A WITH MACRON */ + { 0x03c7, 0x012e }, /* Iogonek Į LATIN CAPITAL LETTER I WITH OGONEK */ + { 0x03cc, 0x0116 }, /* Eabovedot Ė LATIN CAPITAL LETTER E WITH DOT ABOVE */ + { 0x03cf, 0x012a }, /* Imacron Ī LATIN CAPITAL LETTER I WITH MACRON */ + { 0x03d1, 0x0145 }, /* Ncedilla Ņ LATIN CAPITAL LETTER N WITH CEDILLA */ + { 0x03d2, 0x014c }, /* Omacron Ō LATIN CAPITAL LETTER O WITH MACRON */ + { 0x03d3, 0x0136 }, /* Kcedilla Ķ LATIN CAPITAL LETTER K WITH CEDILLA */ + { 0x03d9, 0x0172 }, /* Uogonek Ų LATIN CAPITAL LETTER U WITH OGONEK */ + { 0x03dd, 0x0168 }, /* Utilde Ũ LATIN CAPITAL LETTER U WITH TILDE */ + { 0x03de, 0x016a }, /* Umacron Ū LATIN CAPITAL LETTER U WITH MACRON */ + { 0x03e0, 0x0101 }, /* amacron ā LATIN SMALL LETTER A WITH MACRON */ + { 0x03e7, 0x012f }, /* iogonek į LATIN SMALL LETTER I WITH OGONEK */ + { 0x03ec, 0x0117 }, /* eabovedot ė LATIN SMALL LETTER E WITH DOT ABOVE */ + { 0x03ef, 0x012b }, /* imacron ī LATIN SMALL LETTER I WITH MACRON */ + { 0x03f1, 0x0146 }, /* ncedilla ņ LATIN SMALL LETTER N WITH CEDILLA */ + { 0x03f2, 0x014d }, /* omacron ō LATIN SMALL LETTER O WITH MACRON */ + { 0x03f3, 0x0137 }, /* kcedilla ķ LATIN SMALL LETTER K WITH CEDILLA */ + { 0x03f9, 0x0173 }, /* uogonek ų LATIN SMALL LETTER U WITH OGONEK */ + { 0x03fd, 0x0169 }, /* utilde ũ LATIN SMALL LETTER U WITH TILDE */ + { 0x03fe, 0x016b }, /* umacron ū LATIN SMALL LETTER U WITH MACRON */ + { 0x047e, 0x203e }, /* overline ‾ OVERLINE */ + { 0x04a1, 0x3002 }, /* kana_fullstop 。 IDEOGRAPHIC FULL STOP */ + { 0x04a2, 0x300c }, /* kana_openingbracket 「 LEFT CORNER BRACKET */ + { 0x04a3, 0x300d }, /* kana_closingbracket 」 RIGHT CORNER BRACKET */ + { 0x04a4, 0x3001 }, /* kana_comma 、 IDEOGRAPHIC COMMA */ + { 0x04a5, 0x30fb }, /* kana_conjunctive ・ KATAKANA MIDDLE DOT */ + { 0x04a6, 0x30f2 }, /* kana_WO ヲ KATAKANA LETTER WO */ + { 0x04a7, 0x30a1 }, /* kana_a ァ KATAKANA LETTER SMALL A */ + { 0x04a8, 0x30a3 }, /* kana_i ィ KATAKANA LETTER SMALL I */ + { 0x04a9, 0x30a5 }, /* kana_u ゥ KATAKANA LETTER SMALL U */ + { 0x04aa, 0x30a7 }, /* kana_e ェ KATAKANA LETTER SMALL E */ + { 0x04ab, 0x30a9 }, /* kana_o ォ KATAKANA LETTER SMALL O */ + { 0x04ac, 0x30e3 }, /* kana_ya ャ KATAKANA LETTER SMALL YA */ + { 0x04ad, 0x30e5 }, /* kana_yu ュ KATAKANA LETTER SMALL YU */ + { 0x04ae, 0x30e7 }, /* kana_yo ョ KATAKANA LETTER SMALL YO */ + { 0x04af, 0x30c3 }, /* kana_tsu ッ KATAKANA LETTER SMALL TU */ + { 0x04b0, 0x30fc }, /* prolongedsound ー KATAKANA-HIRAGANA PROLONGED SOUND MARK */ + { 0x04b1, 0x30a2 }, /* kana_A ア KATAKANA LETTER A */ + { 0x04b2, 0x30a4 }, /* kana_I イ KATAKANA LETTER I */ + { 0x04b3, 0x30a6 }, /* kana_U ウ KATAKANA LETTER U */ + { 0x04b4, 0x30a8 }, /* kana_E エ KATAKANA LETTER E */ + { 0x04b5, 0x30aa }, /* kana_O オ KATAKANA LETTER O */ + { 0x04b6, 0x30ab }, /* kana_KA カ KATAKANA LETTER KA */ + { 0x04b7, 0x30ad }, /* kana_KI キ KATAKANA LETTER KI */ + { 0x04b8, 0x30af }, /* kana_KU ク KATAKANA LETTER KU */ + { 0x04b9, 0x30b1 }, /* kana_KE ケ KATAKANA LETTER KE */ + { 0x04ba, 0x30b3 }, /* kana_KO コ KATAKANA LETTER KO */ + { 0x04bb, 0x30b5 }, /* kana_SA サ KATAKANA LETTER SA */ + { 0x04bc, 0x30b7 }, /* kana_SHI シ KATAKANA LETTER SI */ + { 0x04bd, 0x30b9 }, /* kana_SU ス KATAKANA LETTER SU */ + { 0x04be, 0x30bb }, /* kana_SE セ KATAKANA LETTER SE */ + { 0x04bf, 0x30bd }, /* kana_SO ソ KATAKANA LETTER SO */ + { 0x04c0, 0x30bf }, /* kana_TA タ KATAKANA LETTER TA */ + { 0x04c1, 0x30c1 }, /* kana_CHI チ KATAKANA LETTER TI */ + { 0x04c2, 0x30c4 }, /* kana_TSU ツ KATAKANA LETTER TU */ + { 0x04c3, 0x30c6 }, /* kana_TE テ KATAKANA LETTER TE */ + { 0x04c4, 0x30c8 }, /* kana_TO ト KATAKANA LETTER TO */ + { 0x04c5, 0x30ca }, /* kana_NA ナ KATAKANA LETTER NA */ + { 0x04c6, 0x30cb }, /* kana_NI ニ KATAKANA LETTER NI */ + { 0x04c7, 0x30cc }, /* kana_NU ヌ KATAKANA LETTER NU */ + { 0x04c8, 0x30cd }, /* kana_NE ネ KATAKANA LETTER NE */ + { 0x04c9, 0x30ce }, /* kana_NO ノ KATAKANA LETTER NO */ + { 0x04ca, 0x30cf }, /* kana_HA ハ KATAKANA LETTER HA */ + { 0x04cb, 0x30d2 }, /* kana_HI ヒ KATAKANA LETTER HI */ + { 0x04cc, 0x30d5 }, /* kana_FU フ KATAKANA LETTER HU */ + { 0x04cd, 0x30d8 }, /* kana_HE ヘ KATAKANA LETTER HE */ + { 0x04ce, 0x30db }, /* kana_HO ホ KATAKANA LETTER HO */ + { 0x04cf, 0x30de }, /* kana_MA マ KATAKANA LETTER MA */ + { 0x04d0, 0x30df }, /* kana_MI ミ KATAKANA LETTER MI */ + { 0x04d1, 0x30e0 }, /* kana_MU ム KATAKANA LETTER MU */ + { 0x04d2, 0x30e1 }, /* kana_ME メ KATAKANA LETTER ME */ + { 0x04d3, 0x30e2 }, /* kana_MO モ KATAKANA LETTER MO */ + { 0x04d4, 0x30e4 }, /* kana_YA ヤ KATAKANA LETTER YA */ + { 0x04d5, 0x30e6 }, /* kana_YU ユ KATAKANA LETTER YU */ + { 0x04d6, 0x30e8 }, /* kana_YO ヨ KATAKANA LETTER YO */ + { 0x04d7, 0x30e9 }, /* kana_RA ラ KATAKANA LETTER RA */ + { 0x04d8, 0x30ea }, /* kana_RI リ KATAKANA LETTER RI */ + { 0x04d9, 0x30eb }, /* kana_RU ル KATAKANA LETTER RU */ + { 0x04da, 0x30ec }, /* kana_RE レ KATAKANA LETTER RE */ + { 0x04db, 0x30ed }, /* kana_RO ロ KATAKANA LETTER RO */ + { 0x04dc, 0x30ef }, /* kana_WA ワ KATAKANA LETTER WA */ + { 0x04dd, 0x30f3 }, /* kana_N ン KATAKANA LETTER N */ + { 0x04de, 0x309b }, /* voicedsound ゛ KATAKANA-HIRAGANA VOICED SOUND MARK */ + { 0x04df, 0x309c }, /* semivoicedsound ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ + { 0x05ac, 0x060c }, /* Arabic_comma ، ARABIC COMMA */ + { 0x05bb, 0x061b }, /* Arabic_semicolon ؛ ARABIC SEMICOLON */ + { 0x05bf, 0x061f }, /* Arabic_question_mark ؟ ARABIC QUESTION MARK */ + { 0x05c1, 0x0621 }, /* Arabic_hamza ء ARABIC LETTER HAMZA */ + { 0x05c2, 0x0622 }, /* Arabic_maddaonalef آ ARABIC LETTER ALEF WITH MADDA ABOVE */ + { 0x05c3, 0x0623 }, /* Arabic_hamzaonalef أ ARABIC LETTER ALEF WITH HAMZA ABOVE */ + { 0x05c4, 0x0624 }, /* Arabic_hamzaonwaw ؤ ARABIC LETTER WAW WITH HAMZA ABOVE */ + { 0x05c5, 0x0625 }, /* Arabic_hamzaunderalef إ ARABIC LETTER ALEF WITH HAMZA BELOW */ + { 0x05c6, 0x0626 }, /* Arabic_hamzaonyeh ئ ARABIC LETTER YEH WITH HAMZA ABOVE */ + { 0x05c7, 0x0627 }, /* Arabic_alef ا ARABIC LETTER ALEF */ + { 0x05c8, 0x0628 }, /* Arabic_beh ب ARABIC LETTER BEH */ + { 0x05c9, 0x0629 }, /* Arabic_tehmarbuta ة ARABIC LETTER TEH MARBUTA */ + { 0x05ca, 0x062a }, /* Arabic_teh ت ARABIC LETTER TEH */ + { 0x05cb, 0x062b }, /* Arabic_theh ث ARABIC LETTER THEH */ + { 0x05cc, 0x062c }, /* Arabic_jeem ج ARABIC LETTER JEEM */ + { 0x05cd, 0x062d }, /* Arabic_hah ح ARABIC LETTER HAH */ + { 0x05ce, 0x062e }, /* Arabic_khah خ ARABIC LETTER KHAH */ + { 0x05cf, 0x062f }, /* Arabic_dal د ARABIC LETTER DAL */ + { 0x05d0, 0x0630 }, /* Arabic_thal ذ ARABIC LETTER THAL */ + { 0x05d1, 0x0631 }, /* Arabic_ra ر ARABIC LETTER REH */ + { 0x05d2, 0x0632 }, /* Arabic_zain ز ARABIC LETTER ZAIN */ + { 0x05d3, 0x0633 }, /* Arabic_seen س ARABIC LETTER SEEN */ + { 0x05d4, 0x0634 }, /* Arabic_sheen ش ARABIC LETTER SHEEN */ + { 0x05d5, 0x0635 }, /* Arabic_sad ص ARABIC LETTER SAD */ + { 0x05d6, 0x0636 }, /* Arabic_dad ض ARABIC LETTER DAD */ + { 0x05d7, 0x0637 }, /* Arabic_tah ط ARABIC LETTER TAH */ + { 0x05d8, 0x0638 }, /* Arabic_zah ظ ARABIC LETTER ZAH */ + { 0x05d9, 0x0639 }, /* Arabic_ain ع ARABIC LETTER AIN */ + { 0x05da, 0x063a }, /* Arabic_ghain غ ARABIC LETTER GHAIN */ + { 0x05e0, 0x0640 }, /* Arabic_tatweel ـ ARABIC TATWEEL */ + { 0x05e1, 0x0641 }, /* Arabic_feh ف ARABIC LETTER FEH */ + { 0x05e2, 0x0642 }, /* Arabic_qaf ق ARABIC LETTER QAF */ + { 0x05e3, 0x0643 }, /* Arabic_kaf ك ARABIC LETTER KAF */ + { 0x05e4, 0x0644 }, /* Arabic_lam ل ARABIC LETTER LAM */ + { 0x05e5, 0x0645 }, /* Arabic_meem م ARABIC LETTER MEEM */ + { 0x05e6, 0x0646 }, /* Arabic_noon ن ARABIC LETTER NOON */ + { 0x05e7, 0x0647 }, /* Arabic_ha ه ARABIC LETTER HEH */ + { 0x05e8, 0x0648 }, /* Arabic_waw و ARABIC LETTER WAW */ + { 0x05e9, 0x0649 }, /* Arabic_alefmaksura ى ARABIC LETTER ALEF MAKSURA */ + { 0x05ea, 0x064a }, /* Arabic_yeh ي ARABIC LETTER YEH */ + { 0x05eb, 0x064b }, /* Arabic_fathatan ً ARABIC FATHATAN */ + { 0x05ec, 0x064c }, /* Arabic_dammatan ٌ ARABIC DAMMATAN */ + { 0x05ed, 0x064d }, /* Arabic_kasratan ٍ ARABIC KASRATAN */ + { 0x05ee, 0x064e }, /* Arabic_fatha َ ARABIC FATHA */ + { 0x05ef, 0x064f }, /* Arabic_damma ُ ARABIC DAMMA */ + { 0x05f0, 0x0650 }, /* Arabic_kasra ِ ARABIC KASRA */ + { 0x05f1, 0x0651 }, /* Arabic_shadda ّ ARABIC SHADDA */ + { 0x05f2, 0x0652 }, /* Arabic_sukun ْ ARABIC SUKUN */ + { 0x06a1, 0x0452 }, /* Serbian_dje ђ CYRILLIC SMALL LETTER DJE */ + { 0x06a2, 0x0453 }, /* Macedonia_gje ѓ CYRILLIC SMALL LETTER GJE */ + { 0x06a3, 0x0451 }, /* Cyrillic_io ё CYRILLIC SMALL LETTER IO */ + { 0x06a4, 0x0454 }, /* Ukrainian_ie є CYRILLIC SMALL LETTER UKRAINIAN IE */ + { 0x06a5, 0x0455 }, /* Macedonia_dse ѕ CYRILLIC SMALL LETTER DZE */ + { 0x06a6, 0x0456 }, /* Ukrainian_i і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ + { 0x06a7, 0x0457 }, /* Ukrainian_yi ї CYRILLIC SMALL LETTER YI */ + { 0x06a8, 0x0458 }, /* Cyrillic_je ј CYRILLIC SMALL LETTER JE */ + { 0x06a9, 0x0459 }, /* Cyrillic_lje љ CYRILLIC SMALL LETTER LJE */ + { 0x06aa, 0x045a }, /* Cyrillic_nje њ CYRILLIC SMALL LETTER NJE */ + { 0x06ab, 0x045b }, /* Serbian_tshe ћ CYRILLIC SMALL LETTER TSHE */ + { 0x06ac, 0x045c }, /* Macedonia_kje ќ CYRILLIC SMALL LETTER KJE */ + { 0x06ae, 0x045e }, /* Byelorussian_shortu ў CYRILLIC SMALL LETTER SHORT U */ + { 0x06af, 0x045f }, /* Cyrillic_dzhe џ CYRILLIC SMALL LETTER DZHE */ + { 0x06b0, 0x2116 }, /* numerosign № NUMERO SIGN */ + { 0x06b1, 0x0402 }, /* Serbian_DJE Ђ CYRILLIC CAPITAL LETTER DJE */ + { 0x06b2, 0x0403 }, /* Macedonia_GJE Ѓ CYRILLIC CAPITAL LETTER GJE */ + { 0x06b3, 0x0401 }, /* Cyrillic_IO Ё CYRILLIC CAPITAL LETTER IO */ + { 0x06b4, 0x0404 }, /* Ukrainian_IE Є CYRILLIC CAPITAL LETTER UKRAINIAN IE */ + { 0x06b5, 0x0405 }, /* Macedonia_DSE Ѕ CYRILLIC CAPITAL LETTER DZE */ + { 0x06b6, 0x0406 }, /* Ukrainian_I І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ + { 0x06b7, 0x0407 }, /* Ukrainian_YI Ї CYRILLIC CAPITAL LETTER YI */ + { 0x06b8, 0x0408 }, /* Cyrillic_JE Ј CYRILLIC CAPITAL LETTER JE */ + { 0x06b9, 0x0409 }, /* Cyrillic_LJE Љ CYRILLIC CAPITAL LETTER LJE */ + { 0x06ba, 0x040a }, /* Cyrillic_NJE Њ CYRILLIC CAPITAL LETTER NJE */ + { 0x06bb, 0x040b }, /* Serbian_TSHE Ћ CYRILLIC CAPITAL LETTER TSHE */ + { 0x06bc, 0x040c }, /* Macedonia_KJE Ќ CYRILLIC CAPITAL LETTER KJE */ + { 0x06be, 0x040e }, /* Byelorussian_SHORTU Ў CYRILLIC CAPITAL LETTER SHORT U */ + { 0x06bf, 0x040f }, /* Cyrillic_DZHE Џ CYRILLIC CAPITAL LETTER DZHE */ + { 0x06c0, 0x044e }, /* Cyrillic_yu ю CYRILLIC SMALL LETTER YU */ + { 0x06c1, 0x0430 }, /* Cyrillic_a а CYRILLIC SMALL LETTER A */ + { 0x06c2, 0x0431 }, /* Cyrillic_be б CYRILLIC SMALL LETTER BE */ + { 0x06c3, 0x0446 }, /* Cyrillic_tse ц CYRILLIC SMALL LETTER TSE */ + { 0x06c4, 0x0434 }, /* Cyrillic_de д CYRILLIC SMALL LETTER DE */ + { 0x06c5, 0x0435 }, /* Cyrillic_ie е CYRILLIC SMALL LETTER IE */ + { 0x06c6, 0x0444 }, /* Cyrillic_ef ф CYRILLIC SMALL LETTER EF */ + { 0x06c7, 0x0433 }, /* Cyrillic_ghe г CYRILLIC SMALL LETTER GHE */ + { 0x06c8, 0x0445 }, /* Cyrillic_ha х CYRILLIC SMALL LETTER HA */ + { 0x06c9, 0x0438 }, /* Cyrillic_i и CYRILLIC SMALL LETTER I */ + { 0x06ca, 0x0439 }, /* Cyrillic_shorti й CYRILLIC SMALL LETTER SHORT I */ + { 0x06cb, 0x043a }, /* Cyrillic_ka к CYRILLIC SMALL LETTER KA */ + { 0x06cc, 0x043b }, /* Cyrillic_el л CYRILLIC SMALL LETTER EL */ + { 0x06cd, 0x043c }, /* Cyrillic_em м CYRILLIC SMALL LETTER EM */ + { 0x06ce, 0x043d }, /* Cyrillic_en н CYRILLIC SMALL LETTER EN */ + { 0x06cf, 0x043e }, /* Cyrillic_o о CYRILLIC SMALL LETTER O */ + { 0x06d0, 0x043f }, /* Cyrillic_pe п CYRILLIC SMALL LETTER PE */ + { 0x06d1, 0x044f }, /* Cyrillic_ya я CYRILLIC SMALL LETTER YA */ + { 0x06d2, 0x0440 }, /* Cyrillic_er р CYRILLIC SMALL LETTER ER */ + { 0x06d3, 0x0441 }, /* Cyrillic_es с CYRILLIC SMALL LETTER ES */ + { 0x06d4, 0x0442 }, /* Cyrillic_te т CYRILLIC SMALL LETTER TE */ + { 0x06d5, 0x0443 }, /* Cyrillic_u у CYRILLIC SMALL LETTER U */ + { 0x06d6, 0x0436 }, /* Cyrillic_zhe ж CYRILLIC SMALL LETTER ZHE */ + { 0x06d7, 0x0432 }, /* Cyrillic_ve в CYRILLIC SMALL LETTER VE */ + { 0x06d8, 0x044c }, /* Cyrillic_softsign ь CYRILLIC SMALL LETTER SOFT SIGN */ + { 0x06d9, 0x044b }, /* Cyrillic_yeru ы CYRILLIC SMALL LETTER YERU */ + { 0x06da, 0x0437 }, /* Cyrillic_ze з CYRILLIC SMALL LETTER ZE */ + { 0x06db, 0x0448 }, /* Cyrillic_sha ш CYRILLIC SMALL LETTER SHA */ + { 0x06dc, 0x044d }, /* Cyrillic_e э CYRILLIC SMALL LETTER E */ + { 0x06dd, 0x0449 }, /* Cyrillic_shcha щ CYRILLIC SMALL LETTER SHCHA */ + { 0x06de, 0x0447 }, /* Cyrillic_che ч CYRILLIC SMALL LETTER CHE */ + { 0x06df, 0x044a }, /* Cyrillic_hardsign ъ CYRILLIC SMALL LETTER HARD SIGN */ + { 0x06e0, 0x042e }, /* Cyrillic_YU Ю CYRILLIC CAPITAL LETTER YU */ + { 0x06e1, 0x0410 }, /* Cyrillic_A А CYRILLIC CAPITAL LETTER A */ + { 0x06e2, 0x0411 }, /* Cyrillic_BE Б CYRILLIC CAPITAL LETTER BE */ + { 0x06e3, 0x0426 }, /* Cyrillic_TSE Ц CYRILLIC CAPITAL LETTER TSE */ + { 0x06e4, 0x0414 }, /* Cyrillic_DE Д CYRILLIC CAPITAL LETTER DE */ + { 0x06e5, 0x0415 }, /* Cyrillic_IE Е CYRILLIC CAPITAL LETTER IE */ + { 0x06e6, 0x0424 }, /* Cyrillic_EF Ф CYRILLIC CAPITAL LETTER EF */ + { 0x06e7, 0x0413 }, /* Cyrillic_GHE Г CYRILLIC CAPITAL LETTER GHE */ + { 0x06e8, 0x0425 }, /* Cyrillic_HA Х CYRILLIC CAPITAL LETTER HA */ + { 0x06e9, 0x0418 }, /* Cyrillic_I И CYRILLIC CAPITAL LETTER I */ + { 0x06ea, 0x0419 }, /* Cyrillic_SHORTI Й CYRILLIC CAPITAL LETTER SHORT I */ + { 0x06eb, 0x041a }, /* Cyrillic_KA К CYRILLIC CAPITAL LETTER KA */ + { 0x06ec, 0x041b }, /* Cyrillic_EL Л CYRILLIC CAPITAL LETTER EL */ + { 0x06ed, 0x041c }, /* Cyrillic_EM М CYRILLIC CAPITAL LETTER EM */ + { 0x06ee, 0x041d }, /* Cyrillic_EN Н CYRILLIC CAPITAL LETTER EN */ + { 0x06ef, 0x041e }, /* Cyrillic_O О CYRILLIC CAPITAL LETTER O */ + { 0x06f0, 0x041f }, /* Cyrillic_PE П CYRILLIC CAPITAL LETTER PE */ + { 0x06f1, 0x042f }, /* Cyrillic_YA Я CYRILLIC CAPITAL LETTER YA */ + { 0x06f2, 0x0420 }, /* Cyrillic_ER Р CYRILLIC CAPITAL LETTER ER */ + { 0x06f3, 0x0421 }, /* Cyrillic_ES С CYRILLIC CAPITAL LETTER ES */ + { 0x06f4, 0x0422 }, /* Cyrillic_TE Т CYRILLIC CAPITAL LETTER TE */ + { 0x06f5, 0x0423 }, /* Cyrillic_U У CYRILLIC CAPITAL LETTER U */ + { 0x06f6, 0x0416 }, /* Cyrillic_ZHE Ж CYRILLIC CAPITAL LETTER ZHE */ + { 0x06f7, 0x0412 }, /* Cyrillic_VE В CYRILLIC CAPITAL LETTER VE */ + { 0x06f8, 0x042c }, /* Cyrillic_SOFTSIGN Ь CYRILLIC CAPITAL LETTER SOFT SIGN */ + { 0x06f9, 0x042b }, /* Cyrillic_YERU Ы CYRILLIC CAPITAL LETTER YERU */ + { 0x06fa, 0x0417 }, /* Cyrillic_ZE З CYRILLIC CAPITAL LETTER ZE */ + { 0x06fb, 0x0428 }, /* Cyrillic_SHA Ш CYRILLIC CAPITAL LETTER SHA */ + { 0x06fc, 0x042d }, /* Cyrillic_E Э CYRILLIC CAPITAL LETTER E */ + { 0x06fd, 0x0429 }, /* Cyrillic_SHCHA Щ CYRILLIC CAPITAL LETTER SHCHA */ + { 0x06fe, 0x0427 }, /* Cyrillic_CHE Ч CYRILLIC CAPITAL LETTER CHE */ + { 0x06ff, 0x042a }, /* Cyrillic_HARDSIGN Ъ CYRILLIC CAPITAL LETTER HARD SIGN */ + { 0x07a1, 0x0386 }, /* Greek_ALPHAaccent Ά GREEK CAPITAL LETTER ALPHA WITH TONOS */ + { 0x07a2, 0x0388 }, /* Greek_EPSILONaccent Έ GREEK CAPITAL LETTER EPSILON WITH TONOS */ + { 0x07a3, 0x0389 }, /* Greek_ETAaccent Ή GREEK CAPITAL LETTER ETA WITH TONOS */ + { 0x07a4, 0x038a }, /* Greek_IOTAaccent Ί GREEK CAPITAL LETTER IOTA WITH TONOS */ + { 0x07a5, 0x03aa }, /* Greek_IOTAdiaeresis Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ + { 0x07a7, 0x038c }, /* Greek_OMICRONaccent Ό GREEK CAPITAL LETTER OMICRON WITH TONOS */ + { 0x07a8, 0x038e }, /* Greek_UPSILONaccent Ύ GREEK CAPITAL LETTER UPSILON WITH TONOS */ + { 0x07a9, 0x03ab }, /* Greek_UPSILONdieresis Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ + { 0x07ab, 0x038f }, /* Greek_OMEGAaccent Ώ GREEK CAPITAL LETTER OMEGA WITH TONOS */ + { 0x07ae, 0x0385 }, /* Greek_accentdieresis ΅ GREEK DIALYTIKA TONOS */ + { 0x07af, 0x2015 }, /* Greek_horizbar ― HORIZONTAL BAR */ + { 0x07b1, 0x03ac }, /* Greek_alphaaccent ά GREEK SMALL LETTER ALPHA WITH TONOS */ + { 0x07b2, 0x03ad }, /* Greek_epsilonaccent έ GREEK SMALL LETTER EPSILON WITH TONOS */ + { 0x07b3, 0x03ae }, /* Greek_etaaccent ή GREEK SMALL LETTER ETA WITH TONOS */ + { 0x07b4, 0x03af }, /* Greek_iotaaccent ί GREEK SMALL LETTER IOTA WITH TONOS */ + { 0x07b5, 0x03ca }, /* Greek_iotadieresis ϊ GREEK SMALL LETTER IOTA WITH DIALYTIKA */ + { 0x07b6, 0x0390 }, /* Greek_iotaaccentdieresis ΐ GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ + { 0x07b7, 0x03cc }, /* Greek_omicronaccent ό GREEK SMALL LETTER OMICRON WITH TONOS */ + { 0x07b8, 0x03cd }, /* Greek_upsilonaccent ύ GREEK SMALL LETTER UPSILON WITH TONOS */ + { 0x07b9, 0x03cb }, /* Greek_upsilondieresis ϋ GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ + { 0x07ba, 0x03b0 }, /* Greek_upsilonaccentdieresis ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ + { 0x07bb, 0x03ce }, /* Greek_omegaaccent ώ GREEK SMALL LETTER OMEGA WITH TONOS */ + { 0x07c1, 0x0391 }, /* Greek_ALPHA Α GREEK CAPITAL LETTER ALPHA */ + { 0x07c2, 0x0392 }, /* Greek_BETA Β GREEK CAPITAL LETTER BETA */ + { 0x07c3, 0x0393 }, /* Greek_GAMMA Γ GREEK CAPITAL LETTER GAMMA */ + { 0x07c4, 0x0394 }, /* Greek_DELTA Δ GREEK CAPITAL LETTER DELTA */ + { 0x07c5, 0x0395 }, /* Greek_EPSILON Ε GREEK CAPITAL LETTER EPSILON */ + { 0x07c6, 0x0396 }, /* Greek_ZETA Ζ GREEK CAPITAL LETTER ZETA */ + { 0x07c7, 0x0397 }, /* Greek_ETA Η GREEK CAPITAL LETTER ETA */ + { 0x07c8, 0x0398 }, /* Greek_THETA Θ GREEK CAPITAL LETTER THETA */ + { 0x07c9, 0x0399 }, /* Greek_IOTA Ι GREEK CAPITAL LETTER IOTA */ + { 0x07ca, 0x039a }, /* Greek_KAPPA Κ GREEK CAPITAL LETTER KAPPA */ + { 0x07cb, 0x039b }, /* Greek_LAMBDA Λ GREEK CAPITAL LETTER LAMDA */ + { 0x07cc, 0x039c }, /* Greek_MU Μ GREEK CAPITAL LETTER MU */ + { 0x07cd, 0x039d }, /* Greek_NU Ν GREEK CAPITAL LETTER NU */ + { 0x07ce, 0x039e }, /* Greek_XI Ξ GREEK CAPITAL LETTER XI */ + { 0x07cf, 0x039f }, /* Greek_OMICRON Ο GREEK CAPITAL LETTER OMICRON */ + { 0x07d0, 0x03a0 }, /* Greek_PI Π GREEK CAPITAL LETTER PI */ + { 0x07d1, 0x03a1 }, /* Greek_RHO Ρ GREEK CAPITAL LETTER RHO */ + { 0x07d2, 0x03a3 }, /* Greek_SIGMA Σ GREEK CAPITAL LETTER SIGMA */ + { 0x07d4, 0x03a4 }, /* Greek_TAU Τ GREEK CAPITAL LETTER TAU */ + { 0x07d5, 0x03a5 }, /* Greek_UPSILON Υ GREEK CAPITAL LETTER UPSILON */ + { 0x07d6, 0x03a6 }, /* Greek_PHI Φ GREEK CAPITAL LETTER PHI */ + { 0x07d7, 0x03a7 }, /* Greek_CHI Χ GREEK CAPITAL LETTER CHI */ + { 0x07d8, 0x03a8 }, /* Greek_PSI Ψ GREEK CAPITAL LETTER PSI */ + { 0x07d9, 0x03a9 }, /* Greek_OMEGA Ω GREEK CAPITAL LETTER OMEGA */ + { 0x07e1, 0x03b1 }, /* Greek_alpha α GREEK SMALL LETTER ALPHA */ + { 0x07e2, 0x03b2 }, /* Greek_beta β GREEK SMALL LETTER BETA */ + { 0x07e3, 0x03b3 }, /* Greek_gamma γ GREEK SMALL LETTER GAMMA */ + { 0x07e4, 0x03b4 }, /* Greek_delta δ GREEK SMALL LETTER DELTA */ + { 0x07e5, 0x03b5 }, /* Greek_epsilon ε GREEK SMALL LETTER EPSILON */ + { 0x07e6, 0x03b6 }, /* Greek_zeta ζ GREEK SMALL LETTER ZETA */ + { 0x07e7, 0x03b7 }, /* Greek_eta η GREEK SMALL LETTER ETA */ + { 0x07e8, 0x03b8 }, /* Greek_theta θ GREEK SMALL LETTER THETA */ + { 0x07e9, 0x03b9 }, /* Greek_iota ι GREEK SMALL LETTER IOTA */ + { 0x07ea, 0x03ba }, /* Greek_kappa κ GREEK SMALL LETTER KAPPA */ + { 0x07eb, 0x03bb }, /* Greek_lambda λ GREEK SMALL LETTER LAMDA */ + { 0x07ec, 0x03bc }, /* Greek_mu μ GREEK SMALL LETTER MU */ + { 0x07ed, 0x03bd }, /* Greek_nu ν GREEK SMALL LETTER NU */ + { 0x07ee, 0x03be }, /* Greek_xi ξ GREEK SMALL LETTER XI */ + { 0x07ef, 0x03bf }, /* Greek_omicron ο GREEK SMALL LETTER OMICRON */ + { 0x07f0, 0x03c0 }, /* Greek_pi π GREEK SMALL LETTER PI */ + { 0x07f1, 0x03c1 }, /* Greek_rho ρ GREEK SMALL LETTER RHO */ + { 0x07f2, 0x03c3 }, /* Greek_sigma σ GREEK SMALL LETTER SIGMA */ + { 0x07f3, 0x03c2 }, /* Greek_finalsmallsigma ς GREEK SMALL LETTER FINAL SIGMA */ + { 0x07f4, 0x03c4 }, /* Greek_tau τ GREEK SMALL LETTER TAU */ + { 0x07f5, 0x03c5 }, /* Greek_upsilon υ GREEK SMALL LETTER UPSILON */ + { 0x07f6, 0x03c6 }, /* Greek_phi φ GREEK SMALL LETTER PHI */ + { 0x07f7, 0x03c7 }, /* Greek_chi χ GREEK SMALL LETTER CHI */ + { 0x07f8, 0x03c8 }, /* Greek_psi ψ GREEK SMALL LETTER PSI */ + { 0x07f9, 0x03c9 }, /* Greek_omega ω GREEK SMALL LETTER OMEGA */ + { 0x08a1, 0x23b7 }, /* leftradical ⎷ ??? */ + { 0x08a2, 0x250c }, /* topleftradical ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */ + { 0x08a3, 0x2500 }, /* horizconnector ─ BOX DRAWINGS LIGHT HORIZONTAL */ + { 0x08a4, 0x2320 }, /* topintegral ⌠ TOP HALF INTEGRAL */ + { 0x08a5, 0x2321 }, /* botintegral ⌡ BOTTOM HALF INTEGRAL */ + { 0x08a6, 0x2502 }, /* vertconnector │ BOX DRAWINGS LIGHT VERTICAL */ + { 0x08a7, 0x23a1 }, /* topleftsqbracket ⎡ ??? */ + { 0x08a8, 0x23a3 }, /* botleftsqbracket ⎣ ??? */ + { 0x08a9, 0x23a4 }, /* toprightsqbracket ⎤ ??? */ + { 0x08aa, 0x23a6 }, /* botrightsqbracket ⎦ ??? */ + { 0x08ab, 0x239b }, /* topleftparens ⎛ ??? */ + { 0x08ac, 0x239d }, /* botleftparens ⎝ ??? */ + { 0x08ad, 0x239e }, /* toprightparens ⎞ ??? */ + { 0x08ae, 0x23a0 }, /* botrightparens ⎠ ??? */ + { 0x08af, 0x23a8 }, /* leftmiddlecurlybrace ⎨ ??? */ + { 0x08b0, 0x23ac }, /* rightmiddlecurlybrace ⎬ ??? */ + /* 0x08b1 topleftsummation ? ??? */ + /* 0x08b2 botleftsummation ? ??? */ + /* 0x08b3 topvertsummationconnector ? ??? */ + /* 0x08b4 botvertsummationconnector ? ??? */ + /* 0x08b5 toprightsummation ? ??? */ + /* 0x08b6 botrightsummation ? ??? */ + /* 0x08b7 rightmiddlesummation ? ??? */ + { 0x08bc, 0x2264 }, /* lessthanequal ≤ LESS-THAN OR EQUAL TO */ + { 0x08bd, 0x2260 }, /* notequal ≠ NOT EQUAL TO */ + { 0x08be, 0x2265 }, /* greaterthanequal ≥ GREATER-THAN OR EQUAL TO */ + { 0x08bf, 0x222b }, /* integral ∫ INTEGRAL */ + { 0x08c0, 0x2234 }, /* therefore ∴ THEREFORE */ + { 0x08c1, 0x221d }, /* variation ∝ PROPORTIONAL TO */ + { 0x08c2, 0x221e }, /* infinity ∞ INFINITY */ + { 0x08c5, 0x2207 }, /* nabla ∇ NABLA */ + { 0x08c8, 0x223c }, /* approximate ∼ TILDE OPERATOR */ + { 0x08c9, 0x2243 }, /* similarequal ≃ ASYMPTOTICALLY EQUAL TO */ + { 0x08cd, 0x21d4 }, /* ifonlyif ⇔ LEFT RIGHT DOUBLE ARROW */ + { 0x08ce, 0x21d2 }, /* implies ⇒ RIGHTWARDS DOUBLE ARROW */ + { 0x08cf, 0x2261 }, /* identical ≡ IDENTICAL TO */ + { 0x08d6, 0x221a }, /* radical √ SQUARE ROOT */ + { 0x08da, 0x2282 }, /* includedin ⊂ SUBSET OF */ + { 0x08db, 0x2283 }, /* includes ⊃ SUPERSET OF */ + { 0x08dc, 0x2229 }, /* intersection ∩ INTERSECTION */ + { 0x08dd, 0x222a }, /* union ∪ UNION */ + { 0x08de, 0x2227 }, /* logicaland ∧ LOGICAL AND */ + { 0x08df, 0x2228 }, /* logicalor ∨ LOGICAL OR */ + { 0x08ef, 0x2202 }, /* partialderivative ∂ PARTIAL DIFFERENTIAL */ + { 0x08f6, 0x0192 }, /* function ƒ LATIN SMALL LETTER F WITH HOOK */ + { 0x08fb, 0x2190 }, /* leftarrow ← LEFTWARDS ARROW */ + { 0x08fc, 0x2191 }, /* uparrow ↑ UPWARDS ARROW */ + { 0x08fd, 0x2192 }, /* rightarrow → RIGHTWARDS ARROW */ + { 0x08fe, 0x2193 }, /* downarrow ↓ DOWNWARDS ARROW */ + /* 0x09df blank ? ??? */ + { 0x09e0, 0x25c6 }, /* soliddiamond ◆ BLACK DIAMOND */ + { 0x09e1, 0x2592 }, /* checkerboard ▒ MEDIUM SHADE */ + { 0x09e2, 0x2409 }, /* ht ␉ SYMBOL FOR HORIZONTAL TABULATION */ + { 0x09e3, 0x240c }, /* ff ␌ SYMBOL FOR FORM FEED */ + { 0x09e4, 0x240d }, /* cr ␍ SYMBOL FOR CARRIAGE RETURN */ + { 0x09e5, 0x240a }, /* lf ␊ SYMBOL FOR LINE FEED */ + { 0x09e8, 0x2424 }, /* nl ␤ SYMBOL FOR NEWLINE */ + { 0x09e9, 0x240b }, /* vt ␋ SYMBOL FOR VERTICAL TABULATION */ + { 0x09ea, 0x2518 }, /* lowrightcorner ┘ BOX DRAWINGS LIGHT UP AND LEFT */ + { 0x09eb, 0x2510 }, /* uprightcorner ┐ BOX DRAWINGS LIGHT DOWN AND LEFT */ + { 0x09ec, 0x250c }, /* upleftcorner ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */ + { 0x09ed, 0x2514 }, /* lowleftcorner └ BOX DRAWINGS LIGHT UP AND RIGHT */ + { 0x09ee, 0x253c }, /* crossinglines ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ + { 0x09ef, 0x23ba }, /* horizlinescan1 ⎺ HORIZONTAL SCAN LINE-1 (Unicode 3.2 draft) */ + { 0x09f0, 0x23bb }, /* horizlinescan3 ⎻ HORIZONTAL SCAN LINE-3 (Unicode 3.2 draft) */ + { 0x09f1, 0x2500 }, /* horizlinescan5 ─ BOX DRAWINGS LIGHT HORIZONTAL */ + { 0x09f2, 0x23bc }, /* horizlinescan7 ⎼ HORIZONTAL SCAN LINE-7 (Unicode 3.2 draft) */ + { 0x09f3, 0x23bd }, /* horizlinescan9 ⎽ HORIZONTAL SCAN LINE-9 (Unicode 3.2 draft) */ + { 0x09f4, 0x251c }, /* leftt ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ + { 0x09f5, 0x2524 }, /* rightt ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT */ + { 0x09f6, 0x2534 }, /* bott ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL */ + { 0x09f7, 0x252c }, /* topt ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ + { 0x09f8, 0x2502 }, /* vertbar │ BOX DRAWINGS LIGHT VERTICAL */ + { 0x0aa1, 0x2003 }, /* emspace   EM SPACE */ + { 0x0aa2, 0x2002 }, /* enspace   EN SPACE */ + { 0x0aa3, 0x2004 }, /* em3space   THREE-PER-EM SPACE */ + { 0x0aa4, 0x2005 }, /* em4space   FOUR-PER-EM SPACE */ + { 0x0aa5, 0x2007 }, /* digitspace   FIGURE SPACE */ + { 0x0aa6, 0x2008 }, /* punctspace   PUNCTUATION SPACE */ + { 0x0aa7, 0x2009 }, /* thinspace   THIN SPACE */ + { 0x0aa8, 0x200a }, /* hairspace   HAIR SPACE */ + { 0x0aa9, 0x2014 }, /* emdash — EM DASH */ + { 0x0aaa, 0x2013 }, /* endash – EN DASH */ + /* 0x0aac signifblank ? ??? */ + { 0x0aae, 0x2026 }, /* ellipsis … HORIZONTAL ELLIPSIS */ + { 0x0aaf, 0x2025 }, /* doubbaselinedot ‥ TWO DOT LEADER */ + { 0x0ab0, 0x2153 }, /* onethird ⅓ VULGAR FRACTION ONE THIRD */ + { 0x0ab1, 0x2154 }, /* twothirds ⅔ VULGAR FRACTION TWO THIRDS */ + { 0x0ab2, 0x2155 }, /* onefifth ⅕ VULGAR FRACTION ONE FIFTH */ + { 0x0ab3, 0x2156 }, /* twofifths ⅖ VULGAR FRACTION TWO FIFTHS */ + { 0x0ab4, 0x2157 }, /* threefifths ⅗ VULGAR FRACTION THREE FIFTHS */ + { 0x0ab5, 0x2158 }, /* fourfifths ⅘ VULGAR FRACTION FOUR FIFTHS */ + { 0x0ab6, 0x2159 }, /* onesixth ⅙ VULGAR FRACTION ONE SIXTH */ + { 0x0ab7, 0x215a }, /* fivesixths ⅚ VULGAR FRACTION FIVE SIXTHS */ + { 0x0ab8, 0x2105 }, /* careof ℅ CARE OF */ + { 0x0abb, 0x2012 }, /* figdash ‒ FIGURE DASH */ + { 0x0abc, 0x2329 }, /* leftanglebracket 〈 LEFT-POINTING ANGLE BRACKET */ + /* 0x0abd decimalpoint ? ??? */ + { 0x0abe, 0x232a }, /* rightanglebracket 〉 RIGHT-POINTING ANGLE BRACKET */ + /* 0x0abf marker ? ??? */ + { 0x0ac3, 0x215b }, /* oneeighth ⅛ VULGAR FRACTION ONE EIGHTH */ + { 0x0ac4, 0x215c }, /* threeeighths ⅜ VULGAR FRACTION THREE EIGHTHS */ + { 0x0ac5, 0x215d }, /* fiveeighths ⅝ VULGAR FRACTION FIVE EIGHTHS */ + { 0x0ac6, 0x215e }, /* seveneighths ⅞ VULGAR FRACTION SEVEN EIGHTHS */ + { 0x0ac9, 0x2122 }, /* trademark ™ TRADE MARK SIGN */ + { 0x0aca, 0x2613 }, /* signaturemark ☓ SALTIRE */ + /* 0x0acb trademarkincircle ? ??? */ + { 0x0acc, 0x25c1 }, /* leftopentriangle ◁ WHITE LEFT-POINTING TRIANGLE */ + { 0x0acd, 0x25b7 }, /* rightopentriangle ▷ WHITE RIGHT-POINTING TRIANGLE */ + { 0x0ace, 0x25cb }, /* emopencircle ○ WHITE CIRCLE */ + { 0x0acf, 0x25af }, /* emopenrectangle ▯ WHITE VERTICAL RECTANGLE */ + { 0x0ad0, 0x2018 }, /* leftsinglequotemark ‘ LEFT SINGLE QUOTATION MARK */ + { 0x0ad1, 0x2019 }, /* rightsinglequotemark ’ RIGHT SINGLE QUOTATION MARK */ + { 0x0ad2, 0x201c }, /* leftdoublequotemark “ LEFT DOUBLE QUOTATION MARK */ + { 0x0ad3, 0x201d }, /* rightdoublequotemark ” RIGHT DOUBLE QUOTATION MARK */ + { 0x0ad4, 0x211e }, /* prescription ℞ PRESCRIPTION TAKE */ + { 0x0ad6, 0x2032 }, /* minutes ′ PRIME */ + { 0x0ad7, 0x2033 }, /* seconds ″ DOUBLE PRIME */ + { 0x0ad9, 0x271d }, /* latincross ✝ LATIN CROSS */ + /* 0x0ada hexagram ? ??? */ + { 0x0adb, 0x25ac }, /* filledrectbullet ▬ BLACK RECTANGLE */ + { 0x0adc, 0x25c0 }, /* filledlefttribullet ◀ BLACK LEFT-POINTING TRIANGLE */ + { 0x0add, 0x25b6 }, /* filledrighttribullet ▶ BLACK RIGHT-POINTING TRIANGLE */ + { 0x0ade, 0x25cf }, /* emfilledcircle ● BLACK CIRCLE */ + { 0x0adf, 0x25ae }, /* emfilledrect ▮ BLACK VERTICAL RECTANGLE */ + { 0x0ae0, 0x25e6 }, /* enopencircbullet ◦ WHITE BULLET */ + { 0x0ae1, 0x25ab }, /* enopensquarebullet ▫ WHITE SMALL SQUARE */ + { 0x0ae2, 0x25ad }, /* openrectbullet ▭ WHITE RECTANGLE */ + { 0x0ae3, 0x25b3 }, /* opentribulletup △ WHITE UP-POINTING TRIANGLE */ + { 0x0ae4, 0x25bd }, /* opentribulletdown ▽ WHITE DOWN-POINTING TRIANGLE */ + { 0x0ae5, 0x2606 }, /* openstar ☆ WHITE STAR */ + { 0x0ae6, 0x2022 }, /* enfilledcircbullet • BULLET */ + { 0x0ae7, 0x25aa }, /* enfilledsqbullet ▪ BLACK SMALL SQUARE */ + { 0x0ae8, 0x25b2 }, /* filledtribulletup ▲ BLACK UP-POINTING TRIANGLE */ + { 0x0ae9, 0x25bc }, /* filledtribulletdown ▼ BLACK DOWN-POINTING TRIANGLE */ + { 0x0aea, 0x261c }, /* leftpointer ☜ WHITE LEFT POINTING INDEX */ + { 0x0aeb, 0x261e }, /* rightpointer ☞ WHITE RIGHT POINTING INDEX */ + { 0x0aec, 0x2663 }, /* club ♣ BLACK CLUB SUIT */ + { 0x0aed, 0x2666 }, /* diamond ♦ BLACK DIAMOND SUIT */ + { 0x0aee, 0x2665 }, /* heart ♥ BLACK HEART SUIT */ + { 0x0af0, 0x2720 }, /* maltesecross ✠ MALTESE CROSS */ + { 0x0af1, 0x2020 }, /* dagger † DAGGER */ + { 0x0af2, 0x2021 }, /* doubledagger ‡ DOUBLE DAGGER */ + { 0x0af3, 0x2713 }, /* checkmark ✓ CHECK MARK */ + { 0x0af4, 0x2717 }, /* ballotcross ✗ BALLOT X */ + { 0x0af5, 0x266f }, /* musicalsharp ♯ MUSIC SHARP SIGN */ + { 0x0af6, 0x266d }, /* musicalflat ♭ MUSIC FLAT SIGN */ + { 0x0af7, 0x2642 }, /* malesymbol ♂ MALE SIGN */ + { 0x0af8, 0x2640 }, /* femalesymbol ♀ FEMALE SIGN */ + { 0x0af9, 0x260e }, /* telephone ☎ BLACK TELEPHONE */ + { 0x0afa, 0x2315 }, /* telephonerecorder ⌕ TELEPHONE RECORDER */ + { 0x0afb, 0x2117 }, /* phonographcopyright ℗ SOUND RECORDING COPYRIGHT */ + { 0x0afc, 0x2038 }, /* caret ‸ CARET */ + { 0x0afd, 0x201a }, /* singlelowquotemark ‚ SINGLE LOW-9 QUOTATION MARK */ + { 0x0afe, 0x201e }, /* doublelowquotemark „ DOUBLE LOW-9 QUOTATION MARK */ + /* 0x0aff cursor ? ??? */ + { 0x0ba3, 0x003c }, /* leftcaret < LESS-THAN SIGN */ + { 0x0ba6, 0x003e }, /* rightcaret > GREATER-THAN SIGN */ + { 0x0ba8, 0x2228 }, /* downcaret ∨ LOGICAL OR */ + { 0x0ba9, 0x2227 }, /* upcaret ∧ LOGICAL AND */ + { 0x0bc0, 0x00af }, /* overbar ¯ MACRON */ + { 0x0bc2, 0x22a5 }, /* downtack ⊥ UP TACK */ + { 0x0bc3, 0x2229 }, /* upshoe ∩ INTERSECTION */ + { 0x0bc4, 0x230a }, /* downstile ⌊ LEFT FLOOR */ + { 0x0bc6, 0x005f }, /* underbar _ LOW LINE */ + { 0x0bca, 0x2218 }, /* jot ∘ RING OPERATOR */ + { 0x0bcc, 0x2395 }, /* quad ⎕ APL FUNCTIONAL SYMBOL QUAD */ + { 0x0bce, 0x22a4 }, /* uptack ⊤ DOWN TACK */ + { 0x0bcf, 0x25cb }, /* circle ○ WHITE CIRCLE */ + { 0x0bd3, 0x2308 }, /* upstile ⌈ LEFT CEILING */ + { 0x0bd6, 0x222a }, /* downshoe ∪ UNION */ + { 0x0bd8, 0x2283 }, /* rightshoe ⊃ SUPERSET OF */ + { 0x0bda, 0x2282 }, /* leftshoe ⊂ SUBSET OF */ + { 0x0bdc, 0x22a2 }, /* lefttack ⊢ RIGHT TACK */ + { 0x0bfc, 0x22a3 }, /* righttack ⊣ LEFT TACK */ + { 0x0cdf, 0x2017 }, /* hebrew_doublelowline ‗ DOUBLE LOW LINE */ + { 0x0ce0, 0x05d0 }, /* hebrew_aleph א HEBREW LETTER ALEF */ + { 0x0ce1, 0x05d1 }, /* hebrew_bet ב HEBREW LETTER BET */ + { 0x0ce2, 0x05d2 }, /* hebrew_gimel ג HEBREW LETTER GIMEL */ + { 0x0ce3, 0x05d3 }, /* hebrew_dalet ד HEBREW LETTER DALET */ + { 0x0ce4, 0x05d4 }, /* hebrew_he ה HEBREW LETTER HE */ + { 0x0ce5, 0x05d5 }, /* hebrew_waw ו HEBREW LETTER VAV */ + { 0x0ce6, 0x05d6 }, /* hebrew_zain ז HEBREW LETTER ZAYIN */ + { 0x0ce7, 0x05d7 }, /* hebrew_chet ח HEBREW LETTER HET */ + { 0x0ce8, 0x05d8 }, /* hebrew_tet ט HEBREW LETTER TET */ + { 0x0ce9, 0x05d9 }, /* hebrew_yod י HEBREW LETTER YOD */ + { 0x0cea, 0x05da }, /* hebrew_finalkaph ך HEBREW LETTER FINAL KAF */ + { 0x0ceb, 0x05db }, /* hebrew_kaph כ HEBREW LETTER KAF */ + { 0x0cec, 0x05dc }, /* hebrew_lamed ל HEBREW LETTER LAMED */ + { 0x0ced, 0x05dd }, /* hebrew_finalmem ם HEBREW LETTER FINAL MEM */ + { 0x0cee, 0x05de }, /* hebrew_mem מ HEBREW LETTER MEM */ + { 0x0cef, 0x05df }, /* hebrew_finalnun ן HEBREW LETTER FINAL NUN */ + { 0x0cf0, 0x05e0 }, /* hebrew_nun נ HEBREW LETTER NUN */ + { 0x0cf1, 0x05e1 }, /* hebrew_samech ס HEBREW LETTER SAMEKH */ + { 0x0cf2, 0x05e2 }, /* hebrew_ayin ע HEBREW LETTER AYIN */ + { 0x0cf3, 0x05e3 }, /* hebrew_finalpe ף HEBREW LETTER FINAL PE */ + { 0x0cf4, 0x05e4 }, /* hebrew_pe פ HEBREW LETTER PE */ + { 0x0cf5, 0x05e5 }, /* hebrew_finalzade ץ HEBREW LETTER FINAL TSADI */ + { 0x0cf6, 0x05e6 }, /* hebrew_zade צ HEBREW LETTER TSADI */ + { 0x0cf7, 0x05e7 }, /* hebrew_qoph ק HEBREW LETTER QOF */ + { 0x0cf8, 0x05e8 }, /* hebrew_resh ר HEBREW LETTER RESH */ + { 0x0cf9, 0x05e9 }, /* hebrew_shin ש HEBREW LETTER SHIN */ + { 0x0cfa, 0x05ea }, /* hebrew_taw ת HEBREW LETTER TAV */ + { 0x0da1, 0x0e01 }, /* Thai_kokai ก THAI CHARACTER KO KAI */ + { 0x0da2, 0x0e02 }, /* Thai_khokhai ข THAI CHARACTER KHO KHAI */ + { 0x0da3, 0x0e03 }, /* Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT */ + { 0x0da4, 0x0e04 }, /* Thai_khokhwai ค THAI CHARACTER KHO KHWAI */ + { 0x0da5, 0x0e05 }, /* Thai_khokhon ฅ THAI CHARACTER KHO KHON */ + { 0x0da6, 0x0e06 }, /* Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG */ + { 0x0da7, 0x0e07 }, /* Thai_ngongu ง THAI CHARACTER NGO NGU */ + { 0x0da8, 0x0e08 }, /* Thai_chochan จ THAI CHARACTER CHO CHAN */ + { 0x0da9, 0x0e09 }, /* Thai_choching ฉ THAI CHARACTER CHO CHING */ + { 0x0daa, 0x0e0a }, /* Thai_chochang ช THAI CHARACTER CHO CHANG */ + { 0x0dab, 0x0e0b }, /* Thai_soso ซ THAI CHARACTER SO SO */ + { 0x0dac, 0x0e0c }, /* Thai_chochoe ฌ THAI CHARACTER CHO CHOE */ + { 0x0dad, 0x0e0d }, /* Thai_yoying ญ THAI CHARACTER YO YING */ + { 0x0dae, 0x0e0e }, /* Thai_dochada ฎ THAI CHARACTER DO CHADA */ + { 0x0daf, 0x0e0f }, /* Thai_topatak ฏ THAI CHARACTER TO PATAK */ + { 0x0db0, 0x0e10 }, /* Thai_thothan ฐ THAI CHARACTER THO THAN */ + { 0x0db1, 0x0e11 }, /* Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO */ + { 0x0db2, 0x0e12 }, /* Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO */ + { 0x0db3, 0x0e13 }, /* Thai_nonen ณ THAI CHARACTER NO NEN */ + { 0x0db4, 0x0e14 }, /* Thai_dodek ด THAI CHARACTER DO DEK */ + { 0x0db5, 0x0e15 }, /* Thai_totao ต THAI CHARACTER TO TAO */ + { 0x0db6, 0x0e16 }, /* Thai_thothung ถ THAI CHARACTER THO THUNG */ + { 0x0db7, 0x0e17 }, /* Thai_thothahan ท THAI CHARACTER THO THAHAN */ + { 0x0db8, 0x0e18 }, /* Thai_thothong ธ THAI CHARACTER THO THONG */ + { 0x0db9, 0x0e19 }, /* Thai_nonu น THAI CHARACTER NO NU */ + { 0x0dba, 0x0e1a }, /* Thai_bobaimai บ THAI CHARACTER BO BAIMAI */ + { 0x0dbb, 0x0e1b }, /* Thai_popla ป THAI CHARACTER PO PLA */ + { 0x0dbc, 0x0e1c }, /* Thai_phophung ผ THAI CHARACTER PHO PHUNG */ + { 0x0dbd, 0x0e1d }, /* Thai_fofa ฝ THAI CHARACTER FO FA */ + { 0x0dbe, 0x0e1e }, /* Thai_phophan พ THAI CHARACTER PHO PHAN */ + { 0x0dbf, 0x0e1f }, /* Thai_fofan ฟ THAI CHARACTER FO FAN */ + { 0x0dc0, 0x0e20 }, /* Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO */ + { 0x0dc1, 0x0e21 }, /* Thai_moma ม THAI CHARACTER MO MA */ + { 0x0dc2, 0x0e22 }, /* Thai_yoyak ย THAI CHARACTER YO YAK */ + { 0x0dc3, 0x0e23 }, /* Thai_rorua ร THAI CHARACTER RO RUA */ + { 0x0dc4, 0x0e24 }, /* Thai_ru ฤ THAI CHARACTER RU */ + { 0x0dc5, 0x0e25 }, /* Thai_loling ล THAI CHARACTER LO LING */ + { 0x0dc6, 0x0e26 }, /* Thai_lu ฦ THAI CHARACTER LU */ + { 0x0dc7, 0x0e27 }, /* Thai_wowaen ว THAI CHARACTER WO WAEN */ + { 0x0dc8, 0x0e28 }, /* Thai_sosala ศ THAI CHARACTER SO SALA */ + { 0x0dc9, 0x0e29 }, /* Thai_sorusi ษ THAI CHARACTER SO RUSI */ + { 0x0dca, 0x0e2a }, /* Thai_sosua ส THAI CHARACTER SO SUA */ + { 0x0dcb, 0x0e2b }, /* Thai_hohip ห THAI CHARACTER HO HIP */ + { 0x0dcc, 0x0e2c }, /* Thai_lochula ฬ THAI CHARACTER LO CHULA */ + { 0x0dcd, 0x0e2d }, /* Thai_oang อ THAI CHARACTER O ANG */ + { 0x0dce, 0x0e2e }, /* Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK */ + { 0x0dcf, 0x0e2f }, /* Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI */ + { 0x0dd0, 0x0e30 }, /* Thai_saraa ะ THAI CHARACTER SARA A */ + { 0x0dd1, 0x0e31 }, /* Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT */ + { 0x0dd2, 0x0e32 }, /* Thai_saraaa า THAI CHARACTER SARA AA */ + { 0x0dd3, 0x0e33 }, /* Thai_saraam ำ THAI CHARACTER SARA AM */ + { 0x0dd4, 0x0e34 }, /* Thai_sarai ิ THAI CHARACTER SARA I */ + { 0x0dd5, 0x0e35 }, /* Thai_saraii ี THAI CHARACTER SARA II */ + { 0x0dd6, 0x0e36 }, /* Thai_saraue ึ THAI CHARACTER SARA UE */ + { 0x0dd7, 0x0e37 }, /* Thai_sarauee ื THAI CHARACTER SARA UEE */ + { 0x0dd8, 0x0e38 }, /* Thai_sarau ุ THAI CHARACTER SARA U */ + { 0x0dd9, 0x0e39 }, /* Thai_sarauu ู THAI CHARACTER SARA UU */ + { 0x0dda, 0x0e3a }, /* Thai_phinthu ฺ THAI CHARACTER PHINTHU */ + /* 0x0dde Thai_maihanakat_maitho ? ??? */ + { 0x0ddf, 0x0e3f }, /* Thai_baht ฿ THAI CURRENCY SYMBOL BAHT */ + { 0x0de0, 0x0e40 }, /* Thai_sarae เ THAI CHARACTER SARA E */ + { 0x0de1, 0x0e41 }, /* Thai_saraae แ THAI CHARACTER SARA AE */ + { 0x0de2, 0x0e42 }, /* Thai_sarao โ THAI CHARACTER SARA O */ + { 0x0de3, 0x0e43 }, /* Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN */ + { 0x0de4, 0x0e44 }, /* Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI */ + { 0x0de5, 0x0e45 }, /* Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO */ + { 0x0de6, 0x0e46 }, /* Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK */ + { 0x0de7, 0x0e47 }, /* Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU */ + { 0x0de8, 0x0e48 }, /* Thai_maiek ่ THAI CHARACTER MAI EK */ + { 0x0de9, 0x0e49 }, /* Thai_maitho ้ THAI CHARACTER MAI THO */ + { 0x0dea, 0x0e4a }, /* Thai_maitri ๊ THAI CHARACTER MAI TRI */ + { 0x0deb, 0x0e4b }, /* Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA */ + { 0x0dec, 0x0e4c }, /* Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT */ + { 0x0ded, 0x0e4d }, /* Thai_nikhahit ํ THAI CHARACTER NIKHAHIT */ + { 0x0df0, 0x0e50 }, /* Thai_leksun ๐ THAI DIGIT ZERO */ + { 0x0df1, 0x0e51 }, /* Thai_leknung ๑ THAI DIGIT ONE */ + { 0x0df2, 0x0e52 }, /* Thai_leksong ๒ THAI DIGIT TWO */ + { 0x0df3, 0x0e53 }, /* Thai_leksam ๓ THAI DIGIT THREE */ + { 0x0df4, 0x0e54 }, /* Thai_leksi ๔ THAI DIGIT FOUR */ + { 0x0df5, 0x0e55 }, /* Thai_lekha ๕ THAI DIGIT FIVE */ + { 0x0df6, 0x0e56 }, /* Thai_lekhok ๖ THAI DIGIT SIX */ + { 0x0df7, 0x0e57 }, /* Thai_lekchet ๗ THAI DIGIT SEVEN */ + { 0x0df8, 0x0e58 }, /* Thai_lekpaet ๘ THAI DIGIT EIGHT */ + { 0x0df9, 0x0e59 }, /* Thai_lekkao ๙ THAI DIGIT NINE */ + { 0x0ea1, 0x3131 }, /* Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK */ + { 0x0ea2, 0x3132 }, /* Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK */ + { 0x0ea3, 0x3133 }, /* Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS */ + { 0x0ea4, 0x3134 }, /* Hangul_Nieun ㄴ HANGUL LETTER NIEUN */ + { 0x0ea5, 0x3135 }, /* Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC */ + { 0x0ea6, 0x3136 }, /* Hangul_NieunHieuh ㄶ HANGUL LETTER NIEUN-HIEUH */ + { 0x0ea7, 0x3137 }, /* Hangul_Dikeud ㄷ HANGUL LETTER TIKEUT */ + { 0x0ea8, 0x3138 }, /* Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT */ + { 0x0ea9, 0x3139 }, /* Hangul_Rieul ㄹ HANGUL LETTER RIEUL */ + { 0x0eaa, 0x313a }, /* Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK */ + { 0x0eab, 0x313b }, /* Hangul_RieulMieum ㄻ HANGUL LETTER RIEUL-MIEUM */ + { 0x0eac, 0x313c }, /* Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP */ + { 0x0ead, 0x313d }, /* Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS */ + { 0x0eae, 0x313e }, /* Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH */ + { 0x0eaf, 0x313f }, /* Hangul_RieulPhieuf ㄿ HANGUL LETTER RIEUL-PHIEUPH */ + { 0x0eb0, 0x3140 }, /* Hangul_RieulHieuh ㅀ HANGUL LETTER RIEUL-HIEUH */ + { 0x0eb1, 0x3141 }, /* Hangul_Mieum ㅁ HANGUL LETTER MIEUM */ + { 0x0eb2, 0x3142 }, /* Hangul_Pieub ㅂ HANGUL LETTER PIEUP */ + { 0x0eb3, 0x3143 }, /* Hangul_SsangPieub ㅃ HANGUL LETTER SSANGPIEUP */ + { 0x0eb4, 0x3144 }, /* Hangul_PieubSios ㅄ HANGUL LETTER PIEUP-SIOS */ + { 0x0eb5, 0x3145 }, /* Hangul_Sios ㅅ HANGUL LETTER SIOS */ + { 0x0eb6, 0x3146 }, /* Hangul_SsangSios ㅆ HANGUL LETTER SSANGSIOS */ + { 0x0eb7, 0x3147 }, /* Hangul_Ieung ㅇ HANGUL LETTER IEUNG */ + { 0x0eb8, 0x3148 }, /* Hangul_Jieuj ㅈ HANGUL LETTER CIEUC */ + { 0x0eb9, 0x3149 }, /* Hangul_SsangJieuj ㅉ HANGUL LETTER SSANGCIEUC */ + { 0x0eba, 0x314a }, /* Hangul_Cieuc ㅊ HANGUL LETTER CHIEUCH */ + { 0x0ebb, 0x314b }, /* Hangul_Khieuq ㅋ HANGUL LETTER KHIEUKH */ + { 0x0ebc, 0x314c }, /* Hangul_Tieut ㅌ HANGUL LETTER THIEUTH */ + { 0x0ebd, 0x314d }, /* Hangul_Phieuf ㅍ HANGUL LETTER PHIEUPH */ + { 0x0ebe, 0x314e }, /* Hangul_Hieuh ㅎ HANGUL LETTER HIEUH */ + { 0x0ebf, 0x314f }, /* Hangul_A ㅏ HANGUL LETTER A */ + { 0x0ec0, 0x3150 }, /* Hangul_AE ㅐ HANGUL LETTER AE */ + { 0x0ec1, 0x3151 }, /* Hangul_YA ㅑ HANGUL LETTER YA */ + { 0x0ec2, 0x3152 }, /* Hangul_YAE ㅒ HANGUL LETTER YAE */ + { 0x0ec3, 0x3153 }, /* Hangul_EO ㅓ HANGUL LETTER EO */ + { 0x0ec4, 0x3154 }, /* Hangul_E ㅔ HANGUL LETTER E */ + { 0x0ec5, 0x3155 }, /* Hangul_YEO ㅕ HANGUL LETTER YEO */ + { 0x0ec6, 0x3156 }, /* Hangul_YE ㅖ HANGUL LETTER YE */ + { 0x0ec7, 0x3157 }, /* Hangul_O ㅗ HANGUL LETTER O */ + { 0x0ec8, 0x3158 }, /* Hangul_WA ㅘ HANGUL LETTER WA */ + { 0x0ec9, 0x3159 }, /* Hangul_WAE ㅙ HANGUL LETTER WAE */ + { 0x0eca, 0x315a }, /* Hangul_OE ㅚ HANGUL LETTER OE */ + { 0x0ecb, 0x315b }, /* Hangul_YO ㅛ HANGUL LETTER YO */ + { 0x0ecc, 0x315c }, /* Hangul_U ㅜ HANGUL LETTER U */ + { 0x0ecd, 0x315d }, /* Hangul_WEO ㅝ HANGUL LETTER WEO */ + { 0x0ece, 0x315e }, /* Hangul_WE ㅞ HANGUL LETTER WE */ + { 0x0ecf, 0x315f }, /* Hangul_WI ㅟ HANGUL LETTER WI */ + { 0x0ed0, 0x3160 }, /* Hangul_YU ㅠ HANGUL LETTER YU */ + { 0x0ed1, 0x3161 }, /* Hangul_EU ㅡ HANGUL LETTER EU */ + { 0x0ed2, 0x3162 }, /* Hangul_YI ㅢ HANGUL LETTER YI */ + { 0x0ed3, 0x3163 }, /* Hangul_I ㅣ HANGUL LETTER I */ + { 0x0ed4, 0x11a8 }, /* Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK */ + { 0x0ed5, 0x11a9 }, /* Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK */ + { 0x0ed6, 0x11aa }, /* Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS */ + { 0x0ed7, 0x11ab }, /* Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN */ + { 0x0ed8, 0x11ac }, /* Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC */ + { 0x0ed9, 0x11ad }, /* Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH */ + { 0x0eda, 0x11ae }, /* Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT */ + { 0x0edb, 0x11af }, /* Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL */ + { 0x0edc, 0x11b0 }, /* Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK */ + { 0x0edd, 0x11b1 }, /* Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM */ + { 0x0ede, 0x11b2 }, /* Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP */ + { 0x0edf, 0x11b3 }, /* Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS */ + { 0x0ee0, 0x11b4 }, /* Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH */ + { 0x0ee1, 0x11b5 }, /* Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH */ + { 0x0ee2, 0x11b6 }, /* Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH */ + { 0x0ee3, 0x11b7 }, /* Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM */ + { 0x0ee4, 0x11b8 }, /* Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP */ + { 0x0ee5, 0x11b9 }, /* Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS */ + { 0x0ee6, 0x11ba }, /* Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS */ + { 0x0ee7, 0x11bb }, /* Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS */ + { 0x0ee8, 0x11bc }, /* Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG */ + { 0x0ee9, 0x11bd }, /* Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC */ + { 0x0eea, 0x11be }, /* Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH */ + { 0x0eeb, 0x11bf }, /* Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH */ + { 0x0eec, 0x11c0 }, /* Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH */ + { 0x0eed, 0x11c1 }, /* Hangul_J_Phieuf ᇁ HANGUL JONGSEONG PHIEUPH */ + { 0x0eee, 0x11c2 }, /* Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH */ + { 0x0eef, 0x316d }, /* Hangul_RieulYeorinHieuh ㅭ HANGUL LETTER RIEUL-YEORINHIEUH */ + { 0x0ef0, 0x3171 }, /* Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM */ + { 0x0ef1, 0x3178 }, /* Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP */ + { 0x0ef2, 0x317f }, /* Hangul_PanSios ㅿ HANGUL LETTER PANSIOS */ + { 0x0ef3, 0x3181 }, /* Hangul_KkogjiDalrinIeung ㆁ HANGUL LETTER YESIEUNG */ + { 0x0ef4, 0x3184 }, /* Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */ + { 0x0ef5, 0x3186 }, /* Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */ + { 0x0ef6, 0x318d }, /* Hangul_AraeA ㆍ HANGUL LETTER ARAEA */ + { 0x0ef7, 0x318e }, /* Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */ + { 0x0ef8, 0x11eb }, /* Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS */ + { 0x0ef9, 0x11f0 }, /* Hangul_J_KkogjiDalrinIeung ᇰ HANGUL JONGSEONG YESIEUNG */ + { 0x0efa, 0x11f9 }, /* Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */ + { 0x0eff, 0x20a9 }, /* Korean_Won ₩ WON SIGN */ + { 0x13a4, 0x20ac }, /* Euro € EURO SIGN */ + { 0x13bc, 0x0152 }, /* OE Œ LATIN CAPITAL LIGATURE OE */ + { 0x13bd, 0x0153 }, /* oe œ LATIN SMALL LIGATURE OE */ + { 0x13be, 0x0178 }, /* Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */ + { 0x20ac, 0x20ac }, /* EuroSign € EURO SIGN */ +}; + +quint16 HelperX11::getKeysym(const QChar& c){ + quint16 unicode=c.unicode(); + /* first check for Latin-1 characters (1:1 mapping) */ + if ((unicode >= 0x0020 && unicode <= 0x007e) || + (unicode >= 0x00a0 && unicode <= 0x00ff)) + return unicode; + + /*if((unicode & 0xFF000000)==0x00) + return (unicode & 0x00FFFFFF)|0x01FFFFFF;*/ + + int MapSize=sizeof(KeysymMap); + + for(int i=0; i + +#define XK_MISCELLANY +#define XK_XKB_KEYS +#define XK_3270 +#define XK_CURRENCY +#include +#include +#include + +class HelperX11{ + public: + static int getModifiers(Display *d,KeySym keysym, int keycode); + static void pressModifiers(Display*,int mods,bool Press=true); + static void releaseModifiers(Display*,int mods); + static quint16 getKeysym(const QChar& c); +#ifdef GLOBAL_AUTOTYPE + static int getShortcutModifierMask(const Shortcut& s); +#endif + static unsigned int keyboardModifiers(Display* d); + + static void startCatchErrors(); + static void stopCatchErrors(); + inline static bool errorOccurred() { return pErrorOccurred; }; + + private: + static int x11ErrorHandler(Display* display, XErrorEvent* error); + static int (*oldHandler) (Display*, XErrorEvent*); + static bool catchErrors; + static bool pErrorOccurred; + static const quint16 KeysymMap[][2]; +}; + +#endif // HELPERX11_H diff --git a/src/lib/SecString.h b/src/lib/SecString.h index dd49baa..e73ee64 100755 --- a/src/lib/SecString.h +++ b/src/lib/SecString.h @@ -21,8 +21,8 @@ #define _SECSTRING_H_ #include -#include -#include +#include +#include #include "crypto/arcfour.h" //! QString based class with in-memory encryption of its content. diff --git a/src/lib/ShortcutWidget.cpp b/src/lib/ShortcutWidget.cpp new file mode 100644 index 0000000..a6c4d8e --- /dev/null +++ b/src/lib/ShortcutWidget.cpp @@ -0,0 +1,118 @@ +/*************************************************************************** + * Copyright (C) 2005-2008 by Felix Geyer * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; version 2 of the License. * + + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "ShortcutWidget.h" +#include +#include +#include +#include "HelperX11.h" + +#if defined(GLOBAL_AUTOTYPE) && defined(Q_WS_X11) +ShortcutWidget::ShortcutWidget(QWidget* parent) : QLineEdit(parent), lock(false), failed(false){ +} + +Shortcut ShortcutWidget::shortcut(){ + if (lock) + return pShortcut; + else + return Shortcut(); +} + +void ShortcutWidget::setShortcut(const Shortcut& s){ + lock = true; + displayShortcut(s.key, false, s.ctrl, s.shift, s.alt, s.altgr, s.win); +} + +void ShortcutWidget::keyPressEvent(QKeyEvent* event){ + keyEvent(event, false); + event->accept(); +} + +void ShortcutWidget::keyReleaseEvent(QKeyEvent* event){ + keyEvent(event, true); + event->accept(); +} + +void ShortcutWidget::keyEvent(QKeyEvent* event, bool release){ + if (release && lock) + return; + + unsigned int mods = HelperX11::keyboardModifiers(QX11Info::display()); + displayShortcut(event->nativeVirtualKey(), release, mods&ControlMask, mods&ShiftMask, mods&Mod1Mask, mods&Mod5Mask, mods&Mod4Mask); +} + +void ShortcutWidget::displayShortcut(quint32 key, bool release, bool ctrl, bool shift, bool alt, bool altgr, bool win){ + QString text; + + if (ctrl) + text.append(tr("Ctrl")).append(" + "); + if (shift) + text.append(tr("Shift")).append(" + "); + if (alt) + text.append(tr("Alt")).append(" + "); + if (altgr) + text.append(tr("AltGr")).append(" + "); + if (win) + text.append(tr("Win")).append(" + "); + + if ( !release && (keyXK_Hyper_R) && (keyXK_ISO_Last_Group_Lock) ){ + KeySym keysym = XKeycodeToKeysym(QX11Info::display(), XKeysymToKeycode(QX11Info::display(),key), 0); + if (keysym>=0xfd00 && keysym<=0xffff){ + text.append(XKeysymToString(keysym)); + } + else{ + text.append(static_cast(keysym)); + } + + lock = ctrl || shift || alt || altgr || win; + if (lock){ + pShortcut.key = keysym; + pShortcut.ctrl = ctrl; + pShortcut.shift = shift; + pShortcut.alt = alt; + pShortcut.altgr = altgr; + pShortcut.win = win; + failed = AutoType::registerGlobalShortcut(pShortcut); + if (!failed) + setBackgroundColor(QColor(255, 150, 150)); + else + setBackgroundColor(Qt::white); + } + } + else { + lock = false; + if (failed) + setBackgroundColor(Qt::white); + } + + setText(text); +} + +void ShortcutWidget::setBackgroundColor(const QColor& c){ + QPalette p( palette() ); + p.setColor(backgroundRole(), c); + setPalette(p); +} + +#else + +ShortcutWidget::ShortcutWidget(QWidget* parent) : QLineEdit(parent){ +} + +#endif diff --git a/src/lib/ShortcutWidget.h b/src/lib/ShortcutWidget.h new file mode 100644 index 0000000..c75123f --- /dev/null +++ b/src/lib/ShortcutWidget.h @@ -0,0 +1,49 @@ +/*************************************************************************** + * Copyright (C) 2005-2008 by Felix Geyer * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; version 2 of the License. * + + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef SHORTCUT_WIDGET_H +#define SHORTCUT_WIDGET_H + +#include +#include "lib/AutoType.h" + +class ShortcutWidget : public QLineEdit{ + Q_OBJECT + + public: + ShortcutWidget(QWidget* parent = 0); +#if defined(GLOBAL_AUTOTYPE) && defined(Q_WS_X11) + Shortcut shortcut(); + void setShortcut(const Shortcut& s); + + protected: + void keyPressEvent(QKeyEvent* event); + void keyReleaseEvent(QKeyEvent* event); + + private: + void keyEvent(QKeyEvent* event, bool release); + void displayShortcut(quint32 key, bool release, bool ctrl, bool shift, bool alt, bool altgr, bool win); + void setBackgroundColor(const QColor& c); + bool lock; + bool failed; + Shortcut pShortcut; +#endif +}; + +#endif // SHORTCUT_WIDGET_H diff --git a/src/lib/bookmarks.cpp b/src/lib/bookmarks.cpp index 892e96d..7eef472 100644 --- a/src/lib/bookmarks.cpp +++ b/src/lib/bookmarks.cpp @@ -17,51 +17,24 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include #include "bookmarks.h" #include "main.h" -#define CSTR(x)(x.toUtf8().data()) +#include "KpxConfig.h" QList KpxBookmarks::Bookmarks; -QString KpxBookmarks::filename; -bool KpxBookmarks::load(const QString& _filename){ - /* - Fileformat: - "Title1" "Path1"\n - "Title2" "Path2"\n - ... - */ +void KpxBookmarks::load(){ + if (!config->settings.contains("Bookmarks/size") || config->settings.value("Bookmarks/size").toInt()==0) + return; - filename=_filename; - QFile file(filename); - if(!file.exists()){ - return true; - } - if(!file.open(QIODevice::ReadOnly)){ - qWarning("Reading bookmarks failed: %s",CSTR(decodeFileError(file.error()))); - return false; - } - QString content=QString::fromUtf8(file.readAll()); - file.close(); - content.replace("\r",""); - QStringList lines=content.split("\n"); - for(int i=0;isettings.value("Bookmarks/size").toInt(); + for(int i=1;i<=size;i++){ BookmarkEntry entry; - entry.Title=lines[i].mid(a_title+1,b_title-a_title-1); - entry.Path=lines[i].mid(a_path+1,b_path-a_path-1); - Bookmarks << entry; + entry.Title = config->settings.value( QString("Bookmarks/%1/Title").arg(i) ).toString(); + entry.Path = config->settings.value( QString("Bookmarks/%1/Path").arg(i) ).toString(); + if (!entry.Title.isNull() && !entry.Path.isNull()) + Bookmarks << entry; } - return true; } int KpxBookmarks::count(){ @@ -88,21 +61,19 @@ int KpxBookmarks::add(const QString& Title,const QString& Path){ } bool KpxBookmarks::save(){ - QFile file(filename); - if(!file.exists()){ - return false; - } - if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)){ - qWarning("Writing bookmarks failed: %s",CSTR(decodeFileError(file.error()))); - return false; + for (int i=0;isettings.setValue( QString("Bookmarks/%1/Title").arg(i+1), Bookmarks[i].Title ); + config->settings.setValue( QString("Bookmarks/%1/Path").arg(i+1), Bookmarks[i].Path ); } - QString data; - for(int i=0;isettings.setValue("Bookmarks/size", count()); + + // remove orphaned entries + int i = count()+1; + while ( config->settings.contains( QString("Bookmarks/%1/Title").arg(i) ) ){ + config->settings.remove( QString("Bookmarks/%1/Title").arg(i) ); + config->settings.remove( QString("Bookmarks/%1/Path").arg(i) ); + i++; } - file.write(data.toUtf8()); - file.close(); } void KpxBookmarks::remove(int index){ @@ -120,8 +91,8 @@ void KpxBookmarks::edit(const QString& Title,const QString& Path,int i){ void KpxBookmarks::resort(QList order){ QList NewList; for(int i=0;i #include -#include -#include +#include +#include #include "random.h" using namespace std; diff --git a/src/main.cpp b/src/main.cpp index ff2dd5c..966e235 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,26 +20,27 @@ ***************************************************************************/ #include -#include -#include -#include -#include +#include +#include +#include #include #include #include #include #include #include -#include -#include #include #include +/* +#include +#include #include "plugins/interfaces/IFileDialog.h" #include "plugins/interfaces/IKdeInit.h" #include "plugins/interfaces/IGnomeInit.h" #include "plugins/interfaces/IIconTheme.h" #include "lib/FileDialogs.h" +*/ #include "main.h" #include "lib/FileDialogs.h" @@ -48,18 +49,11 @@ #include "Kdb3Database.h" #include "mainwindow.h" #include "crypto/yarrow.h" -using namespace std; - -#ifdef Q_WS_X11 - #include - #define XK_LATIN1 - #define XK_MISCELLANY - #define XK_XKB_KEYS - #include - #include +#if defined(Q_WS_X11) && defined(GLOBAL_AUTOTYPE) +#include "Application_X11.h" #endif -#define CSTR(x)(x.toUtf8().data()) +using namespace std; QHashPixmapCache; QHashIconCache; @@ -71,40 +65,22 @@ bool TrActive; QString DetailViewTemplate; QPixmap* EntryIcons; -IIconTheme* IconLoader=NULL; +//IIconTheme* IconLoader=NULL; //TODO plugins char ** argv; inline void loadImages(); -inline void parseCmdLineArgs(int argc, char** argv,QString &ArgFile,QString& ArgCfg,QString& ArgLang); +inline void parseCmdLineArgs(int argc, char** argv,QString &ArgFile,QString& ArgCfg,QString& ArgLang,bool& ArgMin,bool& ArgLock); bool loadTranslation(QTranslator* tr,const QString& prefix,const QString& LocaleCode,const QStringList& SearchPaths); -void test_getAllWindowTitles(){ - #ifdef Q_WS_X11 - Display* pDisplay = XOpenDisplay( NULL ); - Window r,p; - Window* c; - unsigned int num_ch=0; - XQueryTree(pDisplay,DefaultRootWindow(pDisplay),&r,&p,&c,&num_ch); - qDebug("%u",num_ch); - for(int i=0;iintegrPlugin()!=KpxConfig::NoIntegr){ + // TODO Plugins + /*if(config->integrPlugin()!=KpxConfig::NoIntegr){ QString LibName="libkeepassx-"; if(config->integrPlugin()==KpxConfig::KDE) LibName+="kde.so"; @@ -165,8 +141,13 @@ int main(int argc, char **_argv) qWarning(CSTR(QString("Could not load desktop integration plugin: File '%1' not found.").arg(LibName))); PluginLoadError=QObject::tr("Could not locate library file."); } - } - if(!app) QApplication* app=new QApplication(argc,argv); + }*/ + +#if defined(Q_WS_X11) && defined(GLOBAL_AUTOTYPE) + if(!app) new KeepassApplication(argc,argv); +#else + if(!app) new QApplication(argc,argv); +#endif //Internationalization @@ -184,11 +165,13 @@ int main(int argc, char **_argv) if(loadTranslation(translator,"keepass-",loc.name(),QStringList() << app->applicationDirPath()+"/../share/keepass/i18n/" << QDir::homePath()+"/.keepassx/" )) - {app->installTranslator(translator); - TrActive=true;} + { + app->installTranslator(translator); + TrActive=true; + } else{ if(loc.name()!="en_US") - qWarning(QString("Kpx: No Translation found for '%1 (%2)'using 'English (UnitedStates)'") + qWarning(QString("Kpx: No Translation found for '%1 (%2)' using 'English (UnitedStates)'") .arg(QLocale::languageToString(loc.language())) .arg(QLocale::countryToString(loc.country())).toAscii()); delete translator; @@ -202,42 +185,25 @@ int main(int argc, char **_argv) app->installTranslator(qtTranslator); else{ if(loc.name()!="en_US") - qWarning(QString("Qt: No Translation found for '%1 (%2)'using 'English (UnitedStates)'") + qWarning(QString("Qt: No Translation found for '%1 (%2)' using 'English (UnitedStates)'") .arg(QLocale::languageToString(loc.language())) .arg(QLocale::countryToString(loc.country())).toAscii()); delete qtTranslator; } - QFile templ(QDir::homePath()+"/.keepassx/detailview-template.html"); ///FIXME ArgCfg - if(templ.open(QIODevice::ReadOnly)){ - DetailViewTemplate=QString::fromUtf8(templ.readAll()); - templ.close(); - } - else loadDefaultDetailViewTemplate(); + DetailViewTemplate=config->detailViewTemplate(); loadImages(); - KpxBookmarks::load(QDir::homePath()+"/.keepassx/bookmarks"); + KpxBookmarks::load(); initYarrow(); //init random number generator SecString::generateSessionKey(); - int r=0; - KeepassMainWindow *mainWin = new KeepassMainWindow(ArgFile); - if(mainWin->Start){ - mainWin->show(); - r=app->exec(); - } + QApplication::setQuitOnLastWindowClosed(false); + KeepassMainWindow *mainWin = new KeepassMainWindow(ArgFile,ArgMin,ArgLock); + int r=app->exec(); delete mainWin; - if(templ.open(QIODevice::WriteOnly)){ - templ.write(DetailViewTemplate.toUtf8()); - templ.close(); - } - else{ - qWarning("Failed to save detail view template: %s",decodeFileError(templ.error()).toUtf8().data()); - } - - fileDlgHistory.save(); delete app; delete config; @@ -245,34 +211,6 @@ int main(int argc, char **_argv) } -void loadDefaultDetailViewTemplate(){ - QFile templ(":/default-detailview.html"); - templ.open(QIODevice::ReadOnly); - DetailViewTemplate=QString::fromUtf8(templ.readAll()); - templ.close(); - DetailViewTemplate.replace("Group",QCoreApplication::translate("DetailViewTemplate","Group")); - DetailViewTemplate.replace("Title",QCoreApplication::translate("DetailViewTemplate","Title")); - DetailViewTemplate.replace("Username",QCoreApplication::translate("DetailViewTemplate","Username")); - DetailViewTemplate.replace("Password",QCoreApplication::translate("DetailViewTemplate","Password")); - DetailViewTemplate.replace("URL",QCoreApplication::translate("DetailViewTemplate","URL")); - DetailViewTemplate.replace("Creation",QCoreApplication::translate("DetailViewTemplate","Creation")); - DetailViewTemplate.replace("Last Access",QCoreApplication::translate("DetailViewTemplate","Last Access")); - DetailViewTemplate.replace("Last Modification",QCoreApplication::translate("DetailViewTemplate","Last Modification")); - DetailViewTemplate.replace("Expiration",QCoreApplication::translate("DetailViewTemplate","Expiration")); - DetailViewTemplate.replace("Comment",QCoreApplication::translate("DetailViewTemplate","Comment")); -} - -//obsolete -void createBanner(QLabel *Banner,const QPixmap* symbol,QString text){ - QPixmap Pixmap; - createBanner(&Pixmap,symbol,text - ,Banner->width() - ,config->bannerColor1() - ,config->bannerColor2() - ,config->bannerTextColor()); - Banner->setPixmap(Pixmap); -} - void createBanner(QPixmap* Pixmap,const QPixmap* IconAlpha,const QString& Text,int Width){ createBanner(Pixmap,IconAlpha,Text,Width,config->bannerColor1(),config->bannerColor2(),config->bannerTextColor()); } @@ -317,37 +255,62 @@ QString decodeFileError(QFile::FileError Code){ case QFile::PermissionsError: return QApplication::translate("FileErrors","The file could not be accessed."); case QFile::CopyError: return QApplication::translate("FileErrors","The file could not be copied."); } + return QString(); +} + +void openBrowser(IEntryHandle* entry){ + QString url = entry->url(); + url.replace("{TITLE}", entry->title(), Qt::CaseInsensitive); + url.replace("{USERNAME}", entry->username(), Qt::CaseInsensitive); + + if (url.contains("{PASSWORD}",Qt::CaseInsensitive)){ + SecString password=entry->password(); + password.unlock(); + url.replace("{PASSWORD}", password, Qt::CaseInsensitive); + } + + openBrowser(url); } -void openBrowser(QString UrlString){ +void openBrowser(const QString& UrlString){ + if (UrlString.startsWith("cmd://") && UrlString.length()>6){ + QProcess::startDetached(UrlString.right(UrlString.length()-6)); + return; + } + QUrl url(UrlString); if(url.scheme().isEmpty()) url=QUrl("http://"+UrlString); - if(config->urlCmd().isEmpty()){ + if(config->urlCmdDef()){ QDesktopServices::openUrl(url); } else{ - QStringList args=config->urlCmd().arg(url.toString()).split(' '); - QString cmd=args.takeFirst(); - QProcess::startDetached(cmd,args); + QByteArray UrlEncoded = url.toEncoded(); + QString browser = config->urlCmd(); + if (browser.contains("%u", Qt::CaseInsensitive)) + browser.replace("%u", UrlEncoded, Qt::CaseInsensitive); + else if (browser.contains("%1")) + browser.replace("%1", UrlEncoded); + else + browser.append(" ").append(UrlEncoded); + QProcess::startDetached(browser); } } ///TODO 0.2.3 remove void loadImg(QString name,QPixmap& Img){ -if(Img.load(AppDir+"/../share/keepass/icons/"+name)==false){ - if(Img.load(AppDir+"/share/"+name)==false){ - QMessageBox::critical(0,QObject::tr("Error"),QObject::tr("File '%1' could not be found.") - .arg(name),QObject::tr("OK"),0,0,2,1); - exit(1); -}} - + if(Img.load(AppDir+"/../share/keepass/icons/"+name)==false){ + if(Img.load(AppDir+"/share/"+name)==false){ + QMessageBox::critical(0,QApplication::translate("Main","Error"), + QApplication::translate("Main","File '%1' could not be found.") + .arg(name),QApplication::translate("Main","OK"),0,0,2,1); + exit(1); + } + } } ///TODO 0.2.3 remove void loadImages(){ - bool small=true; - QString ThemeDir=AppDir+"/../share/keepass/icons/nuvola/32x32"; QPixmap tmpImg; loadImg("clientic.png",tmpImg); EntryIcons=new QPixmap[BUILTIN_ICONS]; @@ -361,7 +324,8 @@ const QIcon& getIcon(const QString& name){ if(CachedIcon) return *CachedIcon; QIcon* NewIcon=NULL; - if(IconLoader){ + //TODO plugins + /*if(IconLoader){ NewIcon=new QIcon(IconLoader->getIcon(name)); if(NewIcon->isNull()){ delete NewIcon; @@ -369,7 +333,7 @@ const QIcon& getIcon(const QString& name){ } else IconCache.insert(name,NewIcon); - } + }*/ if(!NewIcon) { QFileInfo IconFile(AppDir+"/../share/keepass/icons/"+name+".png"); @@ -399,39 +363,45 @@ const QPixmap* getPixmap(const QString& name){ bool loadTranslation(QTranslator* tr,const QString& prefix,const QString& loc,const QStringList& paths){ -for(int i=0;iload(prefix+loc+".qm",paths[i])) return true; -for(int i=0;iload(TrFiles[j],paths[i]))return true; + for(int i=0;iload(prefix+loc+".qm",paths[i])) return true; + + for(int i=0;iload(TrFiles[j],paths[i]))return true; + } } } + return false; } -return false; -} - +void printHelp(){ + cout << "KeePassX" << APP_VERSION << endl; + cout << "Usage: keepass [Filename] [Options]" << endl; + cout << " -help This Help" << endl; + cout << " -cfg Use specified file for loading/saving the configuration." << endl; + cout << " -min Start minimized." << endl; + cout << " -lock Start locked." << endl; + cout << " -lang Use specified language instead of systems default." << endl; + cout << " is the ISO-639 language code with or without ISO-3166 country code" << endl; + cout << " Examples: de German" << endl; + cout << " de_CH German(Switzerland)"<1){ -int i=1; + int i=1; if(argv[i][0]!='-'){ ArgFile=QString::fromUtf8(argv[i]); - i++; } - for(i; i Use specified file for loading/saving the configuration." << endl; - cout << " -lang Use specified language instead of systems default." << endl; - cout << " is the ISO-639 language code with or without ISO-3166 country code" << endl; - cout << " Examples: de German" << endl; - cout << " de_CH German(Switzerland)"<globalShortcut()); +#endif + setWindowModified(false); setGeometry(config->mainWindowGeometry(geometry())); VSplitter->restoreState(config->vSplitterPos()); HSplitter->restoreState(config->hSplitterPos()); @@ -103,20 +110,42 @@ KeepassMainWindow::KeepassMainWindow(const QString& ArgFile,QWidget *parent, Qt: setupConnections(); + bool showWindow=true; FileOpen=false; - if(!ArgFile.isEmpty()) - openDatabase(QDir::cleanPath(QDir::current().absoluteFilePath(ArgFile)),false); + if(!ArgFile.isEmpty()){ + QString f = QDir::cleanPath(QDir::current().absoluteFilePath(ArgFile)); + showWindow = !ArgMin; + if (ArgLock) + fakeOpenDatabase(f); + else + openDatabase(f,false); + } else if(config->openLastFile() && !config->lastFile().isEmpty()){ QFileInfo file(config->lastFile()); - if(file.exists()) - openDatabase(QDir::cleanPath(QDir::current().absoluteFilePath(config->lastFile())),true); + if(file.exists()){ + QString f = QDir::cleanPath(QDir::current().absoluteFilePath(config->lastFile())); + showWindow = !config->startMinimized(); + if (config->startLocked()) + fakeOpenDatabase(f); + else + openDatabase(f,true); + } else config->setLastFile(QString()); } - HelpBrowser = new QAssistantClient(QString(),this); - HelpBrowser->setArguments(QStringList()<< "-profile" << "/home/tarek/Documents/KeePassX/share/keepass/doc/keepassx.adp"); + else if (ArgLock){ + showWindow = false; + } + // TODO HelpBrowser + /*HelpBrowser = new QAssistantClient(QString(),this); + HelpBrowser->setArguments(QStringList()<< "-profile" << "share/keepass/doc/keepassx.adp");*/ createBookmarkActions(); + + if (showWindow) + show(); + else if (!config->showSysTrayIcon()) + showMinimized(); } void KeepassMainWindow::setupConnections(){ @@ -146,7 +175,9 @@ void KeepassMainWindow::setupConnections(){ connect(EditSaveAttachmentAction, SIGNAL(triggered()),EntryView, SLOT(OnSaveAttachment())); connect(EditSearchAction, SIGNAL(triggered()), this, SLOT(OnSearch())); connect(EditGroupSearchAction, SIGNAL(triggered()), this, SLOT(OnGroupSearch())); +#ifdef AUTOTYPE connect(EditAutoTypeAction,SIGNAL(triggered()),EntryView,SLOT(OnAutoType())); +#endif connect(ViewShowToolbarAction,SIGNAL(toggled(bool)),this,SLOT(OnViewShowToolbar(bool))); connect(ViewShowEntryDetailsAction,SIGNAL(toggled(bool)),this,SLOT(OnViewShowEntryDetails(bool))); @@ -162,9 +193,9 @@ void KeepassMainWindow::setupConnections(){ connect(ExtrasSettingsAction,SIGNAL(triggered(bool)),this,SLOT(OnExtrasSettings())); connect(ExtrasPasswordGenAction,SIGNAL(triggered(bool)),this,SLOT(OnExtrasPasswordGen())); connect(ExtrasShowExpiredEntriesAction,SIGNAL(triggered(bool)),this,SLOT(OnExtrasShowExpiredEntries())); - connect(ExtrasTrashCanAction,SIGNAL(triggered(bool)),this,SLOT(OnExtrasTrashCan())); + //connect(ExtrasTrashCanAction,SIGNAL(triggered(bool)),this,SLOT(OnExtrasTrashCan())); //TODO ExtrasTrashCan - connect(HelpHandbookAction,SIGNAL(triggered()),this,SLOT(OnHelpHandbook())); + //connect(HelpHandbookAction,SIGNAL(triggered()),this,SLOT(OnHelpHandbook())); //TODO Handbook connect(HelpAboutAction,SIGNAL(triggered()),this,SLOT(OnHelpAbout())); connect(EntryView,SIGNAL(itemActivated(QTreeWidgetItem*,int)),EntryView,SLOT(OnEntryActivated(QTreeWidgetItem*,int))); @@ -182,7 +213,7 @@ void KeepassMainWindow::setupConnections(){ connect(SysTray,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(OnSysTrayActivated(QSystemTrayIcon::ActivationReason))); connect(DetailView,SIGNAL(anchorClicked(const QUrl&)),this,SLOT(OnDetailViewUrlClicked(const QUrl&))); connect(WorkspaceLockedWidget.Button_Unlock,SIGNAL(clicked()),this,SLOT(OnUnLockWorkspace())); - connect(WorkspaceLockedWidget.Button_CloseDatabase,SIGNAL(clicked()),this,SLOT(OnFileClose())); + connect(WorkspaceLockedWidget.Button_CloseDatabase,SIGNAL(clicked()),this,SLOT(OnLockClose())); } void KeepassMainWindow::setupToolbar(){ @@ -234,10 +265,12 @@ void KeepassMainWindow::setupIcons(){ EditGroupSearchAction->setIcon(getIcon("groupsearch")); ExtrasShowExpiredEntriesAction->setIcon(getIcon("expired")); ExtrasPasswordGenAction->setIcon(getIcon("generator")); - ExtrasTrashCanAction->setIcon(getIcon("trashcan")); + //ExtrasTrashCanAction->setIcon(getIcon("trashcan")); //TODO ExtrasTrashCan ExtrasSettingsAction->setIcon(getIcon("appsettings")); +#ifdef AUTOTYPE EditAutoTypeAction->setIcon(getIcon("autotype")); - HelpHandbookAction->setIcon(getIcon("manual")); +#endif + //HelpHandbookAction->setIcon(getIcon("manual")); //TODO Handbook HelpAboutAction->setIcon(getIcon("help")); menuBookmarks->menuAction()->setIcon(getIcon("bookmark_folder")); AddThisAsBookmarkAction->setIcon(getIcon("bookmark_this")); @@ -262,7 +295,9 @@ void KeepassMainWindow::setupMenus(){ EntryView->ContextMenu->addAction(EditPasswordToClipboardAction); EntryView->ContextMenu->addAction(EditOpenUrlAction); EntryView->ContextMenu->addAction(EditSaveAttachmentAction); +#ifdef AUTOTYPE EntryView->ContextMenu->addAction(EditAutoTypeAction); +#endif EntryView->ContextMenu->addSeparator(); EntryView->ContextMenu->addAction(EditNewEntryAction); EntryView->ContextMenu->addAction(EditEditEntryAction); @@ -294,12 +329,12 @@ void KeepassMainWindow::setupMenus(){ case 28: ViewToolButtonSize28Action->setChecked(true); break; } - SysTrayMenu = new QMenu(tr(APP_DISPLAY_NAME),this); + SysTrayMenu = new QMenu(APP_DISPLAY_NAME,this); SysTrayMenu->addAction(FileUnLockWorkspaceAction); SysTrayMenu->addSeparator(); SysTrayMenu->addAction(FileExitAction); SysTray->setContextMenu(SysTrayMenu); - SysTray->setToolTip(tr("%1 %2").arg(APP_DISPLAY_NAME, APP_SHORT_FUNC) + " - " + tr((IsLocked) ? "Locked" : "Unlocked")); + SysTray->setToolTip(QString("%1 %2 - %3").arg(APP_DISPLAY_NAME, APP_SHORT_FUNC, (IsLocked) ? tr("Locked") : tr("Unlocked"))); #define _add_import(name){\ QAction* import=new QAction(this);\ @@ -333,14 +368,16 @@ void KeepassMainWindow::setupMenus(){ EditDeleteEntryAction->setShortcut(tr("Ctrl+D")); EditCloneEntryAction->setShortcut(tr("Ctrl+K")); EditSearchAction->setShortcut(tr("Ctrl+F")); +#ifdef AUTOTYPE EditAutoTypeAction->setShortcut(tr("Ctrl+V")); +#endif #ifdef Q_WS_MAC FileCloseAction->setShortcut(tr("Ctrl+W")); FileSaveAsAction->setShortcut(tr("Shift+Ctrl+S")); EditGroupSearchAction->setShortcut(tr("Shift+Ctrl+F")); #endif - ExtrasTrashCanAction->setVisible(false); //For KP 2.x only + //ExtrasTrashCanAction->setVisible(false); //TODO For KP 2.x only menuBookmarks->menuAction()->setVisible(config->featureBookmarks()); } @@ -354,16 +391,28 @@ void KeepassMainWindow::setupDatabaseConnections(IDatabase* DB){ } -void KeepassMainWindow::openDatabase(QString filename,bool IsAuto){ +bool KeepassMainWindow::openDatabase(QString filename,bool IsAuto){ + if (!QFile::exists(filename)){ + QMessageBox::critical(this,tr("Error") + ,tr("The database file does not exist.")); + return false; + } if(!IsAuto){ config->setLastKeyLocation(QString()); - config->setLastKeyType(PASSWORD);} + config->setLastKeyType(PASSWORD); + } db=dynamic_cast(new Kdb3Database()); - CPasswordDialog PasswordDlg(this,filename,db,IsAuto,false); - switch(PasswordDlg.exec()){ - case 0: return; - case 2: Start=false; return; + CPasswordDialog PasswordDlg(this,filename,db,(IsAuto&&!InUnLock),false); + if (InUnLock){ + PasswordDlg.setWindowModality(Qt::WindowModal); + unlockDlg = &PasswordDlg; } + bool rejected = (PasswordDlg.exec()==QDialog::Rejected); + if (InUnLock) + unlockDlg = NULL; + if (rejected) + return false; + if(PasswordDlg.BookmarkFilename!=QString()) filename=PasswordDlg.BookmarkFilename; @@ -373,39 +422,57 @@ void KeepassMainWindow::openDatabase(QString filename,bool IsAuto){ QString err; StatusBarGeneral->setText(tr("Loading Database...")); if(db->load(filename)==true){ + if (IsLocked) + resetLock(); saveLastFilename(filename); - setWindowTitle(tr("%1 - KeePassX").arg(filename)); + setWindowTitle(QString("%1[*] - KeePassX").arg(filename)); GroupView->createItems(); EntryView->showGroup(NULL); setStateFileOpen(true); setStateFileModified(false); + currentFile = filename; } else{ StatusBarGeneral->setText(tr("Loading Failed")); QString error=db->getError(); - if(error==QString())error=tr("Unknown error while loading database."); + if(error.isEmpty())error=tr("Unknown error while loading database."); QMessageBox::critical(this,tr("Error") - ,tr("The following error occured while opening the database:\n%1") - .arg(error),tr("OK")); + ,QString("%1\n%2").arg(tr("The following error occured while opening the database:")) + .arg(error)); if(dynamic_cast(db)->isKeyError()){ delete db; - openDatabase(filename,IsAuto); + return openDatabase(filename,IsAuto); } - else + else{ delete db; + return false; + } } StatusBarGeneral->setText(tr("Ready")); + return true; } -bool KeepassMainWindow::closeDatabase(){ +void KeepassMainWindow::fakeOpenDatabase(const QString& filename){ + if (!QFile::exists(filename)){ + QMessageBox::critical(this,tr("Error") + ,tr("The database file does not exist.")); + return; + } + + config->setLastFile(filename); + currentFile = filename; + setLock(); +} + +bool KeepassMainWindow::closeDatabase(bool lock){ Q_ASSERT(FileOpen); Q_ASSERT(db!=NULL); if(ModFlag){ - int r=QMessageBox::question(this,tr("Save modified file?"), - tr("The current file was modified. Do you want\nto save the changes?"),tr("Yes"),tr("No"),tr("Cancel"),2,2); - if(r==2)return false; //Abbrechen - if(r==0) //Ja (Datei speichern) - if(!OnFileSave())return false; + int r=QMessageBox::question(this,tr("Save modified file?"), + tr("The current file was modified. Do you want\nto save the changes?"),tr("Yes"),tr("No"),tr("Cancel"),2,2); + if(r==2)return false; //Abbrechen + if(r==0) //Ja (Datei speichern) + if(!OnFileSave())return false; } db->close(); delete db; @@ -417,8 +484,13 @@ bool KeepassMainWindow::closeDatabase(){ GroupView->clear(); GroupView->Items.clear(); SearchResults.clear(); + if (lock) + IsLocked = true; setStateFileOpen(false); - setWindowTitle("KeePassX Password Manager"); + if (!lock){ + setWindowTitle(APP_DISPLAY_NAME); + currentFile.clear(); + } return true; } @@ -431,8 +503,10 @@ void KeepassMainWindow::OnFileNewKdb(){ if(dlg.exec()==1){ if(FileOpen) if(!closeDatabase())return; + if (IsLocked) + resetLock(); db=dynamic_cast(db_new); - setWindowTitle(tr("%1 - KeePassX").arg(tr("[new]"))); + setWindowTitle(QString("[%1][*] - KeePassX").arg(tr("new"))); GroupView->db=db; EntryView->db=db; GroupView->createItems(); @@ -466,51 +540,56 @@ void KeepassMainWindow::OnFileOpen(){ if(!FileDlg.selectedFiles().size())return;*/ QString filename=KpxFileDialogs::openExistingFile(this,"MainWindow_FileOpen", tr("Open Database..."),QStringList()<setEnabled(IsOpen); -FileSaveAsAction->setEnabled(IsOpen); -FileCloseAction->setEnabled(IsOpen); -FileSettingsAction->setEnabled(IsOpen); -FileChangeKeyAction->setEnabled(IsOpen); -EditSearchAction->setEnabled(IsOpen); -GroupView->setEnabled(IsOpen); -EntryView->setEnabled(IsOpen); -DetailView->setEnabled(IsOpen); -QuickSearchEdit->setEnabled(IsOpen); -ExtrasShowExpiredEntriesAction->setEnabled(IsOpen); -AddThisAsBookmarkAction->setEnabled(IsOpen); - -if(!IsOpen){ - EditNewGroupAction->setEnabled(false); - EditEditGroupAction->setEnabled(false); - EditDeleteGroupAction->setEnabled(false); - EditPasswordToClipboardAction->setEnabled(false); - EditUsernameToClipboardAction->setEnabled(false); - EditOpenUrlAction->setEnabled(false); - EditSaveAttachmentAction->setEnabled(false); - EditNewEntryAction->setEnabled(false); - EditEditEntryAction->setEnabled(false); - EditCloneEntryAction->setEnabled(false); - EditDeleteEntryAction->setEnabled(false); - EditGroupSearchAction->setEnabled(false); - EditAutoTypeAction->setEnabled(false); -} -else{ - //OnGroupSelectionChanged(); - //OnEntrySelectionChanged(); -} - + FileOpen=IsOpen; + FileSaveAction->setEnabled(IsOpen); + FileSaveAsAction->setEnabled(IsOpen); + FileCloseAction->setEnabled(IsOpen||IsLocked); + FileSettingsAction->setEnabled(IsOpen); + FileChangeKeyAction->setEnabled(IsOpen); + EditSearchAction->setEnabled(IsOpen); + GroupView->setEnabled(IsOpen); + EntryView->setEnabled(IsOpen); + DetailView->setEnabled(IsOpen); + QuickSearchEdit->setEnabled(IsOpen); + ExtrasShowExpiredEntriesAction->setEnabled(IsOpen); + AddThisAsBookmarkAction->setEnabled(IsOpen); + FileUnLockWorkspaceAction->setEnabled(IsOpen||IsLocked); + + if(!IsOpen){ + EditNewGroupAction->setEnabled(false); + EditEditGroupAction->setEnabled(false); + EditDeleteGroupAction->setEnabled(false); + EditPasswordToClipboardAction->setEnabled(false); + EditUsernameToClipboardAction->setEnabled(false); + EditOpenUrlAction->setEnabled(false); + EditSaveAttachmentAction->setEnabled(false); + EditNewEntryAction->setEnabled(false); + EditEditEntryAction->setEnabled(false); + EditCloneEntryAction->setEnabled(false); + EditDeleteEntryAction->setEnabled(false); + EditGroupSearchAction->setEnabled(false); +#ifdef AUTOTYPE + EditAutoTypeAction->setEnabled(false); +#endif + } + /*else{ + OnGroupSelectionChanged(); + OnEntrySelectionChanged(); + }*/ } @@ -524,6 +603,7 @@ void KeepassMainWindow::setStateFileModified(bool mod){ FileSaveAction->setIcon(getIcon("filesave")); else FileSaveAction->setIcon(getIcon("filesavedisabled")); + setWindowModified(mod); } void KeepassMainWindow::setStateGroupSelected(SelectionState s){ @@ -604,7 +684,7 @@ void KeepassMainWindow::updateDetailView(){ if(years){ if(out!=QString()) - out.prepend(tr(", ")); + out.prepend(", "); if(years==1) out.prepend(tr("1 Year")); if(years>1) @@ -612,7 +692,7 @@ void KeepassMainWindow::updateDetailView(){ } else if(days){ if(out!=QString()) - out.append(tr(", ")); + out.append(", "); if(days==1) out.append(tr("1 Day")); if(days>1) @@ -646,7 +726,9 @@ switch(EntrySelection){ EditCloneEntryAction->setText(tr("Clone Entry")); EditDeleteEntryAction->setEnabled(false); EditDeleteEntryAction->setText(tr("Delete Entry")); +#ifdef AUTOTYPE EditAutoTypeAction->setEnabled(false); +#endif break; case SINGLE: EditPasswordToClipboardAction->setEnabled(true); @@ -658,7 +740,9 @@ switch(EntrySelection){ EditCloneEntryAction->setText(tr("Clone Entry")); EditDeleteEntryAction->setEnabled(true); EditDeleteEntryAction->setText(tr("Delete Entry")); +#ifdef AUTOTYPE EditAutoTypeAction->setEnabled(true); +#endif break; case MULTIPLE: EditPasswordToClipboardAction->setEnabled(false); @@ -670,7 +754,9 @@ switch(EntrySelection){ EditCloneEntryAction->setText(tr("Clone Entries")); EditDeleteEntryAction->setEnabled(true); EditDeleteEntryAction->setText(tr("Delete Entries")); +#ifdef AUTOTYPE EditAutoTypeAction->setEnabled(false); +#endif break; default: Q_ASSERT(false); } @@ -686,7 +772,9 @@ switch(EntrySelection){ EditCloneEntryAction->setText(tr("Clone Entry")); EditDeleteEntryAction->setEnabled(false); EditDeleteEntryAction->setText(tr("Delete Entry")); +#ifdef AUTOTYPE EditAutoTypeAction->setEnabled(false); +#endif break; case SINGLE: EditUsernameToClipboardAction->setEnabled(true); @@ -698,7 +786,9 @@ switch(EntrySelection){ EditCloneEntryAction->setText(tr("Clone Entry")); EditDeleteEntryAction->setEnabled(true); EditDeleteEntryAction->setText(tr("Delete Entry")); +#ifdef AUTOTYPE EditAutoTypeAction->setEnabled(true); +#endif break; case MULTIPLE: EditUsernameToClipboardAction->setEnabled(false); @@ -710,7 +800,9 @@ switch(EntrySelection){ EditCloneEntryAction->setText(tr("Clone Entries")); EditDeleteEntryAction->setEnabled(true); EditDeleteEntryAction->setText(tr("Delete Entries")); +#ifdef AUTOTYPE EditAutoTypeAction->setEnabled(false); +#endif break; default: Q_ASSERT(false); } @@ -719,35 +811,35 @@ else Q_ASSERT(false); bool KeepassMainWindow::OnFileSave(){ -if(!db->file()) - return OnFileSaveAs(); -saveLastFilename(db->file()->fileName()); -if(db->save()) - setStateFileModified(false); -else{ - showErrMsg(tr("File could not be saved.\n%1").arg(db->getError())); - return false; -} -return true; + if(!db->file()) + return OnFileSaveAs(); + saveLastFilename(db->file()->fileName()); + if(db->save()) + setStateFileModified(false); + else{ + showErrMsg(QString("%1\n%2").arg(tr("File could not be saved.")).arg(db->getError())); + return false; + } + return true; } bool KeepassMainWindow::OnFileSaveAs(){ QString filename=KpxFileDialogs::saveFile(this,"MainWindow_FileSave", tr("Save Database..."),QStringList()<changeFile(filename)){ - showErrMsg(tr("File could not be saved.\n%1").arg(db->getError())); + showErrMsg(QString("%1\n%2").arg(tr("File could not be saved.")).arg(db->getError())); db->changeFile(QString()); - setWindowTitle(tr("KeePassX - [unsaved]").arg(filename)); + //setWindowTitle(tr("KeePassX - [unsaved]").arg(filename)); return false; } - setWindowTitle(tr("%1 - KeePassX").arg(filename)); + setWindowTitle(QString("%1[*] - KeePassX").arg(filename)); return OnFileSave(); } void KeepassMainWindow::OnFileSettings(){ -CDbSettingsDlg dlg(this,db); -if(dlg.exec())setStateFileModified(true); + CDbSettingsDlg dlg(this,db); + if(dlg.exec()) setStateFileModified(true); } void KeepassMainWindow::OnFileChangeKey(){ @@ -782,7 +874,7 @@ void KeepassMainWindow::OnImport(QAction* action){ GroupView->db=db; EntryView->db=db; setupDatabaseConnections(db); - setWindowTitle(tr("* - KeePassX")); + setWindowTitle(QString("[%1][*] - KeePassX").arg(tr("new"))); GroupView->createItems(); EntryView->showGroup(NULL); setStateFileOpen(true); @@ -793,18 +885,16 @@ void KeepassMainWindow::OnImport(QAction* action){ } - +/* void KeepassMainWindow::removeFromSearchResults(int id){ - /* for(int i=0; iminimizeToTray()){ + if(!ShutingDown && config->showSysTrayIcon() && config->minimizeToTray()){ e->ignore(); + if (config->lockOnMinimize() && !IsLocked && FileOpen) + OnUnLockWorkspace(); hide(); return; } + +#ifdef GLOBAL_AUTOTYPE + AutoType::unregisterGlobalShortcut(); +#endif config->setMainWindowGeometry(geometry()); config->setVSplitterPos(VSplitter->saveState()); - config->setHSplitterPos(HSplitter->saveState()); + if (config->showEntryDetails()) + config->setHSplitterPos(HSplitter->saveState()); config->setShowStatusbar(statusBar()->isVisible()); if(FileOpen){ @@ -877,8 +974,31 @@ void KeepassMainWindow::closeEvent(QCloseEvent* e){ else e->accept(); delete SysTray; + QCoreApplication::quit(); +} + +void KeepassMainWindow::hideEvent(QHideEvent* event){ + if (event->spontaneous() && QApplication::activeModalWidget()==NULL){ + if (config->lockOnMinimize() && !IsLocked && FileOpen) + OnUnLockWorkspace(); + if (config->showSysTrayIcon() && config->minimizeTray()){ + setVisible(false); + event->accept(); + return; + } + } + + QMainWindow::hideEvent(event); } +void KeepassMainWindow::showEvent(QShowEvent* event){ + if (IsLocked && !InUnLock && event->spontaneous()){ + showNormal(); // workaround for some graphic glitches + OnUnLockWorkspace(); + } + + QMainWindow::showEvent(event); +} void KeepassMainWindow::OnExtrasSettings(){ CSettingsDlg dlg(this); @@ -894,11 +1014,12 @@ AboutDialog dlg(this); dlg.exec(); } -void KeepassMainWindow::OnHelpHandbook(){ + //TODO Handbook +/*void KeepassMainWindow::OnHelpHandbook(){ HelpBrowser->openAssistant(); -} +}*/ void KeepassMainWindow::OnViewShowToolbar(bool show){ config->setShowToolbar(show); @@ -960,8 +1081,21 @@ void KeepassMainWindow::OnViewToolbarIconSize28(bool state){ } void KeepassMainWindow::OnSysTrayActivated(QSystemTrayIcon::ActivationReason reason){ - if(reason!=QSystemTrayIcon::Context) - this->show(); + if(reason!=QSystemTrayIcon::Context){ + bool unlockActive = (unlockDlg!=NULL && unlockDlg->isActiveWindow()); + if (isVisible()){ + if (unlockDlg!=NULL) + unlockDlg->reject(); + else if (config->lockOnMinimize() && !IsLocked && FileOpen) + OnUnLockWorkspace(); + hide(); + } + else{ + showNormal(); + if (IsLocked) + OnUnLockWorkspace(); + } + } } void KeepassMainWindow::OnExtrasPasswordGen(){ @@ -992,13 +1126,14 @@ void KeepassMainWindow::OnExtrasShowExpiredEntries(){ } -void KeepassMainWindow::OnExtrasTrashCan(){ +//TODO TrashCan +/*void KeepassMainWindow::OnExtrasTrashCan(){ TrashCanDialog dlg(this,db,db->expiredEntries()); if(dlg.exec()==QDialog::Accepted){ } -} +}*/ void KeepassMainWindow::OnDetailViewUrlClicked(const QUrl& url){ openBrowser(url.toString()); @@ -1006,26 +1141,71 @@ void KeepassMainWindow::OnDetailViewUrlClicked(const QUrl& url){ void KeepassMainWindow::OnUnLockWorkspace(){ if(IsLocked){ - LockedCentralWidget->setVisible(false); - LockedCentralWidget->setParent(NULL); - setCentralWidget(NormalCentralWidget); - NormalCentralWidget->setVisible(true); - SysTray->setIcon(getIcon("keepassx_large")); - SysTray->setToolTip(tr("%1 %2").arg(APP_DISPLAY_NAME, APP_SHORT_FUNC) + " - " + tr("Unlocked")); - FileUnLockWorkspaceAction->setText(tr("&Lock Workspace")); - IsLocked=false; + if (InUnLock) return; + InUnLock = true; + if ( openDatabase(currentFile,true) ){ + QTreeWidgetItem* item = GroupView->invisibleRootItem(); + if (lockGroup.size()>0){ + for (int i=0; ichild(lockGroup[i]); + if (item==NULL) break; + } + if (item!=NULL) + GroupView->setCurrentItem(item); + lockGroup.clear(); + } + } + InUnLock = false; } else { - NormalCentralWidget->setVisible(false); - NormalCentralWidget->setParent(NULL); - setCentralWidget(LockedCentralWidget); - LockedCentralWidget->setVisible(true); - SysTray->setIcon(getIcon("keepassx_locked")); - SysTray->setToolTip(tr("%1 %2").arg(APP_DISPLAY_NAME, APP_SHORT_FUNC) + " - " + tr("Locked")); - FileUnLockWorkspaceAction->setText(tr("Un&lock Workspace")); - IsLocked=true; + QTreeWidgetItem* item = GroupView->currentItem(); + bool root = false; + while (item!=NULL){ + QTreeWidgetItem* parent = item->parent(); + if (parent==NULL && !root) { + parent = GroupView->invisibleRootItem(); + root = true; + } + if (parent!=NULL) + lockGroup.prepend(parent->indexOfChild(item)); + item = parent; + } + + if (closeDatabase(true)) + setLock(); + else + lockGroup.clear(); } } +void KeepassMainWindow::OnLockClose(){ + resetLock(); + setStateFileOpen(false); + setWindowTitle(APP_DISPLAY_NAME); +} + +void KeepassMainWindow::setLock(){ + NormalCentralWidget->setVisible(false); + NormalCentralWidget->setParent(NULL); + setCentralWidget(LockedCentralWidget); + LockedCentralWidget->setVisible(true); + SysTray->setIcon(getIcon("keepassx_locked")); + SysTray->setToolTip(QString("%1 %2").arg(APP_DISPLAY_NAME, APP_SHORT_FUNC) + " - " + tr("Locked")); + FileUnLockWorkspaceAction->setText(tr("Un&lock Workspace")); + IsLocked=true; + setStateFileOpen(false); +} + +void KeepassMainWindow::resetLock(){ + LockedCentralWidget->setVisible(false); + LockedCentralWidget->setParent(NULL); + setCentralWidget(NormalCentralWidget); + NormalCentralWidget->setVisible(true); + SysTray->setIcon(getIcon("keepassx_large")); + SysTray->setToolTip(QString("%1 %2").arg(APP_DISPLAY_NAME, APP_SHORT_FUNC) + " - " + tr("Unlocked")); + FileUnLockWorkspaceAction->setText(tr("&Lock Workspace")); + IsLocked=false; +} + void KeepassMainWindow::OnBookmarkTriggered(QAction* action){ if(action==AddBookmarkAction){ AddBookmarkDlg dlg(this); diff --git a/src/mainwindow.h b/src/mainwindow.h index 9c687da..f81a89e 100755 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #include #include @@ -37,7 +37,7 @@ #include #include #include -#include +//#include //TODO HelpBrowser #include #include "Kdb3Database.h" @@ -52,9 +52,8 @@ class KeepassMainWindow : public QMainWindow, public Ui_MainWindow{ Q_OBJECT public: - KeepassMainWindow (const QString& ArgFile,QWidget *parent=0, Qt::WFlags flags=0); + KeepassMainWindow (const QString& ArgFile,bool ArgMin,bool ArgLock,QWidget *parent=0, Qt::WFlags flags=0); IDatabase* db; - bool Start; signals: void entryChanged(); @@ -85,9 +84,9 @@ class KeepassMainWindow : public QMainWindow, public Ui_MainWindow{ void OnExtrasSettings(); void OnExtrasPasswordGen(); void OnExtrasShowExpiredEntries(); - void OnExtrasTrashCan(); + //void OnExtrasTrashCan(); //TODO TrashCan void OnHelpAbout(); - void OnHelpHandbook(); + //void OnHelpHandbook(); //TODO Handbook void OnItemExpanded(QTreeWidgetItem*); void OnItemCollaped(QTreeWidgetItem*); void OnShowSearchResults(); @@ -97,9 +96,14 @@ class KeepassMainWindow : public QMainWindow, public Ui_MainWindow{ void OnExport(QAction*); void OnDetailViewUrlClicked(const QUrl& url); void OnUnLockWorkspace(); + void OnLockClose(); private: void closeEvent(QCloseEvent* event); + void hideEvent(QHideEvent* event); + void showEvent(QShowEvent* event); + void setLock(); + void resetLock(); SelectionState GroupSelection, EntrySelection; bool FileOpen; bool ModFlag; @@ -113,11 +117,12 @@ class KeepassMainWindow : public QMainWindow, public Ui_MainWindow{ void setStateFileModified(bool); void setStateGroupSelected(SelectionState s); void setStateEntrySelected(SelectionState s); - void openDatabase(QString filename,bool IsAuto=false); + bool openDatabase(QString filename,bool IsAuto=false); + void fakeOpenDatabase(const QString& filename); void setupDatabaseConnections(IDatabase* DB); - bool closeDatabase(); + bool closeDatabase(bool lock=false); void search(IGroupHandle* Group); - void removeFromSearchResults(int sID); + //void removeFromSearchResults(int sID); void updateDetailView(); void exportDatabase(IExport* exporter,QStringList filters); void saveLastFilename(const QString& filename); @@ -129,11 +134,15 @@ class KeepassMainWindow : public QMainWindow, public Ui_MainWindow{ QSystemTrayIcon* SysTray; QAction* ViewShowToolbarAction; QMenu* SysTrayMenu; - QAssistantClient* HelpBrowser; + //QAssistantClient* HelpBrowser; //TODO HelpBrowser QWidget* NormalCentralWidget; QWidget* LockedCentralWidget; Ui_WorkspaceLockedWidget WorkspaceLockedWidget; bool ShutingDown; + bool InUnLock; + QList lockGroup; + QDialog* unlockDlg; + QString currentFile; }; #endif diff --git a/src/src.pro b/src/src.pro index 8f70b6b..4666507 100755 --- a/src/src.pro +++ b/src/src.pro @@ -19,20 +19,42 @@ isEmpty(PREFIX){ } unix : !macx { + !isEqual(AUTOTYPE,0){ + DEFINES += AUTOTYPE + !isEqual(GLOBAL_AUTOTYPE,0){ + DEFINES += GLOBAL_AUTOTYPE + } + } target.path = $${PREFIX}/bin data.path = $${PREFIX}/share/keepass - LIBS += -lXtst -lQtDBus - SOURCES += lib/AutoType_X11.cpp + pixmaps.files = ../share/pixmaps/* + pixmaps.path = $${PREFIX}/share/pixmaps + desktop.files = ../share/applications/* + desktop.path = $${PREFIX}/share/applications + INSTALLS += pixmaps desktop + contains(DEFINES,AUTOTYPE){ + LIBS += -lXtst + SOURCES += lib/HelperX11.cpp lib/AutoType_X11.cpp + HEADERS += lib/HelperX11.h + } + contains(DEFINES,GLOBAL_AUTOTYPE){ + SOURCES += Application_X11.cpp + HEADERS += Application_X11.h + } } +contains(DEFINES,GLOBAL_AUTOTYPE){ + FORMS += forms/AutoTypeDlg.ui + HEADERS += dialogs/AutoTypeDlg.h + SOURCES += dialogs/AutoTypeDlg.cpp +} + macx { target.path = /Applications data.path = /Applications/keepass.app/Contents/share/keepass - SOURCES += lib/AutoType_X11.cpp } win32 { - SOURCES += lib/AutoType_Win.cpp TARGET = ../$$TARGET QMAKE_LINK_OBJECT_SCRIPT = ../build/$$QMAKE_LINK_OBJECT_SCRIPT @@ -52,7 +74,7 @@ FORMS += forms/EditGroupDlg.ui \ forms/CollectEntropyDlg.ui \ forms/CustomizeDetailViewDlg.ui \ forms/CalendarDlg.ui \ - forms/TrashCanDlg.ui \ +# forms/TrashCanDlg.ui \ forms/ExpiredEntriesDlg.ui \ forms/WorkspaceLockedWidget.ui \ forms/AddBookmarkDlg.ui \ @@ -91,12 +113,13 @@ HEADERS += lib/IniReader.h \ dialogs/CustomizeDetailViewDlg.h \ dialogs/CalendarDlg.h \ dialogs/ExpiredEntriesDlg.h \ - dialogs/TrashCanDlg.h \ +# dialogs/TrashCanDlg.h \ lib/random.h \ Database.h \ - lib/KdePlugin.h \ +# lib/KdePlugin.h \ lib/AutoType.h \ lib/FileDialogs.h \ + lib/ShortcutWidget.h \ global.h \ main.h \ lib/GroupView.h \ @@ -119,7 +142,7 @@ HEADERS += lib/IniReader.h \ plugins/interfaces/IGnomeInit.h \ plugins/interfaces/IIconTheme.h \ KpxConfig.h \ - KpxFirefox.h \ +# KpxFirefox.h \ dialogs/AddBookmarkDlg.h \ lib/bookmarks.h \ dialogs/ManageBookmarksDlg.h @@ -153,15 +176,16 @@ SOURCES += lib/UrlLabel.cpp \ dialogs/CustomizeDetailViewDlg.cpp \ dialogs/CalendarDlg.cpp \ dialogs/ExpiredEntriesDlg.cpp \ - dialogs/TrashCanDlg.cpp \ +# dialogs/TrashCanDlg.cpp \ lib/random.cpp \ Database.cpp \ - lib/KdePlugin.cpp \ +# lib/KdePlugin.cpp \ lib/GroupView.cpp \ lib/EntryView.cpp \ lib/FileDialogs.cpp \ crypto/arcfour.cpp \ lib/KpFileIconProvider.cpp \ + lib/ShortcutWidget.cpp \ crypto/aescrypt.c \ crypto/aeskey.c \ crypto/aestab.c \ @@ -170,7 +194,7 @@ SOURCES += lib/UrlLabel.cpp \ crypto/yarrow.cpp \ lib/WaitAnimationWidget.cpp \ KpxConfig.cpp \ - KpxFirefox.cpp \ +# KpxFirefox.cpp \ dialogs/AddBookmarkDlg.cpp \ lib/bookmarks.cpp \ dialogs/ManageBookmarksDlg.cpp @@ -179,11 +203,12 @@ MOC_DIR = ../build/moc UI_DIR = ../build/ui OBJECTS_DIR = ../build/ RCC_DIR = ../build/rcc -CONFIG += debug \ -qt \ +CONFIG = qt \ +uic \ +resources \ thread \ -warn_off \ -assistant +stl \ +warn_off QT += xml TEMPLATE = app INCLUDEPATH += . \ @@ -194,3 +219,10 @@ export \ import \ dialogs \ ./ + +isEqual(RELEASE,1){ + CONFIG += release +} +else{ + CONFIG += debug +} diff --git a/src/translations/keepass-cs_CS.ts b/src/translations/keepass-cs_CS.ts index 7d0f254..2b797e8 100644 --- a/src/translations/keepass-cs_CS.ts +++ b/src/translations/keepass-cs_CS.ts @@ -1,182 +1,150 @@ - - + AboutDialog - KeePassX %1 - KeePassX %1 + KeePassX %1 - <b>Current Translation: None</b><br><br> Please replace 'None' with the language of your translation <b>Aktuální překlad: český</b><br><br> - <b>Author:</b> %1<br> <b>Autor:</b> %1<br> - $TRANSLATION_AUTHOR Marek Straka - $TRANSLATION_AUTHOR_EMAIL Here you can enter your email or homepage if you want. marek@straka.info (<a href="http://marek.straka.info">marek.straka.info</a>) - - Information on how to translate KeePassX can be found under: -http://keepassx.sourceforge.net/ - - - - Team Vývojová skupina - Tarek Saidi - Tarek Saidi + Tarek Saidi - Developer, Project Admin Vývojář, vedoucí projektu - tariq@users.berlios.de - tariq@users.berlios.de + tariq@users.berlios.de - Eugen Gorschenin - Eugen Gorschenin + Eugen Gorschenin - Web Designer Webový designér - geugen@users.berlios.de - geugen@users.berlios.de + geugen@users.berlios.de - Thanks To Poděkování - Matthias Miller - Matthias Miller + Matthias Miller - Patches for better MacOS X support Patches pro lepší MacOS X podporu - www.outofhanwell.com - www.outofhanwell.com + www.outofhanwell.com - James Nicholls - James Nicholls + James Nicholls - Main Application Icon Hlavní ikonka aplikace - - Constantin Makshin - - - - Various fixes and improvements - - dinosaur-rus@users.sourceforge.net - - - - Error Chyba - File '%1' could not be found. Soubor '%1' nemohl být nalezen. - Make sure that the program is installed correctly. Ujistěte se, že program je správně nainstalován. - OK OK - Could not open file '%1' Nelze otevřít soubor '%1' - The following error occured: %1 - Vyskytl se následující problém: + Vyskytl se následující problém: %1 - http://keepassx.sf.net - http://keepassx.sf.net + http://keepassx.sf.net + + + Unofficial + + + + Developer + + + + Information on how to translate KeePassX can be found under: + + + + The following error occured: + AboutDlg - About O aplikaci - License Licence - Translation Překlad - <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">KeePassX</span> - Cross Platform Password Manager</p></body></html> - <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">KeePassX</span> - multiplatformní správce hesel</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">KeePassX</span> - multiplatformní správce hesel</p></body></html> - Copyright (C) 2005 - 2006 Tarek Saidi KeePassX is distributed under the terms of the General Public License (GPL) version 2. @@ -185,191 +153,235 @@ KeePassX je šířen pod podmínkami General Public License (GPL) verze 2. - Credits Poděkování - http://keepassx.sourceforge.net http://keepassx.sourceforge.net - keepassx@gmail.com keepassx@gmail.com - - Copyright (C) 2005 - 2006 Tarek Saidi + AppName + + + + AppFunc + + + + http://sniperbeamer.fobos.de/keepassx/ + + + + Copyright (C) 2005 - 2007 KeePassX Team KeePassX is distributed under the terms of the -General Public License (GPL) version 2 or later. +General Public License (GPL) version 2. + + + + + AddBookmarkDlg + + Add Bookmark + + + + Title: + Název: + + + File: + + + + Browse... + Projít... + + + Edit Bookmark + + + + KeePass Databases (*.kdb) + + + + All Files (*) AutoType - More than one 'Auto-Type:' key sequence found. Allowed is only one per entry. Nalezena více než jedna 'Auto-Type:' klíčová sekvence Je dovolena pouze jedna na každý záznam. - Syntax Error in Auto-Type sequence near character %1 Found '{' without closing '}' Chyba syntaxe v Auto-Type sekvenci poblíž znaku %1 Nalezeno '{' bez uzavření '}' - Error - Chyba + Chyba - Syntax Error in Auto-Type sequence near character %1 Found '{' without closing '}' + + Auto-Type string contains illegal characters + + + + + AutoTypeDlg + + KeePassX - Auto-Type + + + + Click on an entry to auto-type it. + + + + Group + + + + Title + Název + + + Username + + + + Cancel + Zrušit + + + Auto-Type + + CAboutDialog - KeePassX %1 KeePassX %1 - Error Chyba - File '%1' could not be found. Soubor '%1' nemohl být nalezen. - Make sure that the program is installed correctly. Ujistěte se, že program je správně nainstalován. - OK OK - Could not open file '%1' Nelze otevřít soubor '%1' - The following error occured: %1 Vyskytl se následující problém: %1 - <b>Current Translation: None</b><br><br> Please replace 'None' with the language of your translation <b>Aktuální překlad: český</b><br><br> - <b>Author:</b> %1<br> <b>Autor:</b> %1<br> - $TRANSLATION_AUTHOR_EMAIL Here you can enter your email or homepage if you want. marek@straka.info (<a href="http://marek.straka.info">marek.straka.info</a>) - Matthias Miller Matthias Miller - Eugen Gorschenin Eugen Gorschenin - $TRANSLATION_AUTHOR Marek Straka - Team Vývojová skupina - Tarek Saidi Tarek Saidi - Developer, Project Admin Vývojář, vedoucí projektu - tariq@users.berlios.de tariq@users.berlios.de - Web Designer Webový designér - geugen@users.berlios.de geugen@users.berlios.de - Thanks To Poděkování - Patches for better MacOS X support Patches pro lepší MacOS X podporu - www.outofhanwell.com www.outofhanwell.com - Information on how to translate KeePassX can be found under: http://keepassx.sourceforge.net/ Informace o tom jak přeložit KeePassX lze nalézt zde: http://keepassx.sourceforge.net/ - James Nicholls James Nicholls - Main Application Icon Hlavní ikonka aplikace - http://keepassx.sf.net http://keepassx.sf.net @@ -377,47 +389,38 @@ http://keepassx.sourceforge.net/ CDbSettingsDlg - AES(Rijndael): 256 Bit (default) AES(Rijndael): 256 Bitů (standartní) - Twofish: 256 Bit Twofish: 256 Bitů - Warning Varování - Please determine the number of encryption rounds. Prosím zadejte počet šifrovacích kol. - OK OK - Error Chyba - '%1' is not valid integer value. '%1' není platná integer hodnota. - The number of encryption rounds have to be greater than 0. Počet kol zašifrování musí být větší než 0. - Settings Nastavení @@ -425,206 +428,163 @@ http://keepassx.sourceforge.net/ CEditEntryDlg - Warning Upozornění - Password and password repetition are not equal. Please check your input. Heslo a opakované heslo nejsou stejné Prosím zkontrolujte zadané údaje. - OK OK - Save Attachment... Uložit přílohu... - Overwrite? Přepsat? - A file with this name already exists. Do you want to replace it? Soubor s tímto jménem již existuje. Chcete ho přepsat? - Yes Ano - No Ne - Error Chyba - Could not remove old file. Nelze odstranit starý soubor. - Could not create new file. Nelze vytvořit nový soubor. - Error while writing the file. Chyba při zápisu souboru. - Delete Attachment? Smazat přílohu? - You are about to delete the attachment of this entry. Are you sure? Chystáte se smazat přílohu tohoto záznamu. Jste si tím jistí? - No, Cancel Ne, zrušit - Edit Entry - Upravit záznam + Upravit záznam - Could not open file. Nelze otevřít soubor. - %1 Bit %1 bitů - Add Attachment... Připojit přílohu... - - Test 2 - - - - The chosen entry has no attachment or it is empty. - Today - 1 Week - 2 Weeks - 3 Weeks - 1 Month - 3 Months - 6 Months - 1 Year - Calendar... + + [Untitled Entry] + + CGenPwDialog - Notice Poznámka - You need to enter at least one character Je nutné vložit minimálně jeden znak - OK OK - Error Chyba - Could not open '/dev/random' or '/dev/urandom'. Nelze otevřít '/dev/random' nebo '/dev/urandom'. - Password Generator Generátor hesla - %1 Bit %1 bitů - - Accept - - - - %1 Bits @@ -632,200 +592,168 @@ Jste si tím jistí? CPasswordDialog - OK OK - Error Chyba - Please enter a Password. Vložte prosím heslo. - Please choose a key file. Vyberte prosím soubor s klíčem. - Please enter a Password or select a key file. Vložte prosím heslo nebo vyberte soubor s klíčem. - Database Key Klíč k databázi - Select a Key File Vyberte soubor s klíčem - *.key *.key - Unexpected Error: File does not exist. Neočekávaná chyba: Soubor neexistuje. - The selected key file or directory does not exist. Vybraný soubor s klíčem nebo adresář neexistuje. - The given directory does not contain any key files. Daný adresář neobsahuje žádné soubory s klíči. - The given directory contains more then one key file. Please specify the key file directly. Daný adresář obsahuje více než jeden klíč. Zadejte prosím klíč přímo. - The key file found in the given directory is not readable. Please check your permissions. Nalezený soubor s klíčem v zadaném adresáři nelze přečíst. Zkontrolujte prosím parametry souboru. - Key file could not be found. Soubor s klíčem nemohl být nalezen. - Key file is not readable. Please check your permissions. Soubor s klíčem nelze přečíst. Zkontrolujte prosím parametry souboru. - Warning Upozornění - Password an password repetition are not equal. Please check your input. Heslo a opakované heslo nejsou stejné. Zkontrolujte zadané údaje. - Please enter a password or select a key file. Prosím vložte heslo nebo vyberte soubor s klíčem. - A file with the name 'pwsafe.key' already exisits in the given directory. Do you want to replace it? Soubor se jménem 'pwsafe.key' již v zadaném adresáři existuje. Chcete ho přepsat? - Yes Ano - No Ne - The exisiting file is not writable. Existující soubor není zapisovatelný. - A file with the this name already exisits. Do you want to replace it? Soubor s tímto jménem již existuje. Chcete ho zaměnit? - The selected key file or directory is not readable. Please check your permissions. Vybraný soubor s klíčem nebo adresář nelze otevřít. Prosím zkontrolujte jeho parametry. - All Files (*) - Key Files (*.key) - File exists. - A file with the selected name already exists, should this file be used as key file or do you want to overwrite it with a newly generated one? - Use - Overwrite - Cancel Zrušit - Key file could not be created. %1 + + Last File + + CSearchDlg - Notice Poznámka - Please enter a search string. Prosím vložte hledaný řetězec. - OK OK - Search Vyhledat @@ -833,72 +761,72 @@ Prosím zkontrolujte jeho parametry. CSelectIconDlg - Delete Smazat - Add Icons... Přidat ikonky... - Images (%1) Obrázky (%1) - %1: File could not be loaded. - %1: Soubor nemohl být otevřen. + %1: Soubor nemohl být otevřen. - Error Chyba - Replace... Zaměnit... - An error occured while loading the icon(s): %1 - Vyskytla se chyba během otevírání ikonky (ikonek): + Vyskytla se chyba během otevírání ikonky (ikonek): %1 - An error occured while loading the icon. Během otevírání ikonky se vyskytla chyba. + + Add Custom Icon + + + + Pick + Vybrat + + + %1: File could not be loaded. + + + + An error occured while loading the icon(s): + + CSettingsDlg - Settings Nastavení - Select a directory... Výběr adresáře... - - - Error: %1 - - CalendarDialog - Calendar @@ -906,23 +834,19 @@ Prosím zkontrolujte jeho parametry. CollectEntropyDlg - Entropy Collection - Random Number Generator - Collecting entropy... Please move the mouse and/or press some keys until enought entropy for a reseed of the random number generator is collected. - <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> @@ -933,320 +857,275 @@ p, li { white-space: pre-wrap; } CustomizeDetailViewDialog - Group - Title Název - Username - Password Heslo - Url - Comment Komentář - Attachment Name - Creation Date - Last Access Date - Last Modification Date - Expiration Date - Time till Expiration - Dialog - Rich Text Editor - Bold - B - Italic - I - Underlined - U - Left-Aligned - L - Centered - C - Right-Aligned - R - Justified - Text Color - Font Size - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 14 - 16 - 18 - 20 - 22 - 24 - 26 - 28 - 36 - 42 - 78 - Templates - T - HTML - - Restore Default - + Cancel + Zrušit + + + Database - - Save - + Never + Nikdy + + + DatabaseSettingsDlg - - Cancel - Zrušit + Database Settings + Nastavení databáze + + + Encryption + Zašifrování + + + Algorithm: + Algoritmus: + + + Encryption Rounds: + Počet kol zašifrování: DetailViewTemplate - Group - Title Název - Username - Password Heslo - URL URL - Creation Vytvoření - Last Access Poslední přístup - Last Modification - Expiration - Comment Komentář @@ -1254,112 +1133,90 @@ p, li { white-space: pre-wrap; } EditEntryDialog - Edit Entry Úprava záznamu - Username: Uživatel: - Password Repet.: Zopakování hesla: - Title: Název: - URL: URL: - Password: Heslo: - Quality: Úroveň zajištění: - Comment: Komentář: - Expires: Platnost vyprší: - Group: Skupina: - &Cancel &zrušit - Alt+C Alt+C - %1 %1 - Icon: Ikonka: - Ge&n. Ge&n. - ... - ... + ... - O&K O&K - Alt+K Alt+K - Never Nikdy - Attachment: Příloha: - > - > + > - %1 Bit %1 bitů @@ -1367,42 +1224,34 @@ p, li { white-space: pre-wrap; } EditGroupDialog - Group Properties Vlastnosti skupiny - Title: Název: - Icon: Ikonka: - &Cancel - &zrušit + &zrušit - Alt+C - Alt+C + Alt+C - O&K - O&K + O&K - Alt+K - Alt+K + Alt+K - > > @@ -1410,81 +1259,75 @@ p, li { white-space: pre-wrap; } ExpiredEntriesDialog - - Expried Entries of the Database - - - - Expired Entries - Double click on an entry to jump to it. - Group - Title Název - Username - Expired + + Expired Entries in the Database + + Export_KeePassX_Xml - XML Files (*.xml) - All Files (*) + + KeePassX XML File + + Export_Txt - Could not open file (FileError=%1) Nelze otevřít soubor (FileError=%1) - All Files (*) - Text Files (*.txt) + + Text File + + ExporterBase - Import File... - Export Failed @@ -1492,77 +1335,62 @@ p, li { white-space: pre-wrap; } FileErrors - No error occurred. - An error occurred while reading from the file. - An error occurred while writing to the file. - A fatal error occurred. - An resource error occurred. - The file could not be opened. - The operation was aborted. - A timeout occurred. - An unspecified error occurred. - The file could not be removed. - The file could not be renamed. - The position in the file could not be changed. - The file could not be resized. - The file could not be accessed. - The file could not be copied. @@ -1570,147 +1398,118 @@ p, li { white-space: pre-wrap; } GenPwDlg - Alt+U Alt+U - Alt+N Alt+N - Alt+M Alt+M - Alt+L Alt+L - Password Generator Generátor hesla - Accep&t Převzí&t - &Cancel &zrušit - Generate Vygenerovat - New Password: Nové heslo: - Quality: Kvalita: - Options Volby - &Upper Letters &Velká písmena - &Lower Letters &Malá písmena - &Numbers Čís&la - &Special Characters &Zvláštní znaky - Minus Minus - U&nderline Po&dtržítko - h&igher ANSI-Characters &Speciální ANSI znaky - Alt+H Alt+H - Use &only following characters: Používat &jen následující znaky: - Alt+O Alt+O - Length: Délka: - Use "/dev/rando&m" Použít "/dev/rando&m" - Use follo&wing character groups: Použít následující &skupiny znaků: - Alt+W Alt+W - White &Spaces Me&zery - Alt+S Alt+S - Enable entropy collection - Collect only once per session @@ -1718,32 +1517,26 @@ p, li { white-space: pre-wrap; } Import_KWalletXml - XML Files (*.xml) - All Files (*) - Import Failed - Invalid XML data (see stdout for details). Neplatná XML data (viz stdout pro podrobnosti). - Invalid XML file. Neplatný XML soubor. - Document does not contain data. Dokument neobsahuje žádná data. @@ -1751,28 +1544,23 @@ p, li { white-space: pre-wrap; } Import_KeePassX_Xml - KeePass XML Files (*.xml) - All Files (*) - Import Failed - XML parsing error on line %1 column %2: %3 - Parsing error: File is no valid KeePassX XML file. @@ -1780,62 +1568,50 @@ p, li { white-space: pre-wrap; } Import_PwManager - PwManager Files (*.pwm) - All Files (*) - Import Failed - File is empty. Soubor je prázdný. - File is no valid PwManager file. Soubor není ve formátu PwManager. - Unsupported file version. Nepodporovaná verze souboru. - Unsupported hash algorithm. Nepodporovaný hash algoritmus. - Unsupported encryption algorithm. Nepodporovaný šifrovací algoritmus. - Compressed files are not supported yet. Zkompresované soubory nejsou ještě podporovány. - Wrong password. Chybné heslo. - File is damaged (hash test failed). Soubor je poškozen (hast test selhall). - Invalid XML data (see stdout for details). Neplatná XML data (viz stdout pro podrobnosti). @@ -1843,12 +1619,10 @@ p, li { white-space: pre-wrap; } ImporterBase - Import File... - Import Failed @@ -1856,187 +1630,187 @@ p, li { white-space: pre-wrap; } Kdb3Database - Could not open file. - Unexpected file size (DB_TOTAL_SIZE < DB_HEADER_SIZE) Neočekávaná velikost souboru (DB_TOTAL_SIZE < DB_HEADER_SIZE) - Wrong Signature Chybný podpis - Unsupported File Version. Nepodporovaná verze souboru. - Unknown Encryption Algorithm. Neznámý algoritmus zašifrování. - Decryption failed. The key is wrong or the file is damaged. Rozšifrování se nepodařilo. Buď je nesprávný klíč nebo je soubor poškozen. - Hash test failed. The key is wrong or the file is damaged. Hash test selhal. Klíč je chybný nebo je soubor poškozen. - Unexpected error: Offset is out of range. [G1] - Neočekávaná chyba: Offset je mimo rozsah. [G1] + Neočekávaná chyba: Offset je mimo rozsah. [G1] - Unexpected error: Offset is out of range. [G2] - Neočekávaná chyba: Offset je mimo rozsah. [G2] + Neočekávaná chyba: Offset je mimo rozsah. [G2] - Unexpected error: Offset is out of range. [E1] - Neočekávaná chyba: Offset je mimo rozsah. [E1] + Neočekávaná chyba: Offset je mimo rozsah. [E1] - Unexpected error: Offset is out of range. [E2] - Neočekávaná chyba: Offset je mimo rozsah. [E2] + Neočekávaná chyba: Offset je mimo rozsah. [E2] - Unexpected error: Offset is out of range. [E3] - Neočekávaná chyba: Offset je mimo rozsah. [E3] + Neočekávaná chyba: Offset je mimo rozsah. [E3] - Invalid group tree. - Key file is empty. - The database must contain at least one group. - Could not open file for writing. Nebylo možné otevřít soubor pro zápis. + + Unexpected error: Offset is out of range. + + + + + Kdb3Database::EntryHandle + + Bytes + + + + KiB + + + + MiB + + + + GiB + + KeepassEntryView - Title Název - Username Uživatelské jméno - URL URL - Password Heslo - Comments Komentáře - Expires Vyprší - Creation Vytvoření - Last Change Poslední změna - Last Access Poslední přístup - Attachment Příloha - %1 items %1 položky - Are you sure you want delete this entry? - Are you sure you want delete these %1 entries? - Delete? - Group + + Error + Chyba + + + At least one group must exist before adding an entry. + + + + OK + OK + KeepassGroupView - Search Results Výsledky hledání - Groups - Skupiny + Skupiny - Delete? - Are you sure you want to delete this group, all it's child groups and all their entries? @@ -2044,821 +1818,739 @@ Klíč je chybný nebo je soubor poškozen. KeepassMainWindow - Ctrl+N Ctrl+N - Ctrl+O Ctrl+O - Ctrl+S Ctrl+S - Ctrl+G Ctrl+G - Ctrl+C Ctrl+C - Ctrl+B Ctrl+B - Ctrl+U Ctrl+U - Ctrl+Y Ctrl+Y - Ctrl+E Ctrl+E - Ctrl+D Ctrl+D - Ctrl+K Ctrl+K - Ctrl+F Ctrl+F - Ctrl+W Ctrl+W - Shift+Ctrl+S Shift+Ctrl+S - Shift+Ctrl+F Shift+Ctrl+F - Error Chyba - The following error occured while opening the database: %1 - Při otevírání databáze se objevila následující chyba: + Při otevírání databáze se objevila následující chyba: %1 - OK - OK + OK - Save modified file? Uložit změněný soubor? - The current file was modified. Do you want to save the changes? Aktuální soubor byl změněn. Mají být změny uloženy? - Yes Ano - No Ne - Cancel Zrušit - KeePassX - %1 KeePassX - %1 - <B>Group: </B>%1 <B>Title: </B>%2 <B>Username: </B>%3 <B>URL: </B><a href=%4>%4</a> <B>Password: </B>%5 <B>Creation: </B>%6 <B>Last Change: </B>%7 <B>LastAccess: </B>%8 <B>Expires: </B>%9 <B>Skupina: </B>%1 <B>Název: </B>%2 <B>Uživ. jméno: </B>%3 <B>URL: </B><a href=%4>%4</a> <B>Heslo: </B>%5 <B>Vytvořeno: </B>%6 <B>Poslední změna: </B>%7 <B>Poslední přístup: </B>%8 <B>Vyprší: </B>%9 - Clone Entry Naklonovat záznam - Delete Entry Smazat záznam - Clone Entries Naklonovat záznamy - Delete Entries Smazat záznamy - File could not be saved. %1 - Soubor nemohl být uložen. + Soubor nemohl být uložen. %1 - Save Database As... Uložit databázi jako ... - Ready Připraveno - [new] - [nový] + [nový] - Open Database... Otevřít databázi ... - Loading Database... Otevírání databáze ... - Loading Failed Otevření selhalo - Could not create key file. The following error occured: %1 Nebylo možné vytvořit klíčový soubor. Vyskytla se následující chyba: %1 - Export To... Vyexportovat do ... - KeePassX [new] KeePassX [new] - Unknown error in Import_PwManager::importFile()() Neznámá chyba v Import_PwManager::importFile()() - Unknown error in Import_KWalletXml::importFile() Neznámaá chyba v Import_KWalletXml::importFile() - Unknown error in PwDatabase::openDatabase() Neznámá chyba v PwDatabase::openDatabase() - Ctrl+V Ctrl+V - Show Toolbar Panel nástrojů - KeePassX - KeePassX + KeePassX - - %1 - KeePassX - - - - Unknown error while loading database. - KeePass Databases (*.kdb) - All Files (*) - Save Database... - - KeePassX - [unsaved] - - - - New Database - - expired - - - - 1 Month - %1 Months - - , - - - - 1 Year - %1 Years - 1 Day - %1 Days - less than 1 day - Set Master Key - - * - KeePassX + Locked + + + + Unlocked + + + + Ctrl+L + + + + Ctrl+Q + + + + The database file does not exist. + + + + new + + + + Expired + + + + Un&lock Workspace + + + + &Lock Workspace + + + + The following error occured while opening the database: + + + + File could not be saved. + + Main + + Error + Chyba + + + File '%1' could not be found. + Soubor '%1' nemohl být nalezen. + + + OK + OK + + MainWindow - KeePassX KeePassX - Columns Sloupečky - PwManager File (*.pwm) PwManager souboru (*.pwm) - KWallet XML-File (*.xml) KWallet XML-souboru (*.xml) - Add New Group... Přidat novou skupinu... - Edit Group... Upravit skupinu... - Delete Group Smazat skupinu - Copy Password to Clipboard Zkopírovat heslo do schránky - Copy Username to Clipboard Zkopírovat uživatelské jméno do schránky - Open URL Otevřít URL - Save Attachment As... Uložit přílohu jako... - Add New Entry... Přidat novou položku... - View/Edit Entry... Zobrazit/upravit položku... - Delete Entry Smazat položku - Clone Entry Naklonovat položku - Search In Database... - Vyhledat v databázi... + Vyhledat v databázi... - Search in this group... - Vyhledat v této skupině... + Vyhledat v této skupině... - Show Toolbar Panel nástrojů - Show Entry Details Detaily položky - Hide Usernames Skrýt uživatelská jména - Hide Passwords Skrýt hesla - Title Název - Username Uživatel - URL URL - Password Heslo - Comment Komentář - Expires Platnost - Creation Vytvoření - Last Change Poslední změna - Last Access Poslední přístup - Attachment Příloha - Show Statusbar Stavový řádek - Plain Text (*.txt) Jednoduchého textu (*.txt) - Hide Skrýt - Perform AutoType Provádět autodoplňování - Type Here Psát zde - Toolbar Icon Size Velikost ikonek na panelu nástrojů - 16x16 16x16 - 22x22 22x22 - 28x28 28x28 - &View &Zobrazit - &File &Soubor - &Import from... &Importovat z ... - &Export to... &Exportovat do ... - &Edit &Upravit - E&xtras &Doplňky - &Help &Nápověda - &New Database... Nová &databáze... - &Open Database... &Otevřít databázi... - &Close Database Za&vřít databázi - &Save Database Uloži&t databázi - Save Database &As... Uložit databázi &jako... - &Database Settings... Nastavení data&báze... - Change &Master Key... Změnit &master klíč... - E&xit - Uk&ončit + Uk&ončit - &Settings... N&astavení... - &About... O a&plikaci... - &KeePassX Handbook... &KeePassX příručka... - Standard KeePass Single User Database (*.kdb) - Advanced KeePassX Database (*.kxdb) - New Database... - Password Generator... - Group (search results only) - Show Expired Entries... - - Show Expired Entries + Recycle Bin... - - Recycle Bin... + Groups + Skupiny + + + Bookmarks + + + + Manage Bookmarks... + + + + &Lock Workspace + + + + Q&uit + + + + Search in Database... - - Lock Workspace + Search in this Group... + + + + Add Bookmark... + + + + Bookmark this Database... + + + + + ManageBookmarksDlg + + Manage Bookmarks PasswordDlg - TextLabel - Textová nálepka + Textová nálepka - OK - OK + OK - ... ... - Cancel - Zrušit + Zrušit - Enter a Password and/or choose a key file. Vložit heslo nebo vybrat soubor s klíčem. - Key Klíč - Password: Heslo: - Key file or directory: Soubor s klíčem nebo adresář: - &Browse... &Projít... - Alt+B Alt+B - Use Password AND Key File Použít heslo současně se souborem s klíčem - Exit - Ukončit + Ukončit - Password Repet.: Zopakování hesla: + + Last File + + PwDatabase - Unknown Error Neznámá chyba - Unexpected file size (DB_TOTAL_SIZE < DB_HEADER_SIZE) Neočekávaná velikost souboru (DB_TOTAL_SIZE < DB_HEADER_SIZE) - Wrong Signature Chybný podpis - AES-Init Failed AES-Init selhal - Unexpected error: Offset is out of range. [G1] Neočekávaná chyba: Offset je mimo rozsah. [G1] - Unexpected error: Offset is out of range. [G2] Neočekávaná chyba: Offset je mimo rozsah. [G2] - Unexpected error: Offset is out of range. [E1] Neočekávaná chyba: Offset je mimo rozsah. [E1] - Unexpected error: Offset is out of range. [E2] Neočekávaná chyba: Offset je mimo rozsah. [E2] - Unexpected error: Offset is out of range. [E3] Neočekávaná chyba: Offset je mimo rozsah. [E3] - Hash test failed. The key is wrong or the file is damaged. Hash test selhal. Klíč je chybný nebo je soubor poškozen. - Could not open key file. Nebylo možné otevřít soubor s klíčem. - Key file could not be written. Soubor s klíčem nemohl být uložen. - Could not open file. Nebylo možné otevřít soubor. - Could not open file for writing. Nebylo možné otevřít soubor pro zápis. - Unsupported File Version. Nepodporovaná verze souboru. - Unknown Encryption Algorithm. Neznámý algoritmus zašifrování. - Decryption failed. The key is wrong or the file is damaged. Rozšifrování se nepodařilo. @@ -2868,134 +2560,101 @@ Buď je nesprávný klíč nebo je soubor poškozen. QObject - Warning Upozornění - Could not save configuration file. Make sure you have write access to '~/.keepass'. Nebylo možné uložit konfigurační soubor, Ujistěte se, že je možný přístup do '~/.keepass'. - OK - OK + OK - File '%1' could not be found. - Soubor '%1' nemohl být nalezen. + Soubor '%1' nemohl být nalezen. - File not found. Soubor nenalezen. - Could not open file. Nebylo možné otevřít soubor. - File is no valid PwManager file. Soubor není ve formátu PwManager. - Unsupported file version. Nepodporovaná verze souboru. - Unsupported hash algorithm. Nepodporovaný hash algoritmus. - Unsupported encryption algorithm. Nepodporovaný šifrovací algoritmus. - Compressed files are not supported yet. Zkompresované soubory nejsou ještě podporovány. - Wrong password. Chybné heslo. - File is damaged (hash test failed). Soubor je poškozen (hast test selhall). - Invalid XML data (see stdout for details). Neplatná XML data (viz stdout pro podrobnosti). - File is empty. Soubor je prázdný. - Invalid XML file (see stdout for details). Neplatný XML soubor (viz stdout pro detaily). - Invalid XML file. Neplatný XML soubor. - Document does not contain data. Dokument neobsahuje žádná data. - Error - Chyba + Chyba - Warning: Upozornění: - Invalid RGB color value. Neplatná RGB hodnota barvy. - Never - Nikdy - - - - Initialization failed. - - - - - Could not locate library file. - + Nikdy SearchDialog - Search @@ -3003,117 +2662,94 @@ Ujistěte se, že je možný přístup do '~/.keepass'. Search_Dlg - Alt+T Alt+T - Alt+U Alt+U - A&nhang Přílo&ha - Alt+N Alt+N - Alt+W Alt+W - Alt+C Alt+C - Search... Hledat... - Search For: Vyhledat: - Regular E&xpression Regulární &výraz - Alt+X Alt+X - &Case Sensitive S &ohledem na velikost písmene - Include: Vložit: - &Titles &Názvy - &Usernames Uživatelská &jména - C&omments Ko&mentáře - Alt+O Alt+O - U&RLs U&RLs - Alt+R Alt+R - Pass&words He&sla - Search - Hledat + Hledat - Clo&se - U&zavřít + U&zavřít - Alt+S - Alt+S + Alt+S - Include Subgroups (recursive) Vložit podskupiny (rekurzívně) @@ -3121,393 +2757,359 @@ Ujistěte se, že je možný přístup do '~/.keepass'. SelectIconDlg - Icon Selection Výběr ikonky - Add Custom Icon... - Přidat vlastní ikonku... + Přidat vlastní ikonku... - Pick - Vybrat + Vybrat - Cancel - Zrušit + Zrušit SettingsDialog - Alt+Ö Alt+Ö - O&K O&K - Alt+K Alt+K - Alt+C Alt+C - Settings Nastavení - &Cancel &Zrušit - Clear clipboard after: Smazat schránku po: - Seconds Sekundách - Sh&ow passwords in plain text by default Zobrazovat &hesla vždy jako obyčejný text - Alt+O Alt+O - Appea&rance Zo&brazení - Banner Color Barva banneru - Text Color: Barva textu: - Change... Změnit... - Color 2: Barva 2: - C&hange... Z&měnit... - Alt+H Alt+H - Color 1: Barva 1: - Expand group tree when opening a database Při otevření databáze rozvinout skupiny ve stromové struktuře - &Other &Ostatní - Browser Command: Příkaz pro prohlížeč: - Securi&ty &Bezpečnost - Alternating Row Colors Střídavě barevné podklady řádků - Browse... Projít... - Remember last key type and location Zapamatovat naposledy napsaný klíč a umístění - Mounting Root: Mountovat jako Root: - Remember last opened file Zapamatovat naposledy otevřený soubor - The integration plugins provide features like usage of the native file dialogs and message boxes of the particular desktop environments. - General - Show system tray icon - Minimize to tray when clicking the main window's close button - Save recent directories of file dialogs - Group tree at start-up: - Restore last state - Expand all items - Do not expand any item - Security - Show passwords in plain text in: - Edit Entry Dialog - Key Dialogs - Desktop Integration - Plug-Ins - None - Gnome Desktop Integration (Gtk 2.x) - KDE 4 Desktop Integration - You need to restart the program before the changes take effect. - Configure... - Advanced - Clear History Now - Always ask before deleting entries or groups - - Unified Title and Toolbar - - - - Customize Entry Detail View... - Features - You can disable several features of KeePassX here according to your needs in order to keep the user interface slim. - Bookmarks - Auto-Type Fine Tuning - Time between the activation of an auto-type action by the user and the first simulated key stroke. - ms - Pre-Gap: - Key Stroke Delay: - Delay between two simulated key strokes. Increase this if Auto-Type is randomly skipping characters. - The directory where storage devices like CDs and memory sticks are normally mounted. - Media Root: - System Default - Enable this if you want to use your bookmarks and the last opened file independet from their absolute paths. This is especially useful when using KeePassX portably and therefore with changing mount points in the file system. - Save relative paths (bookmarks and last file) + + Minimize to tray instead of taskbar + + + + Start minimized + + + + Start locked + + + + Lock workspace when minimizing the main window + + + + Global Auto-Type Shortcut: + + + + Use entry titles to match the window for Global Auto-Type + + + + + ShortcutWidget + + Ctrl + + + + Shift + + + + Alt + + + + AltGr + + + + Win + + SimplePasswordDialog - O&K O&K - Alt+K Alt+K - Alt+C Alt+C - ... - ... + ... - Enter your Password Vložit heslo - Password: Heslo: - &Cancel &Zrušit @@ -3515,66 +3117,54 @@ Ujistěte se, že je možný přístup do '~/.keepass'. StandardDatabase - Unexpected file size (DB_TOTAL_SIZE < DB_HEADER_SIZE) Neočekávaná velikost souboru (DB_TOTAL_SIZE < DB_HEADER_SIZE) - Wrong Signature Chybný podpis - Unsupported File Version. Nepodporovaná verze souboru. - Unknown Encryption Algorithm. Neznámý algoritmus zašifrování. - Decryption failed. The key is wrong or the file is damaged. Rozšifrování se nepodařilo. Buď je nesprávný klíč nebo je soubor poškozen. - Hash test failed. The key is wrong or the file is damaged. Hash test selhal. Klíč je chybný nebo je soubor poškozen. - Unexpected error: Offset is out of range. [G1] Neočekávaná chyba: Offset je mimo rozsah. [G1] - Unexpected error: Offset is out of range. [G2] Neočekávaná chyba: Offset je mimo rozsah. [G2] - Unexpected error: Offset is out of range. [E1] Neočekávaná chyba: Offset je mimo rozsah. [E1] - Unexpected error: Offset is out of range. [E2] Neočekávaná chyba: Offset je mimo rozsah. [E2] - Unexpected error: Offset is out of range. [E3] Neočekávaná chyba: Offset je mimo rozsah. [E3] - Could not open file for writing. Nebylo možné otevřít soubor pro zápis. @@ -3582,92 +3172,69 @@ Klíč je chybný nebo je soubor poškozen. TrashCanDialog - - Recycle Bin - - - - - Double click on an entry to restore it. - - - - - Group - - - - Title - Název + Název + + + WorkspaceLockedWidget - - Username + Form - - Expired + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Verdana'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">The workspace is locked.</span></p></body></html> - - Empty Recycle Bin + Unlock - - Close + Close Database dbsettingdlg_base - Database Settings - Nastavení databáze + Nastavení databáze - Encryption - Zašifrování + Zašifrování - Algorithm: - Algoritmus: + Algoritmus: - ? ? - Encryption Rounds: - Počet kol zašifrování: + Počet kol zašifrování: - O&K - O&K + O&K - Ctrl+K - Ctrl+K + Ctrl+K - &Cancel - &Zrušit + &Zrušit - Ctrl+C - Ctrl+C + Ctrl+C diff --git a/src/translations/keepass-de_DE.ts b/src/translations/keepass-de_DE.ts index 464a3b3..0459d1a 100644 --- a/src/translations/keepass-de_DE.ts +++ b/src/translations/keepass-de_DE.ts @@ -1,9 +1,7 @@ - - + - Could not open file (FileError=%1) Datei konnte nicht geöffnet werden. (FileError=%1) @@ -11,185 +9,125 @@ AboutDialog - KeePassX %1 - KeePassX %1 + KeePassX %1 - <b>Current Translation: None</b><br><br> Please replace 'None' with the language of your translation <b>Aktuelle Übersetzung: Deutsch</b><br><br> - <b>Author:</b> %1<br> <b>Autor:</b> %1<br> - $TRANSLATION_AUTHOR Tarek Saidi - $TRANSLATION_AUTHOR_EMAIL Here you can enter your email or homepage if you want. tarek.saidi@arcor.de - - Information on how to translate KeePassX can be found under: -http://keepassx.sourceforge.net/ - - - - Team Team - - Tarek Saidi - - - - Developer, Project Admin Entwickler und Projektadministrator - - tariq@users.berlios.de - - - - - Eugen Gorschenin - - - - Web Designer - - geugen@users.berlios.de - - - - Thanks To Dank An - Matthias Miller - Matthias Miller + Matthias Miller - Patches for better MacOS X support Patches für bessere MacOS X Unterstützung - - www.outofhanwell.com - - - - - James Nicholls - - - - Main Application Icon Anwendungssymbol - - Constantin Makshin - - - - Various fixes and improvements - - dinosaur-rus@users.sourceforge.net - - - - Error Fehler - File '%1' could not be found. Datei '%1' konnte nicht geöffnet werden. - Make sure that the program is installed correctly. Stellen Sie sicher, dass das Programm korrekt installiert wurde. - OK OK - Could not open file '%1' Datei '%1' konnte nicht geöffnet werden. - The following error occured: %1 - Folgender Fehler ist aufgetreten: + Folgender Fehler ist aufgetreten: %1 - - http://keepassx.sf.net + Unofficial + + + + Information on how to translate KeePassX can be found under: + + + + Developer + + + + The following error occured: AboutDlg - About Über - Thanks To Dank An - License Lizenz - Translation Übersetzung - <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">KeePassX</span> - Cross Platform Password Manager</p></body></html> - <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">KeePassX</span> - Cross Platform Password Manager</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">KeePassX</span> - Cross Platform Password Manager</p></body></html> - Copyright (C) 2005 - 2006 Tarek Saidi KeePassX is distributed under the terms of the General Public License (GPL) version 2. @@ -198,183 +136,229 @@ KeePassX steht unter der General Public License (GPL) Version 2. - tarek.saidi@arcor.de tarek.saidi@arcor.de - http://keepass.berlios.de/ http://keepass.berlios.de/ - Credits - http://keepassx.sourceforge.net - keepassx@gmail.com - - Copyright (C) 2005 - 2006 Tarek Saidi + AppName + + + + AppFunc + + + + http://sniperbeamer.fobos.de/keepassx/ + + + + Copyright (C) 2005 - 2007 KeePassX Team KeePassX is distributed under the terms of the -General Public License (GPL) version 2 or later. +General Public License (GPL) version 2. + + + + + AddBookmarkDlg + + Add Bookmark + + + + Title: + Titel: + + + File: + + + + Browse... + Durchsuchen... + + + Edit Bookmark + + + + KeePass Databases (*.kdb) + + + + All Files (*) AutoType - More than one 'Auto-Type:' key sequence found. Allowed is only one per entry. Es wurde mehr als eine 'Auto-Type:'-Zeichenkette gefunden. Erlaubt ist nur eine pro Eintrag. - Syntax Error in Auto-Type sequence near character %1 Found '{' without closing '}' Syntaxfehler in Auto-Type-Zeichenkette bei Zeichen %1 Öffnende Klammer '{' ohne Gegenstück gefunden. - Error - Fehler + Fehler - Syntax Error in Auto-Type sequence near character %1 Found '{' without closing '}' + + Auto-Type string contains illegal characters + + + + + AutoTypeDlg + + KeePassX - Auto-Type + + + + Click on an entry to auto-type it. + + + + Group + + + + Title + Titel + + + Username + Benutzername + + + Cancel + Abbrechen + + + Auto-Type + + CAboutDialog - KeePassX %1 KeePassX %1 - Error Fehler - File '%1' could not be found. Datei '%1' konnte nicht geöffnet werden. - Make sure that the program is installed correctly. Stellen Sie sicher, dass das Programm korrekt installiert wurde. - OK OK - Could not open file '%1' Datei '%1' konnte nicht geöffnet werden. - The following error occured: %1 Folgender Fehler ist aufgetreten: %1 - http://keepass.berlios.de/index.php http://keepass.berlios.de/index.php - <b>Current Translation: None</b><br><br> Please replace 'None' with the language of your translation <b>Aktuelle Übersetzung: Deutsch</b><br><br> - <b>Author:</b> %1<br> <b>Autor:</b> %1<br> - $TRANSALTION_AUTHOR Tarek Saidi - $TRANSLATION_AUTHOR_EMAIL Here you can enter your email or homepage if you want. tarek.saidi@arcor.de - Information on how to translate KeePassX can be found under: http://keepass.berlios.de/translation-howto.html Informationen wie Sie eine Übersetztung für KeePassX erstellen können finden Sie unter: http://keepass.berlios.de/translation-howto.html - Matthias Miller Matthias Miller - http://www.outofhanwell.com/<br>Mac OS X Support http://www.outofhanwell.com/<br>Mac OS X Unterstützung - $TRANSLATION_AUTHOR Tarek Saidi - Information on how to translate KeePassX can be found under: http://keepass.berlios.de/ Informationen über das Erstellen eine Übersetztung für KeePassX sind hier zu finden: http://keepass.berlios.de - Team Team - Developer, Project Admin Entwickler und Projektadministrator - Thanks To Dank An - Patches for better MacOS X support Patches für bessere MacOS X Unterstützung - Main Application Icon Anwendungssymbol @@ -382,47 +366,38 @@ http://keepass.berlios.de CDbSettingsDlg - AES(Rijndael): 256 Bit (default) AES(Rijndael): 256 Bit (Standard) - Twofish: 256 Bit Twofish: 256 Bit - Warning Warnung - Please determine the number of encryption rounds. Bitte geben Sie die Zahl der Verschlüsselungsrunden an. - OK OK - Error Fehler - '%1' is not valid integer value. '%1' ist kein gültiger Ganzzahlwert. - The number of encryption rounds have to be greater than 0. Die Anzahl an Verschlüsselungsrunden muss mindestens Eins betragen. - Settings Einstellungen @@ -430,201 +405,159 @@ http://keepass.berlios.de CEditEntryDlg - Warning Warnung - Password and password repetition are not equal. Please check your input. Passwort und Passwortwiederholung stimmen nicht überein. Bitte prüfen Sie Ihre Eingabe. - OK OK - Save Attachment... Anhang Speichern... - Overwrite? Überschreiben? - A file with this name already exists. Do you want to replace it? Eine Datei mit diesem Namen existiert bereits. Möchten Sie diese ersetzen. - Yes Ja - No Nein - Error Fehler - Could not remove old file. Alte Datei konnte nicht entfernt werden. - Could not create new file. Neue Datei konnte nicht angelegt werden. - Error while writing the file. Beim Schreiben der Datei ist ein Fehler aufgetreten. - Delete Attachment? Anhang löschen? - You are about to delete the attachment of this entry. Are you sure? Sie sind dabei den Dateianhang dieses Eintrages zu löschen. Sind Sie sicher? - No, Cancel Nein, Abbrechen - Edit Entry - Eintrag bearbeiten + Eintrag bearbeiten - Could not open file. Datei konnte nicht geöffnet werden. - %1 Bit - Add Attachment... Anhang hinzufügen... - - Test 2 - - - - The chosen entry has no attachment or it is empty. - Today - 1 Week - 2 Weeks - 3 Weeks - 1 Month - 3 Months - 6 Months - 1 Year - Calendar... + + [Untitled Entry] + + CGenPwDialog - Notice Hinweis - You need to enter at least one character Sie müssen mindestens ein Zeichen angeben. - OK OK - Error Fehler - Could not open '/dev/random' or '/dev/urandom'. '/dev/random' oder '/dev/urandom' konnte nicht geöffnet werden. - Password Generator Passwortgenerator - - Accept - - - - %1 Bits @@ -632,202 +565,170 @@ Sind Sie sicher? CPasswordDialog - OK OK - Error Fehler - Please enter a Password. Bitte geben Sie ein Passwort ein. - Please choose a key file. Bitte wählen Sie eine Schlüsseldatei. - Please enter a Password or select a key file. Bitte geben Sie ein Passwort ein oder wählen Sie eine Schlüsseldatei. - Database Key Datenbankschlüssel - Select a Key File Schlüsseldatei wählen - *.key *.key - Unexpected Error: File does not exist. Unerwarteter Fehler: Datei existiert nicht. - The selected key file or directory does not exist. Die gewählte Schlüsseldatei bzw. das gewählte Verzeichnis existiert nicht. - The given directory does not contain any key files. Das angegebene Verzeichnis enthält keine Schlüsseldatei. - The given directory contains more then one key file. Please specify the key file directly. Das angegebene Verzeichnis enthält mehrere Schlüsseldateien. Bitte geben Sie die gewünschte Schlüsseldatei direkt an. - The key file found in the given directory is not readable. Please check your permissions. Die im angegebenen Verzeichnis gefundene Schlüsseldatei ist nicht lesbar. Bitter prüfen Sie Ihre Zugriffsrechte. - Key file could not be found. Schlüsseldatei konnte nicht gefunden werden. - Key file is not readable. Please check your permissions. Die angegebene Schlüsseldatei ist nicht lesbar. Bitter prüfen Sie Ihre Zugriffsrechte. - Warning Warnung - Password an password repetition are not equal. Please check your input. Passwort und Passwortwiederholung stimmen nicht überein. Bitte prüfen Sie Ihre Eingabe. - Please enter a password or select a key file. Bitte geben Sie ein Passwort ein oder wählen Sie eine Schlüsseldatei. - A file with the name 'pwsafe.key' already exisits in the given directory. Do you want to replace it? Im angegebenen Verzeichnis existiert bereits eine Datei mit dem Namen 'pwsafe.key'. Möchten Sie diese ersetzen? - Yes Ja - No Nein - The exisiting file is not writable. Die exisitierende Datei ist nicht überschreibbar. - A file with the this name already exisits. Do you want to replace it? Eine Datei mit diesem Namen existiert bereits. Möchten Sie diese ersetzen. - The selected key file or directory is not readable. Please check your permissions. Das angegebene Verzeichnis oder die angegebene Schlüsseldatei ist nicht lesbar. Bitter prüfen Sie Ihre Zugriffsrechte. - All Files (*) - Key Files (*.key) - File exists. - A file with the selected name already exists, should this file be used as key file or do you want to overwrite it with a newly generated one? - Use - Overwrite - Cancel Abbrechen - Key file could not be created. %1 + + Last File + + CSearchDlg - Notice Hinweis - Please enter a search string. Bitte geben Sie einen Suchbegriff ein. - OK OK - Search Suchen @@ -835,71 +736,71 @@ Bitter prüfen Sie Ihre Zugriffsrechte. CSelectIconDlg - Delete Löschen - Add Icons... Symbol hinzufügen... - Images (%1) Symbole (%1) - %1: File could not be loaded. - %1: Datei konnte nicht geladen werden. + %1: Datei konnte nicht geladen werden. - Error Fehler - Replace... Ersetzen... - An error occured while loading the icon(s): %1 - Beim Laden der Symbole traten Fehler auf: + Beim Laden der Symbole traten Fehler auf: %1 - An error occured while loading the icon. Beim Laden des Symbols ist ein Fehler aufgetreten. + + Add Custom Icon + + + + Pick + Wählen + + + %1: File could not be loaded. + + + + An error occured while loading the icon(s): + + CSettingsDlg - Settings Einstellungen - Select a directory... Verzeichnis wählen... - - - Error: %1 - - CalendarDialog - Calendar @@ -907,23 +808,19 @@ Bitter prüfen Sie Ihre Zugriffsrechte. CollectEntropyDlg - Entropy Collection - Random Number Generator - Collecting entropy... Please move the mouse and/or press some keys until enought entropy for a reseed of the random number generator is collected. - <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> @@ -934,320 +831,275 @@ p, li { white-space: pre-wrap; } CustomizeDetailViewDialog - Group - Title Titel - Username Benutzername - Password Passwort - Url - Comment Kommentar - Attachment Name - Creation Date - Last Access Date - Last Modification Date - Expiration Date - Time till Expiration - Dialog - Rich Text Editor - Bold - B - Italic - I - Underlined - U - Left-Aligned - L - Centered - C - Right-Aligned - R - Justified - Text Color - Font Size - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 14 - 16 - 18 - 20 - 22 - 24 - 26 - 28 - 36 - 42 - 78 - Templates - T - HTML - - Restore Default - + Cancel + Abbrechen + + + Database - - Save - + Never + Nie + + + DatabaseSettingsDlg - - Cancel - Abbrechen + Database Settings + Datenbankeinstellungen + + + Encryption + Verschlüsselung + + + Algorithm: + Algorithmus: + + + Encryption Rounds: + Verschlüsselungsrunden: DetailViewTemplate - Group - Title Titel - Username Benutzername - Password Passwort - URL URL - Creation Erstellung - Last Access Letzter Zugriff - Last Modification - Expiration - Comment Kommentar @@ -1255,117 +1107,90 @@ p, li { white-space: pre-wrap; } EditEntryDialog - Edit Entry Eintrag bearbeiten - Username: Benutzername: - Password Repet.: Passwort Wdhlg.: - Title: Titel: - URL: URL: - Password: Passwort: - Quality: Qualität: - Comment: Kommentar: - Expires: Läuft ab: - Group: Gruppe: - &Cancel &Abbrechen - Alt+C Alt+A - %1 %1 - Icon: Symbol: - % Bit % Bit - Ge&n. Ge&n. - ... - ... + ... - O&K O&K - Alt+K Alt+K - Never Nie - Attachment: Anhang: - - > - - - - %1 Bit @@ -1373,42 +1198,30 @@ p, li { white-space: pre-wrap; } EditGroupDialog - Group Properties Gruppen-Eigenschaften - Title: Titel: - Icon: Symbol: - &Cancel - Abbre&chen + Abbre&chen - Alt+C - Alt+C + Alt+C - O&K - O&K - - - - Alt+K - + O&K - > @@ -1416,81 +1229,75 @@ p, li { white-space: pre-wrap; } ExpiredEntriesDialog - - Expried Entries of the Database - - - - Expired Entries - Double click on an entry to jump to it. - Group - Title Titel - Username Benutzername - Expired + + Expired Entries in the Database + + Export_KeePassX_Xml - XML Files (*.xml) - All Files (*) + + KeePassX XML File + + Export_Txt - Could not open file (FileError=%1) Datei konnte nicht geöffnet werden. (FileError=%1) - All Files (*) - Text Files (*.txt) + + Text File + + ExporterBase - Import File... - Export Failed @@ -1498,77 +1305,62 @@ p, li { white-space: pre-wrap; } FileErrors - No error occurred. - An error occurred while reading from the file. - An error occurred while writing to the file. - A fatal error occurred. - An resource error occurred. - The file could not be opened. - The operation was aborted. - A timeout occurred. - An unspecified error occurred. - The file could not be removed. - The file could not be renamed. - The position in the file could not be changed. - The file could not be resized. - The file could not be accessed. - The file could not be copied. @@ -1576,142 +1368,114 @@ p, li { white-space: pre-wrap; } GenPwDlg - Alt+U - Alt+N - Alt+M - Alt+L - Password Generator Passwortgenerator - Accep&t Annehmen - &Cancel Abbre&chen - Generate Generieren - New Password: Neues Passwort: - Quality: Qualität: - Options Optionen - &Upper Letters Großbuchstaben: - &Lower Letters Kleinbuchstaben: - &Numbers Zahlen - &Special Characters Sonderzeichen - Minus Minus - U&nderline Unterstrich - h&igher ANSI-Characters höhere ANSI-Zeichen - Use &only following characters: Nur folgende Zeichen benutzen: - Alt+O - Length: Länge: - Use "/dev/rando&m" '/dev/random' benutzen - Use follo&wing character groups: Folgende Zeichengruppen nutzen: - Alt+W - White &Spaces Leerzeichen - Alt+S - Enable entropy collection - Collect only once per session @@ -1719,32 +1483,26 @@ p, li { white-space: pre-wrap; } Import_KWalletXml - XML Files (*.xml) - All Files (*) - Import Failed - Invalid XML data (see stdout for details). Ungültige XML-Daten (siehe stdout für Fehlerbeschreibung). - Invalid XML file. Ungültige XML-Datei. - Document does not contain data. Dokument enthält keine Daten. @@ -1752,28 +1510,23 @@ p, li { white-space: pre-wrap; } Import_KeePassX_Xml - KeePass XML Files (*.xml) - All Files (*) - Import Failed - XML parsing error on line %1 column %2: %3 - Parsing error: File is no valid KeePassX XML file. @@ -1781,62 +1534,50 @@ p, li { white-space: pre-wrap; } Import_PwManager - PwManager Files (*.pwm) - All Files (*) - Import Failed - File is empty. Datei ist leer. - File is no valid PwManager file. Datei ist keine gültige PwManager-Datei. - Unsupported file version. Nicht unterstützte Dateiversion. - Unsupported hash algorithm. Nicht unterstützter Hash-Algorithmus. - Unsupported encryption algorithm. Unbekannter bzw. nicht unterstüzter Verschlüsselungsalgorithmus. - Compressed files are not supported yet. Komprimierte Dateien werden noch nicht unterstützt. - Wrong password. Falsches Passwort. - File is damaged (hash test failed). Datei ist beschädigt (Hash-Test fehlgeschlagen). - Invalid XML data (see stdout for details). Ungültige XML-Daten (siehe stdout für Fehlerbeschreibung). @@ -1844,12 +1585,10 @@ p, li { white-space: pre-wrap; } ImporterBase - Import File... - Import Failed @@ -1857,187 +1596,167 @@ p, li { white-space: pre-wrap; } Kdb3Database - Could not open file. Datei konnte nicht geöffnet werden. - Unexpected file size (DB_TOTAL_SIZE < DB_HEADER_SIZE) Unerwartete Dateigrößen (DB_TOTAL_SIZE < DB_HEADER_SIZE) - Wrong Signature Falsche Signatur - Unsupported File Version. Nicht unterstützte Dateiversion. - Unknown Encryption Algorithm. Unbekannter bzw. nicht unterstüzter Verschlüsselungsalgorithmus. - Decryption failed. The key is wrong or the file is damaged. Entschlüsselung fehlgeschlagen. Der Schlüssel ist falsch oder die Datei ist beschädigt. - Hash test failed. The key is wrong or the file is damaged. Hash-Test fehlgeschlagen. Der Schlüssel ist falsch oder die Datei ist beschädigt. - - Unexpected error: Offset is out of range. [G1] + Invalid group tree. - - Unexpected error: Offset is out of range. [G2] + Key file is empty. - - Unexpected error: Offset is out of range. [E1] + The database must contain at least one group. - - Unexpected error: Offset is out of range. [E2] - + Could not open file for writing. + Datei konnte nicht zum Schreiben geöffnent werden. - - Unexpected error: Offset is out of range. [E3] + Unexpected error: Offset is out of range. + + + Kdb3Database::EntryHandle - - Invalid group tree. + Bytes - - Key file is empty. + KiB - - The database must contain at least one group. + MiB - - Could not open file for writing. - Datei konnte nicht zum Schreiben geöffnent werden. + GiB + KeepassEntryView - Title Titel - Username Benutzername - URL URL - Password Passwort - Comments Kommentar - Expires Läuft ab - Creation Erstellung - Last Change Letzte Änderung - Last Access Letzter Zugriff - Attachment Anhang - %1 items %1 Elemente - Are you sure you want delete this entry? - Are you sure you want delete these %1 entries? - Delete? - Group + + Error + Fehler + + + At least one group must exist before adding an entry. + + + + OK + OK + KeepassGroupView - Search Results Suchergebnisse - Groups - Gruppen + Gruppen - Delete? - Are you sure you want to delete this group, all it's child groups and all their entries? @@ -2045,871 +1764,775 @@ Der Schlüssel ist falsch oder die Datei ist beschädigt. KeepassMainWindow - Ctrl+O - Ctrl+S - Ctrl+G - Ctrl+C - Ctrl+B - Ctrl+U - Ctrl+Y - Ctrl+E - Ctrl+D - Ctrl+K - Ctrl+F - Ctrl+W - Shift+Ctrl+S - Shift+Ctrl+F - Error Fehler - The following error occured while opening the database: %1 - Beim Öffnen der Datenbank ist folgender Fehler aufgetreten: + Beim Öffnen der Datenbank ist folgender Fehler aufgetreten: %1 - OK - OK + OK - Save modified file? Geändete Datei speichern? - The current file was modified. Do you want to save the changes? Die aktuelle Datei wurde verändert. Möchten Sie die Änderungen speichern? - Yes Ja - No Nein - Cancel Abbrechen - <B>Group: </B>%1 <B>Title: </B>%2 <B>Username: </B>%3 <B>URL: </B><a href=%4>%4</a> <B>Password: </B>%5 <B>Creation: </B>%6 <B>Last Change: </B>%7 <B>LastAccess: </B>%8 <B>Expires: </B>%9 <B>Gruppe: </B>%1 <B>Titel: </B>%2 <B>Benutzername: </B>%3 <B>URL: </B><a href=%4>%4</a> <B>Passwort: </B>%5 <B>Erstellung: </B>%6 <B>Letzte Änderung: </B>%7 <B>Letzter Zugriff: </B>%8 <B>Läuft ab: </B>%9 - Clone Entry Eintrag duplizieren - Delete Entry Eintrag löschen - Clone Entries Einträge duplizieren - Delete Entries Einträge löschen - File could not be saved. %1 - Datei konnte nicht gespeichert werden. + Datei konnte nicht gespeichert werden. %1 - Save Database As... Datenbank speichern unter... - Ready Bereit - [new] - [neu] + [neu] - Open Database... Datenbank öffnen... - Loading Database... Lade Datenbank... - Loading Failed Laden fehlgeschlagen - Could not create key file. The following error occured: %1 Datei konnte nicht angelegt werden. Der folgende Fehler trat auf: %1 - Export To... Exportieren nach... - KeePassX [new] KeePassX [neu] - Unknown error in Import_PwManager::importFile()() Unbekannter Fehler in Import_PwManager::importFile()() - Unknown error in Import_KWalletXml::importFile() Unbekannter Fehler in Import_KWalletXml::importFile() - Unknown error in PwDatabase::openDatabase() Unbekannter Fehler in PwDatabase::openDatabase() - Ctrl+V - Show Toolbar Werkzeugleiste anzeigen - KeePassX - KeePassX - - - - %1 - KeePassX - + KeePassX - Unknown error while loading database. - KeePass Databases (*.kdb) - All Files (*) - Save Database... - - KeePassX - [unsaved] - - - - New Database - - expired - - - - 1 Month - %1 Months - - , - - - - 1 Year - %1 Years - 1 Day - %1 Days - less than 1 day - Set Master Key - - * - KeePassX + Locked + + + + Unlocked + + Ctrl+L + + + + Ctrl+Q + + + + The database file does not exist. + + + + new + + + + Expired + + + + Un&lock Workspace + + + + &Lock Workspace + + + + The following error occured while opening the database: + + + + File could not be saved. + + + + + Main + + Error + Fehler + + + File '%1' could not be found. + Datei '%1' konnte nicht geöffnet werden. + + + OK + OK + MainWindow - KeePassX KeePassX - File Datei - Import from... Importieren aus... - View Ansicht - Columns Spalten - Extras Extras - Help Hilfe - New Database... Neue Datenbank... - Open Database... Datenbank öffnen... - Close Database Datenbank schließen - Save Database Datenbank speichern - Save Database As... Datenbank speichern unter... - Database Settings... Datenbankeinstellungen... - Change Master Key... Hauptschlüssel ändern... - Exit Beenden - PwManager File (*.pwm) PwManager-Datei (*.pwm) - KWallet XML-File (*.xml) KWallet XML-Datei (*.xml) - Add New Group... Neu Gruppe hinzufügen... - Edit Group... Gruppe bearbeiten... - Delete Group Gruppe löschen - Copy Password to Clipboard Passwort in Zwischenablage kopieren - Copy Username to Clipboard Benutzername in Zwischenablage kopieren - Open URL URL öffnen - Save Attachment As... Anhang speichern unter... - Add New Entry... Neuen Eintrag hinzufügen... - View/Edit Entry... Eintrag anzeigen/bearbeiten... - Delete Entry Eintrag löschen - Clone Entry Eintrag duplizieren - Search In Database... - In Datenbank suchen... + In Datenbank suchen... - Search in this group... - In dieser Gruppe suchen... + In dieser Gruppe suchen... - Show Toolbar Werkzeugleiste anzeigen - Show Entry Details Eintragsdetails anzeigen - Hide Usernames Benutzernamen verbergen - Hide Passwords Passwörter verbergen - Title Titel - Username Benutzername - URL URL - Password Passwort - Comment Kommentar - Expires Läuft ab - Creation Erstellung - Last Change Letzte Änderung - Last Access Letzter Zugriff - Attachment Anhang - Settings... Einstellungen... - About... Über... - Edit Bearbeiten - Show Statusbar Statusleiste anzeigen - Export to... Exportieren nach... - KeePassX Handbook... KeePassX Handbuch... - Plain Text (*.txt) Klartext (*.txt) - Hide Verbergen - Perform AutoType AutoType ausführen - Type Here Type Here - Toolbar Icon Size Symbolleistengröße - 16x16 - 22x22 - 28x28 - &View Ansicht - &File &Datei - &Import from... &Importieren aus... - &Export to... &Exportieren nach... - &Edit &Bearbeiten - E&xtras E&xtras - &Help &Hilfe - &New Database... &Neue Datenbank... - &Open Database... Datenbank &öffnen... - &Close Database Datenbank s&chließen - &Save Database Datenbank &speichern - Save Database &As... D&atenbank speichern unter... - &Database Settings... &Datenbankeinstellungen... - Change &Master Key... Hauptschlüssel &ändern... - E&xit - Beend&en + Beend&en - &Settings... Ein&stellungen... - &About... &Über... - &KeePassX Handbook... &KeePassX Handbuch... - Standard KeePass Single User Database (*.kdb) - Advanced KeePassX Database (*.kxdb) - Password Generator... - Group (search results only) - Show Expired Entries... - - Show Expired Entries + Recycle Bin... - - Recycle Bin... + Groups + Gruppen + + + Bookmarks - - Lock Workspace + Manage Bookmarks... + + + + &Lock Workspace + + + + Q&uit + + + + Search in Database... + + + + Search in this Group... + + + + Add Bookmark... + + + + Bookmark this Database... - PasswordDlg + ManageBookmarksDlg - - TextLabel - + Manage Bookmarks + + + + PasswordDlg - OK - OK + OK - ... ... - Cancel - Abbrechen + Abbrechen - Enter a Password and/or choose a key file. Geben Sie ein Passwort ein oder wählen Sie eine Schlüsseldatei. - Key Schlüssel - Password: Passwort: - Key file or directory: Schlüsseldatei oder Datenträger: - &Browse... Durchsuchen... - Alt+B - Use Password AND Key File Passwort UND Schlüsseldatei verwenden - Exit - Beenden + Beenden - Password Repet.: Passwort Wdhlg.: + + Last File + + PwDatabase - Unknown Error Unbekannter Fehler - Unexpected file size (DB_TOTAL_SIZE < DB_HEADER_SIZE) Unerwartete Dateigrößen (DB_TOTAL_SIZE < DB_HEADER_SIZE) - Wrong Signature Falsche Signatur - AES-Init Failed AES Initialisierung fehlgeschlagen - Hash test failed. The key is wrong or the file is damaged. Hash-Test fehlgeschlagen. Der Schlüssel ist falsch oder die Datei ist beschädigt. - Could not open key file. Schlüsseldatei konnte nicht geöffnet werden. - Key file could not be written. Schlüsseldatei konnte nicht geschrieben werden. - Could not open file. Datei konnte nicht geöffnet werden. - Could not open file for writing. Datei konnte nicht zum Schreiben geöffnent werden. - Unsupported File Version. Nicht unterstützte Dateiversion. - Unknown Encryption Algorithm. Unbekannter bzw. nicht unterstüzter Verschlüsselungsalgorithmus. - Decryption failed. The key is wrong or the file is damaged. Entschlüsselung fehlgeschlagen. @@ -2919,133 +2542,100 @@ Der Schlüssel ist falsch oder die Datei ist beschädigt. QObject - Warning Warnung - Could not save configuration file. Make sure you have write access to '~/.keepass'. Konfigurationsdatei konnte nicht gespeichert werden. Stellen Sie sicher, dass Sie Schreibzugriff auf '~/.keepass' haben. - OK - OK + OK - File '%1' could not be found. - Datei '%1' konnte nicht geöffnet werden. + Datei '%1' konnte nicht geöffnet werden. - File not found. Datei nicht gefunden. - Could not open file. Datei konnte nicht geöffnet werden. - File is no valid PwManager file. Datei ist keine gültige PwManager-Datei. - Unsupported file version. Nicht unterstützte Dateiversion. - Unsupported hash algorithm. Nicht unterstützter Hash-Algorithmus. - Unsupported encryption algorithm. Unbekannter bzw. nicht unterstüzter Verschlüsselungsalgorithmus. - Compressed files are not supported yet. Komprimierte Dateien werden noch nicht unterstützt. - Wrong password. Falsches Passwort. - File is damaged (hash test failed). Datei ist beschädigt (Hash-Test fehlgeschlagen). - Invalid XML data (see stdout for details). Ungültige XML-Daten (siehe stdout für Fehlerbeschreibung). - File is empty. Datei ist leer. - Invalid XML file (see stdout for details). Ungültige XML-Daten (siehe stdout für Fehlerbeschreibung). - Invalid XML file. Ungültige XML-Datei. - Document does not contain data. Dokument enthält keine Daten. - Error - Fehler + Fehler - Warning: Warnung: - Invalid RGB color value. Ungültiger RGB-Farbwert. - Never - Nie - - - - Initialization failed. - - - - - Could not locate library file. - + Nie SearchDialog - Search Suchen @@ -3053,117 +2643,90 @@ Stellen Sie sicher, dass Sie Schreibzugriff auf '~/.keepass' haben. Search_Dlg - Alt+T - Alt+U - A&nhang - Alt+N - Alt+W - Alt+C - Search... Suche... - Search For: Suche nach: - Regular E&xpression regulärer Ausdruck - Alt+X - &Case Sensitive Groß- und Kleinschreibung beachten - Include: Einbeziehen: - &Titles Titel - &Usernames Benutzernamen - C&omments Kommentare - Alt+O - U&RLs URLs - Alt+R - Pass&words Passwörter - Search - Suchen + Suchen - Clo&se - Schließen - - - - Alt+S - + Schließen - Include Subgroups (recursive) Untergruppen einbeziehen (rekursiv) @@ -3171,378 +2734,347 @@ Stellen Sie sicher, dass Sie Schreibzugriff auf '~/.keepass' haben. SelectIconDlg - Icon Selection Symbolauswahl - Add Custom Icon... - Eigenes Symbol hinzufügen... + Eigenes Symbol hinzufügen... - Pick - Wählen + Wählen - Cancel - Abbrechen + Abbrechen SettingsDialog - Alt+Ö - O&K O&K - Settings Einstellungen - &Cancel Abbrechen - Clear clipboard after: Zwischenablage löschen nach: - Seconds Sekunden - Sh&ow passwords in plain text by default Passwort standardmäßig im Klartext anzeigen - Alt+O - Appea&rance Erscheinungsbild - Banner Color Bannerfarbe - Text Color: Textfarbe - Change... Ändern... - Color 2: Farbe 2: - C&hange... Ändern... - Alt+H - Color 1: Farbe 1: - Expand group tree when opening a database Gruppenbaum beim Öffnen aufklappen - &Other Sonstiges - Remember last opend file Zuletzt geöffnete Datei beim Starten öffnen - Browser Command: Browser Befehl: - Securi&ty Sicherheit - Alternating Row Colors Abwechselnde Zeilenfarben - Browse... Durchsuchen... - Remember last key type and location Art und Ort des Schlüssels der letzten Datenbank merken - Mounting Root: Datenträgerwurzelverzeichnis: - Remember last opened file Zuletzt geöffnete Datei merken - The integration plugins provide features like usage of the native file dialogs and message boxes of the particular desktop environments. - General - Show system tray icon - Minimize to tray when clicking the main window's close button - Save recent directories of file dialogs - Group tree at start-up: - Restore last state - Expand all items - Do not expand any item - Security - Show passwords in plain text in: - Edit Entry Dialog - Key Dialogs - Desktop Integration - Plug-Ins - None - Gnome Desktop Integration (Gtk 2.x) - KDE 4 Desktop Integration - You need to restart the program before the changes take effect. - Configure... - Advanced - Clear History Now - Always ask before deleting entries or groups - - Unified Title and Toolbar - - - - Customize Entry Detail View... - Features - You can disable several features of KeePassX here according to your needs in order to keep the user interface slim. - Bookmarks - Auto-Type Fine Tuning - Time between the activation of an auto-type action by the user and the first simulated key stroke. - ms - Pre-Gap: - Key Stroke Delay: - Delay between two simulated key strokes. Increase this if Auto-Type is randomly skipping characters. - The directory where storage devices like CDs and memory sticks are normally mounted. - Media Root: - System Default - Enable this if you want to use your bookmarks and the last opened file independet from their absolute paths. This is especially useful when using KeePassX portably and therefore with changing mount points in the file system. - Save relative paths (bookmarks and last file) + + Minimize to tray instead of taskbar + + + + Start minimized + + + + Start locked + + + + Lock workspace when minimizing the main window + + + + Global Auto-Type Shortcut: + + + + Use entry titles to match the window for Global Auto-Type + + + + + ShortcutWidget + + Ctrl + + + + Shift + + + + Alt + + + + AltGr + + + + Win + + SimplePasswordDialog - O&K O&K - ... - ... + ... - Enter your Password - Password: Passwort: - &Cancel Abbrechen @@ -3550,46 +3082,38 @@ Stellen Sie sicher, dass Sie Schreibzugriff auf '~/.keepass' haben. StandardDatabase - Could not open file. Datei konnte nicht geöffnet werden. - Unexpected file size (DB_TOTAL_SIZE < DB_HEADER_SIZE) Unerwartete Dateigrößen (DB_TOTAL_SIZE < DB_HEADER_SIZE) - Wrong Signature Falsche Signatur - Unsupported File Version. Nicht unterstützte Dateiversion. - Unknown Encryption Algorithm. Unbekannter bzw. nicht unterstüzter Verschlüsselungsalgorithmus. - Decryption failed. The key is wrong or the file is damaged. Entschlüsselung fehlgeschlagen. Der Schlüssel ist falsch oder die Datei ist beschädigt. - Hash test failed. The key is wrong or the file is damaged. Hash-Test fehlgeschlagen. Der Schlüssel ist falsch oder die Datei ist beschädigt. - Could not open file for writing. Datei konnte nicht zum Schreiben geöffnent werden. @@ -3597,92 +3121,65 @@ Der Schlüssel ist falsch oder die Datei ist beschädigt. TrashCanDialog - - Recycle Bin - - - - - Double click on an entry to restore it. - - - - - Group - - - - Title - Titel + Titel - Username - Benutzername + Benutzername + + + WorkspaceLockedWidget - - Expired + Form - - Empty Recycle Bin + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Verdana'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">The workspace is locked.</span></p></body></html> - - Close + Unlock + + Close Database + Datenbank schließen + dbsettingdlg_base - Database Settings - Datenbankeinstellungen + Datenbankeinstellungen - Encryption - Verschlüsselung + Verschlüsselung - Algorithm: - Algorithmus: + Algorithmus: - ? ? - Encryption Rounds: - Verschlüsselungsrunden: + Verschlüsselungsrunden: - O&K - O&K - - - - Ctrl+K - + O&K - &Cancel - Abbrechen - - - - Ctrl+C - + Abbrechen diff --git a/src/translations/keepass-es_ES.ts b/src/translations/keepass-es_ES.ts index 28c403d..d6a46fc 100644 --- a/src/translations/keepass-es_ES.ts +++ b/src/translations/keepass-es_ES.ts @@ -1,9 +1,7 @@ - - + - Could not open file (FileError=%1) No se pudo abrir el archivo (FileError=%1) @@ -11,301 +9,291 @@ AboutDialog - KeePassX %1 - KeePassX %1 + KeePassX %1 - <b>Current Translation: None</b><br><br> Please replace 'None' with the language of your translation <b>Traducción actual: Español</b><br><br> - <b>Author:</b> %1<br> <b>Autor:</b> %1<br> - $TRANSLATION_AUTHOR - $TRANSLATION_AUTHOR_EMAIL Here you can enter your email or homepage if you want. jarfil@jarfil.net - - Information on how to translate KeePassX can be found under: -http://keepassx.sourceforge.net/ - - - - Team - - Tarek Saidi - - - - Developer, Project Admin - - tariq@users.berlios.de - - - - - Eugen Gorschenin - - - - Web Designer - - geugen@users.berlios.de - - - - Thanks To Agradecimientos - - Matthias Miller - - - - Patches for better MacOS X support - - www.outofhanwell.com - - - - - James Nicholls - - - - Main Application Icon - - Constantin Makshin - - - - Various fixes and improvements - - dinosaur-rus@users.sourceforge.net - - - - Error Error - File '%1' could not be found. Archivo '%1' no encontrado. - Make sure that the program is installed correctly. Asegúrese de que el programa está instalado correctamente. - OK - Could not open file '%1' No se pudo abrir fichero '%1' - The following error occured: %1 - Ha ocurrido el siguiente error: + Ha ocurrido el siguiente error: %1 - - http://keepassx.sf.net + Unofficial + + + + Developer + + + + Information on how to translate KeePassX can be found under: + + + + The following error occured: AboutDlg - About Acerca de - Thanks To Agradecimientos - License Licencia - Translation Traducción - - <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">KeePassX</span> - Cross Platform Password Manager</p></body></html> - - - - Credits - http://keepassx.sourceforge.net - keepassx@gmail.com - - Copyright (C) 2005 - 2006 Tarek Saidi + AppName + + + + AppFunc + + + + http://sniperbeamer.fobos.de/keepassx/ + + + + Copyright (C) 2005 - 2007 KeePassX Team KeePassX is distributed under the terms of the -General Public License (GPL) version 2 or later. +General Public License (GPL) version 2. + + + + + AddBookmarkDlg + + Add Bookmark + + + + Title: + Título: + + + File: + + + + Browse... + Navegar... + + + Edit Bookmark + + + + KeePass Databases (*.kdb) + + + + All Files (*) AutoType - More than one 'Auto-Type:' key sequence found. Allowed is only one per entry. - Error - Error + Error - Syntax Error in Auto-Type sequence near character %1 Found '{' without closing '}' + + Auto-Type string contains illegal characters + + + + + AutoTypeDlg + + KeePassX - Auto-Type + + + + Click on an entry to auto-type it. + + + + Group + + + + Title + Título + + + Username + Usuario + + + Cancel + Cancelar + + + Auto-Type + + CAboutDialog - KeePassX %1 KeePassX %1 - Error Error - File '%1' could not be found. Archivo '%1' no encontrado. - Make sure that the program is installed correctly. Asegúrese de que el programa está instalado correctamente. - OK OK - Could not open file '%1' No se pudo abrir fichero '%1' - The following error occured: %1 Ha ocurrido el siguiente error: %1 - http://keepass.berlios.de/index.php http://keepass.berlios.de/index.php - <b>Current Translation: None</b><br><br> Please replace 'None' with the language of your translation <b>Traducción actual: Español</b><br><br> - <b>Author:</b> %1<br> <b>Autor:</b> %1<br> - $TRANSALTION_AUTHOR Jaroslaw Filiochowski - $TRANSLATION_AUTHOR_EMAIL Here you can enter your email or homepage if you want. jarfil@jarfil.net - Information on how to translate KeePassX can be found under: http://keepass.berlios.de/translation-howto.html Puede encontrar información sobre cómo traducir KeePassX en esta dirección: http://keepass.berlios.de/translation-howto.html - Thanks To Agradecimientos @@ -313,47 +301,38 @@ http://keepass.berlios.de/translation-howto.html CDbSettingsDlg - AES(Rijndael): 256 Bit (default) AES(Rijndael): 256 Bits (por defecto) - Twofish: 256 Bit Twofish: 256 Bits - Warning Aviso - Please determine the number of encryption rounds. Defina el número de iteraciones de cifrado. - OK Aceptar - Error Error - '%1' is not valid integer value. '%1' no es un valor entero válido. - The number of encryption rounds have to be greater than 0. El númer de iteraciones de cifrado debe ser mayor que 0. - Settings Preferencias @@ -361,201 +340,159 @@ http://keepass.berlios.de/translation-howto.html CEditEntryDlg - Warning Aviso - Password and password repetition are not equal. Please check your input. Las contraseñas no coinciden. Compruebe que las ha introducido correctamente. - OK Aceptar - Save Attachment... Guardar Adjunto... - Overwrite? Sobreescribir? - A file with this name already exists. Do you want to replace it? Ya existe un archivo con este nombre. ¿Desea reemplazarlo? - Yes - No No - Error Error - Could not remove old file. No se pudo eliminar el archivo anterior. - Could not create new file. No se pudo crear el nuevo archivo. - Error while writing the file. Error al escribir el archivo. - Delete Attachment? Eliminar Adjunto? - You are about to delete the attachment of this entry. Are you sure? Está a punto de eliminar el adjunto de esta entrada. ¿Está seguro? - No, Cancel No, Cancelar - Edit Entry - Editar Entrada + Editar Entrada - Could not open file. No se pudo abrir el archivo. - %1 Bit - Add Attachment... - - Test 2 - - - - The chosen entry has no attachment or it is empty. - Today - 1 Week - 2 Weeks - 3 Weeks - 1 Month - 3 Months - 6 Months - 1 Year - Calendar... + + [Untitled Entry] + + CGenPwDialog - Notice Notificación - You need to enter at least one character Debe introducir al menos un carácter - OK Aceptar - Error Error - Could not open '/dev/random' or '/dev/urandom'. No se pudo abrir '/dev/random' o '/dev/urandom'. - Password Generator Generador de Contraseña - - Accept - - - - %1 Bits @@ -563,199 +500,167 @@ Are you sure? CPasswordDialog - OK Aceptar - Error Error - Please enter a Password. Introduzca una Contraseña. - Please choose a key file. Seleccione un archivo de clave. - Please enter a Password or select a key file. Introduzca una Contraseña o seleccione un archivo de clave. - Database Key Contraseña de la Base de Datos - Select a Key File Seleccione un Archivo de Clave - *.key *.key - Unexpected Error: File does not exist. Error Inesperado: Archivo no existe. - The selected key file or directory does not exist. El archivo de clave seleccionado o el directorio no existen. - The given directory does not contain any key files. El directorio no contiene ningún archivo de clave. - The given directory contains more then one key file. Please specify the key file directly. El directorio contiene más de un archivo de clave. Especifique un archivo de clave concreto. - The key file found in the given directory is not readable. Please check your permissions. El archivo de clave encontrado en el directorio no se puede leer. Compruebe sus permisos de acceso. - Key file could not be found. Archivo de clave no encontrado. - Key file is not readable. Please check your permissions. Archivo de clave no se puede leer. Compruebe sus permisos de acceso. - Warning Advertencia - Password an password repetition are not equal. Please check your input. Las contraseñas no coinciden. Compruebe que las ha introducido correctamente. - Please enter a password or select a key file. Introduzca una contraseña o seleccione un archivo de clave. - A file with the name 'pwsafe.key' already exisits in the given directory. Do you want to replace it? El archivo 'pwsafe.key' ya existe en el directorio. ¿Desea reemplazarlo? - Yes - No No - The exisiting file is not writable. El archivo existente no se puede escribir. - A file with the this name already exisits. Do you want to replace it? Existe un archivo con ese nombre. ¿Desea reemplazarlo? - The selected key file or directory is not readable. Please check your permissions. - All Files (*) - Key Files (*.key) - File exists. - A file with the selected name already exists, should this file be used as key file or do you want to overwrite it with a newly generated one? - Use - Overwrite - Cancel Cancelar - Key file could not be created. %1 + + Last File + + CSearchDlg - Notice Aviso - Please enter a search string. Introduzca una cadena de búsqueda. - OK Aceptar - Search Buscar @@ -763,70 +668,60 @@ Please check your permissions. CSelectIconDlg - Delete - Add Icons... - Images (%1) - - %1: File could not be loaded. - - - - - Error Error - Replace... - - An error occured while loading the icon(s): -%1 + An error occured while loading the icon. - - An error occured while loading the icon. + Add Custom Icon + + + + Pick + + + + %1: File could not be loaded. + + + + An error occured while loading the icon(s): CSettingsDlg - Settings Preferencias - Select a directory... Seleccione un directorio... - - - Error: %1 - - CalendarDialog - Calendar @@ -834,23 +729,19 @@ Please check your permissions. CollectEntropyDlg - Entropy Collection - Random Number Generator - Collecting entropy... Please move the mouse and/or press some keys until enought entropy for a reseed of the random number generator is collected. - <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> @@ -861,320 +752,275 @@ p, li { white-space: pre-wrap; } CustomizeDetailViewDialog - Group - Title Título - Username Usuario - Password Contraseña - Url - Comment Comentario - Attachment Name - Creation Date - Last Access Date - Last Modification Date - Expiration Date - Time till Expiration - Dialog - Rich Text Editor - Bold - B - Italic - I - Underlined - U - Left-Aligned - L - Centered - C - Right-Aligned - R - Justified - Text Color - Font Size - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 14 - 16 - 18 - 20 - 22 - 24 - 26 - 28 - 36 - 42 - 78 - Templates - T - HTML - - Restore Default - + Cancel + Cancelar + + + + Database + + Never + Nunca + + + DatabaseSettingsDlg - - Save - + Database Settings + Preferencias de Base de Datos - - Cancel - Cancelar + Encryption + Cifrado + + + Algorithm: + Algoritmo: + + + Encryption Rounds: + Iteraciones de Cifrado: DetailViewTemplate - Group - Title Título - Username Usuario - Password Contraseña - URL URL - Creation Creación - Last Access Último Acceso - Last Modification - Expiration - Comment Comentario @@ -1182,117 +1028,90 @@ p, li { white-space: pre-wrap; } EditEntryDialog - Edit Entry Editar Entrada - Username: Usuario: - Password Repet.: Contraseña (repetida): - Title: Título: - URL: URL: - Password: Contraseña: - Quality: Calidad: - Comment: Comentario: - Expires: Expira: - Group: Grupo: - &Cancel &Cancelar - Alt+C Alt+C - %1 %1 - Icon: Icono: - % Bit % Bits - Ge&n. Ge&n. - ... - ... + ... - O&K &Aceptar - Alt+K Alt+A - Never Nunca - Attachment: Adjunto: - - > - - - - %1 Bit @@ -1300,42 +1119,34 @@ p, li { white-space: pre-wrap; } EditGroupDialog - Group Properties Propiedades del Grupo - Title: Título: - Icon: Icono: - &Cancel - &Cancelar + &Cancelar - Alt+C - Alt+C + Alt+C - O&K - &Aceptar + &Aceptar - Alt+K - Alt+A + Alt+A - > @@ -1343,81 +1154,75 @@ p, li { white-space: pre-wrap; } ExpiredEntriesDialog - - Expried Entries of the Database - - - - Expired Entries - Double click on an entry to jump to it. - Group - Title Título - Username Usuario - Expired + + Expired Entries in the Database + + Export_KeePassX_Xml - XML Files (*.xml) - All Files (*) + + KeePassX XML File + + Export_Txt - Could not open file (FileError=%1) No se pudo abrir el archivo (FileError=%1) - All Files (*) - Text Files (*.txt) + + Text File + + ExporterBase - Import File... - Export Failed @@ -1425,77 +1230,62 @@ p, li { white-space: pre-wrap; } FileErrors - No error occurred. - An error occurred while reading from the file. - An error occurred while writing to the file. - A fatal error occurred. - An resource error occurred. - The file could not be opened. - The operation was aborted. - A timeout occurred. - An unspecified error occurred. - The file could not be removed. - The file could not be renamed. - The position in the file could not be changed. - The file could not be resized. - The file could not be accessed. - The file could not be copied. @@ -1503,142 +1293,114 @@ p, li { white-space: pre-wrap; } GenPwDlg - Alt+U Alt+U - Alt+N Alt+N - Alt+M Alt+M - Alt+L Alt+L - Password Generator Generador de Contraseña - Accep&t &Aceptar - &Cancel &Cancelar - Generate Generar - New Password: Nueva Contraseña: - Quality: Calidad: - Options Opciones - &Upper Letters Mayúsc&ulas - &Lower Letters Minúscu&las - &Numbers &Números - &Special Characters Carácteres E&speciales - Minus Guión - U&nderline S&ubrayado - Alt+H Alt+M - Use &only following characters: Usar sól&o carácteres siguientes: - Alt+O Alt+O - Length: Longitud: - Use "/dev/rando&m" Usar "/dev/rando&m" - Use follo&wing character groups: Usar &grupos de carácteres siguientes: - Alt+W Alt+G - White &Spaces E&spacios - Alt+S Alt+S - Enable entropy collection - Collect only once per session @@ -1646,32 +1408,26 @@ p, li { white-space: pre-wrap; } Import_KWalletXml - XML Files (*.xml) - All Files (*) - Import Failed - Invalid XML data (see stdout for details). Datos XML no válidos (ver stdout para más detalles). - Invalid XML file. Archivo XML no válido. - Document does not contain data. El documento no contiene datos. @@ -1679,28 +1435,23 @@ p, li { white-space: pre-wrap; } Import_KeePassX_Xml - KeePass XML Files (*.xml) - All Files (*) - Import Failed - XML parsing error on line %1 column %2: %3 - Parsing error: File is no valid KeePassX XML file. @@ -1708,62 +1459,50 @@ p, li { white-space: pre-wrap; } Import_PwManager - PwManager Files (*.pwm) - All Files (*) - Import Failed - File is empty. Archivo vacío. - File is no valid PwManager file. El archivo no es un archivo PwManager válido. - Unsupported file version. Version de archivo no soportada. - Unsupported hash algorithm. Algoritmo hash no soportado. - Unsupported encryption algorithm. Algoritmo de cifrado no soportado. - Compressed files are not supported yet. Los archivos comprimidos todavía no están soportados. - Wrong password. Contraseña incorrecta. - File is damaged (hash test failed). El archivo está dañado (comprobación hash fallida). - Invalid XML data (see stdout for details). Datos XML no válidos (ver stdout para más detalles). @@ -1771,12 +1510,10 @@ p, li { white-space: pre-wrap; } ImporterBase - Import File... - Import Failed @@ -1784,186 +1521,166 @@ p, li { white-space: pre-wrap; } Kdb3Database - Could not open file. No se pudo abrir el archivo. - Unexpected file size (DB_TOTAL_SIZE < DB_HEADER_SIZE) Tamaño de fichero inesperado (DB_TOTAL_SIZE < DB_HEADER_SIZE) - Wrong Signature Firma Incorrecta - Unsupported File Version. - Unknown Encryption Algorithm. - Decryption failed. The key is wrong or the file is damaged. - Hash test failed. The key is wrong or the file is damaged. Comprobación hash fallida. La clave es incorecta o el fichero está dañado. - - Unexpected error: Offset is out of range. [G1] + Invalid group tree. - - Unexpected error: Offset is out of range. [G2] + Key file is empty. - - Unexpected error: Offset is out of range. [E1] + The database must contain at least one group. - - Unexpected error: Offset is out of range. [E2] + Could not open file for writing. - - Unexpected error: Offset is out of range. [E3] + Unexpected error: Offset is out of range. + + + Kdb3Database::EntryHandle - - Invalid group tree. + Bytes - - Key file is empty. + KiB - - The database must contain at least one group. + MiB - - Could not open file for writing. + GiB KeepassEntryView - Title Título - Username Usuario - URL URL - Password Contraseña - Comments Comentarios - Expires Expira - Creation Creación - Last Change Último Cambio - Last Access Último Acceso - Attachment Adjunto - %1 items %1 elementos - Are you sure you want delete this entry? - Are you sure you want delete these %1 entries? - Delete? - Group + + Error + Error + + + At least one group must exist before adding an entry. + + + + OK + + KeepassGroupView - Search Results Resultados de Búsqueda - Groups - Grupos + Grupos - Delete? - Are you sure you want to delete this group, all it's child groups and all their entries? @@ -1971,836 +1688,743 @@ La clave es incorecta o el fichero está dañado. KeepassMainWindow - Ctrl+O - Ctrl+S - Ctrl+G - Ctrl+C Ctrl+C - Ctrl+B - Ctrl+U - Ctrl+Y - Ctrl+E - Ctrl+D - Ctrl+K Ctrl+A - Ctrl+F - Ctrl+W - Shift+Ctrl+S - Shift+Ctrl+F - Error Error - The following error occured while opening the database: %1 - Ocurrió el siguiente error al intentar abrir la base de datos: + Ocurrió el siguiente error al intentar abrir la base de datos: %1 - OK - Aceptar + Aceptar - Save modified file? ¿Guardar archivo modificado? - The current file was modified. Do you want to save the changes? El archivo actual ha sido modificado. ¿Desea guardar los cambios? - Yes - No No - Cancel Cancelar - <B>Group: </B>%1 <B>Title: </B>%2 <B>Username: </B>%3 <B>URL: </B><a href=%4>%4</a> <B>Password: </B>%5 <B>Creation: </B>%6 <B>Last Change: </B>%7 <B>LastAccess: </B>%8 <B>Expires: </B>%9 <b>Grupo: </b>%1 <b>Título: </b>%2 <b>Usuario: </b>%3 <b>URL: </b><a href="%4">%4</a> <b>Contraseña: </b>%5 <b>Creación: </b>%6 <b>Último Cambio: </b>%7 <b>Último Acceso: </b>%8 <b>Expira: </b>%9 - Clone Entry Duplicar Entrada - Delete Entry Eliminar Entrada - Clone Entries Duplicar Entradas - Delete Entries Eliminar Entradas - File could not be saved. %1 - Archivo no ha podido ser guardado. + Archivo no ha podido ser guardado. %1 - Save Database As... Guardar Base de Datos Como... - Ready Listo - [new] - [nuevo] + [nuevo] - Open Database... Abrir Base de Datos... - Loading Database... Cargando Base de Datos... - Loading Failed Carga Fallida - Could not create key file. The following error occured: %1 No se ha podido crear archivo de clave. Ha ocurrido el siguiente error: %1 - Export To... Exportar A... - KeePassX [new] KeePassX [nuevo] - Unknown error in Import_PwManager::importFile()() Error desconocido en Import_PwManager::importFile()() - Unknown error in Import_KWalletXml::importFile() Error desconocido en Import_KWalletXml::importFile() - Ctrl+V - Show Toolbar Mostrar Barra de herramientas - KeePassX - KeePassX - - - - %1 - KeePassX - + KeePassX - Unknown error while loading database. - KeePass Databases (*.kdb) - All Files (*) - Save Database... - - KeePassX - [unsaved] - - - - New Database - - expired - - - - 1 Month - %1 Months - - , - - - - 1 Year - %1 Years - 1 Day - %1 Days - less than 1 day - Set Master Key - - * - KeePassX + Locked + + + + Unlocked + + + + Ctrl+L + + + + Ctrl+Q + + + + The database file does not exist. + + + + new + + + + Expired + + + + Un&lock Workspace + + + + &Lock Workspace + + + + The following error occured while opening the database: + + + + File could not be saved. + + + + + Main + + Error + Error + + + File '%1' could not be found. + Archivo '%1' no encontrado. + + + OK MainWindow - KeePassX KeePassX - File Archivo - Import from... Importar desde... - View Ver - Columns Columnas - Extras Preferencias - Help Ayuda - New Database... Nueva Base de Datos... - Open Database... Abrir Base de Datos... - Close Database Cerrar Base de Datos - Save Database Guardar Base de Datos - Save Database As... Guardar Base de Datos Como... - Database Settings... Preferencias de Base de Datos... - Change Master Key... Cambiar Clave Maestra... - Exit Salir - PwManager File (*.pwm) PwManager (*.pwm) - KWallet XML-File (*.xml) KWallet, archivo XML (*.xml) - Add New Group... Añadir Nuevo Grupo... - Edit Group... Editar Grupo... - Delete Group Eliminar Grupo - Copy Password to Clipboard Copiar Contraseña al Portapapeles - Copy Username to Clipboard Copiar Usuario al Portapapeles - Open URL Abrir URL - Save Attachment As... Guardar Adjunto Como... - Add New Entry... Añadir Nueva Entrada... - View/Edit Entry... Ver/Editar Entrada... - Delete Entry Eliminar Entrada - Clone Entry Duplicar Entrada - Search In Database... - Buscar en Base de Datos... + Buscar en Base de Datos... - Search in this group... - Buscar en este grupo... + Buscar en este grupo... - Show Toolbar Mostrar Barra de herramientas - Show Entry Details Mostrar Detalles de Entradas - Hide Usernames Ocultar Usuarios - Hide Passwords Ocultar Contraseñas - Title Título - Username Usuario - URL URL - Password Contraseña - Comment Comentario - Expires Expira - Creation Creación - Last Change Último Cambio - Last Access Último Acceso - Attachment Adjunto - Settings... Preferencias... - About... Acerca de... - Edit Editar - Show Statusbar Mostrar Barra de estado - Export to... Exportar a... - KeePassX Handbook... Manual de KeePassX... - Plain Text (*.txt) Texto Plano (*.txt) - Hide - Perform AutoType - Toolbar Icon Size - 16x16 - 22x22 - 28x28 - &View - &File - &Import from... - &Export to... - &Edit - E&xtras - &Help - &Open Database... - &Close Database - &Save Database - Save Database &As... - &Database Settings... - Change &Master Key... - - E&xit - - - - &Settings... - &About... - &KeePassX Handbook... - Standard KeePass Single User Database (*.kdb) - Advanced KeePassX Database (*.kxdb) - Password Generator... - Group (search results only) - Show Expired Entries... - - Show Expired Entries + Recycle Bin... - - Recycle Bin... + Groups + Grupos + + + Bookmarks + + + + Manage Bookmarks... + + + + &Lock Workspace + + + + Q&uit + + + + Search in Database... + + + + Search in this Group... - - Lock Workspace + Add Bookmark... + + + + Bookmark this Database... - PasswordDlg + ManageBookmarksDlg - - TextLabel + Manage Bookmarks + + + PasswordDlg - OK - Aceptar + Aceptar - ... ... - Cancel - Cancelar + Cancelar - Enter a Password and/or choose a key file. Introduzca una Contraseña y/o seleccione un archivo de clave. - Key Clave - Password: Contraseña: - Key file or directory: Archivo o directorio de clave: - &Browse... &Navegar... - Alt+B Alt+N - Use Password AND Key File Usar Contraseña Y Archivo de Clave - Exit - Salir + Salir - Password Repet.: Contraseña (repetida): + + Last File + + PwDatabase - Unknown Error Error Desconocido - Unexpected file size (DB_TOTAL_SIZE < DB_HEADER_SIZE) Tamaño de fichero inesperado (DB_TOTAL_SIZE < DB_HEADER_SIZE) - Wrong Signature Firma Incorrecta - AES-Init Failed Falló inicialización de AES - Hash test failed. The key is wrong or the file is damaged. Comprobación hash fallida. La clave es incorecta o el fichero está dañado. - Could not open key file. No se pudo abrir archivo de clave. - Key file could not be written. No se pudo escribir archivo de clave. - Could not open file. No se pudo abrir el archivo. @@ -2808,122 +2432,91 @@ La clave es incorecta o el fichero está dañado. QObject - Warning Advertencia - Could not save configuration file. Make sure you have write access to '~/.keepass'. No se pudo guardar el archivo de configuración. Asegúrese de tener acceso para escritura en '~/.keepass'. - OK - Aceptar + Aceptar - File '%1' could not be found. - Archivo '%1' no encontrado. + Archivo '%1' no encontrado. - File not found. Archivo no encontrado. - Could not open file. No se pudo abrir el archivo. - File is no valid PwManager file. El archivo no es un archivo PwManager válido. - Unsupported file version. Version de archivo no soportada. - Unsupported hash algorithm. Algoritmo hash no soportado. - Unsupported encryption algorithm. Algoritmo de cifrado no soportado. - Compressed files are not supported yet. Los archivos comprimidos todavía no están soportados. - Wrong password. Contraseña incorrecta. - File is damaged (hash test failed). El archivo está dañado (comprobación hash fallida). - Invalid XML data (see stdout for details). Datos XML no válidos (ver stdout para más detalles). - File is empty. Archivo vacío. - Invalid XML file (see stdout for details). Archivo XML no válido (ver stdout para más detalles). - Invalid XML file. Archivo XML no válido. - Document does not contain data. El documento no contiene datos. - Error - Error + Error - Never - Nunca - - - - Initialization failed. - - - - - Could not locate library file. - + Nunca SearchDialog - Search Buscar @@ -2931,117 +2524,94 @@ Asegúrese de tener acceso para escritura en '~/.keepass'. Search_Dlg - Alt+T Alt+T - Alt+U Alt+U - A&nhang &Adjunto - Alt+N Alt+A - Alt+W Alt+C - Alt+C Alt+M - Search... Buscar... - Search For: Buscar: - Regular E&xpression E&xpresión Regular - Alt+X Alt+X - &Case Sensitive Distinguir &Mayúsculas - Include: Incluir: - &Titles &Títulos - &Usernames &Usuarios - C&omments C&omentarios - Alt+O Alt+O - U&RLs U&RLs - Alt+R Alt+R - Pass&words &Contraseñas - Search - Buscar + Buscar - Clo&se - C&errar + C&errar - Alt+S - Alt+E + Alt+E - Include Subgroups (recursive) Incluir Subgrupos (recursivo) @@ -3049,388 +2619,347 @@ Asegúrese de tener acceso para escritura en '~/.keepass'. SelectIconDlg - Icon Selection - - Add Custom Icon... - - - - - Pick - - - - Cancel - Cancelar + Cancelar SettingsDialog - Alt+Ö - O&K &Aceptar - Alt+K Alt+A - Settings Preferencias - &Cancel &Cancelar - Clear clipboard after: Borrar portapapeles después de: - Seconds Segundos - Sh&ow passwords in plain text by default M&ostrar contraseñas en texto plano por defecto - Alt+O - Appea&rance Apa&riencia - Banner Color - Text Color: Color de Texto: - Change... Cambiar... - Color 2: Color 2: - C&hange... Ca&mbiar... - Alt+H Alt+M - Color 1: Color 1: - Expand group tree when opening a database Expandir árbol de grupo al abrir la base de datos - &Other &Otros - Remember last opend file Recordar último archivo abierto - Browser Command: Comando del Navegador: - Securi&ty Seguri&dad - Alternating Row Colors Alternar Colores de Columna - Browse... Navegar... - Remember last key type and location Recordar último tipo de clave y localización - Remember last opened file - The integration plugins provide features like usage of the native file dialogs and message boxes of the particular desktop environments. - General - Show system tray icon - Minimize to tray when clicking the main window's close button - Save recent directories of file dialogs - Group tree at start-up: - Restore last state - Expand all items - Do not expand any item - Security - Show passwords in plain text in: - Edit Entry Dialog - Key Dialogs - Desktop Integration - Plug-Ins - None - Gnome Desktop Integration (Gtk 2.x) - KDE 4 Desktop Integration - You need to restart the program before the changes take effect. - Configure... - Advanced - Clear History Now - Always ask before deleting entries or groups - - Unified Title and Toolbar - - - - Customize Entry Detail View... - Features - You can disable several features of KeePassX here according to your needs in order to keep the user interface slim. - Bookmarks - Auto-Type Fine Tuning - Time between the activation of an auto-type action by the user and the first simulated key stroke. - ms - Pre-Gap: - Key Stroke Delay: - Delay between two simulated key strokes. Increase this if Auto-Type is randomly skipping characters. - The directory where storage devices like CDs and memory sticks are normally mounted. - Media Root: - System Default - Enable this if you want to use your bookmarks and the last opened file independet from their absolute paths. This is especially useful when using KeePassX portably and therefore with changing mount points in the file system. - Save relative paths (bookmarks and last file) + + Minimize to tray instead of taskbar + + + + Start minimized + + + + Start locked + + + + Lock workspace when minimizing the main window + + + + Global Auto-Type Shortcut: + + + + Use entry titles to match the window for Global Auto-Type + + + + + ShortcutWidget + + Ctrl + + + + Shift + + + + Alt + + + + AltGr + + + + Win + + SimplePasswordDialog - O&K &Aceptar - Alt+K Alt+A - Alt+C Alt+C - ... - ... + ... - Enter your Password Introduzca su Contraseña - Password: Contraseña: - &Cancel &Cancelar @@ -3438,22 +2967,18 @@ Asegúrese de tener acceso para escritura en '~/.keepass'. StandardDatabase - Could not open file. No se pudo abrir el archivo. - Unexpected file size (DB_TOTAL_SIZE < DB_HEADER_SIZE) Tamaño de fichero inesperado (DB_TOTAL_SIZE < DB_HEADER_SIZE) - Wrong Signature Firma Incorrecta - Hash test failed. The key is wrong or the file is damaged. Comprobación hash fallida. @@ -3463,92 +2988,73 @@ La clave es incorecta o el fichero está dañado. TrashCanDialog - - Recycle Bin - - - - - Double click on an entry to restore it. - - - - - Group - - - - Title - Título + Título - Username - Usuario + Usuario + + + WorkspaceLockedWidget - - Expired + Form - - Empty Recycle Bin + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Verdana'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">The workspace is locked.</span></p></body></html> - - Close + Unlock + + Close Database + Cerrar Base de Datos + dbsettingdlg_base - Database Settings - Preferencias de Base de Datos + Preferencias de Base de Datos - Encryption - Cifrado + Cifrado - Algorithm: - Algoritmo: + Algoritmo: - ? ? - Encryption Rounds: - Iteraciones de Cifrado: + Iteraciones de Cifrado: - O&K - &Aceptar + &Aceptar - Ctrl+K - Ctrl+A + Ctrl+A - &Cancel - &Cancelar + &Cancelar - Ctrl+C - Ctrl+C + Ctrl+C diff --git a/src/translations/keepass-fr_FR.ts b/src/translations/keepass-fr_FR.ts index d396242..4806907 100644 --- a/src/translations/keepass-fr_FR.ts +++ b/src/translations/keepass-fr_FR.ts @@ -1,9 +1,7 @@ - - + - Could not open file (FileError=%1) Ne peut ouvrir le fichier (FileError=%1) @@ -11,187 +9,155 @@ AboutDialog - KeePassX %1 - KeePassX %1 + KeePassX %1 - <b>Current Translation: None</b><br><br> Please replace 'None' with the language of your translation <b>La présente traduction française</b><br><br> - <b>Author:</b> %1<br> <b> À pour auteur:</b> %1<br> - $TRANSLATION_AUTHOR <br>Djellel DIDA - $TRANSLATION_AUTHOR_EMAIL Here you can enter your email or homepage if you want. <b>Courriel:</b> <br> djellel@free.fr - - Information on how to translate KeePassX can be found under: -http://keepassx.sourceforge.net/ - - - - Team Équipe - Tarek Saidi - Tarek Saidi + Tarek Saidi - Developer, Project Admin Développeur et Administrateur du Projet - tariq@users.berlios.de - tariq@users.berlios.de + tariq@users.berlios.de - Eugen Gorschenin - Eugen Gorschenin + Eugen Gorschenin - Web Designer Concepteur du site Internet - geugen@users.berlios.de - geugen@users.berlios.de + geugen@users.berlios.de - Thanks To Remerciement à - Matthias Miller - Matthias Miller + Matthias Miller - Patches for better MacOS X support Pour les rustines ayant permis un meilleur support de MacOS X - www.outofhanwell.com - <ADDRESS>www.outofhanwell.com<ADDRESS> + <ADDRESS>www.outofhanwell.com<ADDRESS> - James Nicholls - James Nicholls + James Nicholls - Main Application Icon Pour le logo de KeepassX - - Constantin Makshin - - - - Various fixes and improvements - - dinosaur-rus@users.sourceforge.net - - - - Error Erreur - File '%1' could not be found. - Make sure that the program is installed correctly. S'assurer que l'application est correctement installée. - OK - Could not open file '%1' N'a pas pu ouvrir le fichier '%1' - The following error occured: %1 - L'erreur suivante est survenue: + L'erreur suivante est survenue: %1 - http://keepassx.sf.net - http://keepassx.sf.net + http://keepassx.sf.net + + + Unofficial + + + + Developer + + + + Information on how to translate KeePassX can be found under: + + + + The following error occured: + AboutDlg - About À propos - Thanks To Remerciement à - License Licence - Translation Traduction - <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">KeePassX</span> - Cross Platform Password Manager</p></body></html> - <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">KeePassX</span> - Gest. de mot de passe multiplateforme</p></body></html> + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">KeePassX</span> - Gest. de mot de passe multiplateforme</p></body></html> - Copyright (C) 2005 - 2006 Tarek Saidi KeePassX is distributed under the terms of the General Public License (GPL) version 2. @@ -199,237 +165,273 @@ General Public License (GPL) version 2. KeePassX est distribué sous les termes de la<br> Licence Publique Générale GNU v2 (GPL v2).</span> - tarek.saidi@arcor.de tarek.saidi@arcor.de - http://keepass.berlios.de/ http://keepass.berlios.de/ - Credits Crédits - http://keepassx.sourceforge.net http://keepassx.sourceforge.net - keepassx@gmail.com keepassx@gmail.com - - Copyright (C) 2005 - 2006 Tarek Saidi + AppName + + + + AppFunc + + + + http://sniperbeamer.fobos.de/keepassx/ + + + + Copyright (C) 2005 - 2007 KeePassX Team KeePassX is distributed under the terms of the -General Public License (GPL) version 2 or later. +General Public License (GPL) version 2. + + + + + AddBookmarkDlg + + Add Bookmark + + + + Title: + Títre: + + + File: + + + + Browse... + Parcourir... + + + Edit Bookmark + + + + KeePass Databases (*.kdb) + + + + All Files (*) AutoType - More than one 'Auto-Type:' key sequence found. Allowed is only one per entry. Plus d'une auto-saisie: Séquence clé trouvée. Seulement une par entrée est autorisée. - Syntax Error in Auto-Type sequence near character %1 Found '{' without closing '}' Erreur de syntaxe à l'intérieur de la séquence d'auto-saisie près du caractère %1 Trouvé '{' sans accolade fermante '}' - Error - Erreur + Erreur - Syntax Error in Auto-Type sequence near character %1 Found '{' without closing '}' + + Auto-Type string contains illegal characters + + + + + AutoTypeDlg + + KeePassX - Auto-Type + + + + Click on an entry to auto-type it. + + + + Group + + + + Title + Títre + + + Username + Nom d'utilisateur + + + Cancel + Annuler + + + Auto-Type + + CAboutDialog - KeePassX %1 KeePassX %1 - Error Erreur - File '%1' could not be found. Le fichier '%1' n'a pu être trouvé. - Make sure that the program is installed correctly. S'assurer que l'application est correctement installée. - OK Ok - Could not open file '%1' N'a pas pu ouvrir le fichier '%1' - The following error occured: %1 L'erreur suivante est survenue: %1 - http://keepass.berlios.de/index.php http://keepass.berlios.de/index.php - <b>Current Translation: None</b><br><br> Please replace 'None' with the language of your translation <b>La présente traduction française</b><br><br> - <b>Author:</b> %1<br> <b> À pour auteur:</b> %1<br> - $TRANSALTION_AUTHOR <br>Djellel DIDA - $TRANSLATION_AUTHOR_EMAIL Here you can enter your email or homepage if you want. <b>Courriel:</b> <br> djellel@free.fr - Information on how to translate KeePassX can be found under: http://keepass.berlios.de/translation-howto.html Les informations concernant la méthode de traduction de KeePassX peut être trouvé à l'adresse suivante:<br> <ADDRESS>http://keepass.berlios.de/translation-howto.html</ADDRESS> - Matthias Miller Matthias Miller - http://www.outofhanwell.com/<br>Mac OS X Support <ADDRESS>http://www.outofhanwell.com </ADDRESS> - Eugen Gorschenin Eugen Gorschenin - geugen@users.berlios.de<br>New Website <ADDRESS>geugen@users.berlios.de</ADDRESS> - $TRANSLATION_AUTHOR <br>Djellel DIDA - Information on how to translate KeePassX can be found under: http://keepass.berlios.de/ Toutes les informations concernant la méthode pour traduire KeePassX peuvent être obtenues à l'adresse suivante:<br> <ADDRESS>http://keepass.berlios.de/<ADDRESS> - Team Équipe - Tarek Saidi Tarek Saidi - Developer, Project Admin Développeur et Administrateur du Projet - tariq@users.berlios.de tariq@users.berlios.de - Web Designer Concepteur du site Internet - geugen@users.berlios.de geugen@users.berlios.de - Thanks To Remerciement à - Patches for better MacOS X support Pour les rustines ayant permis un meilleur support de MacOS X - www.outofhanwell.com <ADDRESS>www.outofhanwell.com<ADDRESS> - Information on how to translate KeePassX can be found under: http://keepassx.sourceforge.net/ Les informations concernant la méthode de traduction de KeePassX peuvent être trouvées à l'adresse suivante:<br> <ADDRESS>http://keepass.berlios.de/translation-howto.html</ADDRESS> - James Nicholls James Nicholls - Main Application Icon Pour le logo de KeepassX - http://keepassx.sf.net http://keepassx.sf.net @@ -437,47 +439,38 @@ http://keepassx.sourceforge.net/ CDbSettingsDlg - AES(Rijndael): 256 Bit (default) AES(Rijndael): 256 Bits (défaut) - Twofish: 256 Bit Twofish: 256 Bits - Warning Avertissement - Please determine the number of encryption rounds. Définiser le nombre de passes. - OK Accepter - Error Erreur - '%1' is not valid integer value. '%1' n'est pas un nombre entier valide. - The number of encryption rounds have to be greater than 0. Le nombre de passes doit être supérieur à 0. - Settings Préférences @@ -485,206 +478,163 @@ http://keepassx.sourceforge.net/ CEditEntryDlg - Warning Avertissement - Password and password repetition are not equal. Please check your input. Le mot de passe et sa confirmation ne sont pas identiques ! S'il vous plait, vérifier votre saisie. - OK Accepter - Save Attachment... Enregistrer la pièce jointe... - Overwrite? Écraser ? - A file with this name already exists. Do you want to replace it? Un fichier ayant le même nom existe déjà. Voulez-vous le remplacer ? - Yes Oui - No Non - Error Erreur - Could not remove old file. N'a pas pu enlever l'ancien fichier. - Could not create new file. N'a pas pu créer un nouveau fichier. - Error while writing the file. Erreur lors de l'écriture du fichier. - Delete Attachment? Supprimer la pièce jointe ? - You are about to delete the attachment of this entry. Are you sure? Vous êtes sur le point de supprimer la pièce jointe de cette entrée. En êtes-vous sûr ? - No, Cancel Non, annuler - Edit Entry - Édition de l'entrée + Édition de l'entrée - Could not open file. N'a pas pu ouvrir le fichier. - %1 Bit %1 Bits - Add Attachment... Ajouter une pièce jointe... - - Test 2 - - - - The chosen entry has no attachment or it is empty. - Today - 1 Week - 2 Weeks - 3 Weeks - 1 Month - 3 Months - 6 Months - 1 Year - Calendar... + + [Untitled Entry] + + CGenPwDialog - Notice Notification - You need to enter at least one character Vous devez au moins entrer un caractère - OK Accepter - Error Erreur - Could not open '/dev/random' or '/dev/urandom'. N'a pas pu ouvrir '/dev/random' ou '/dev/urandom'. - Password Generator Générateur de mots de passe - %1 Bit %1 Bits - - Accept - - - - %1 Bits @@ -692,200 +642,168 @@ En êtes-vous sûr ? CPasswordDialog - OK Accepter - Error Erreur - Please enter a Password. Entrer un mot de passe. - Please choose a key file. Sélectionner un trousseau de clés. - Please enter a Password or select a key file. Entrer un mot de passe ou sélectionner un trousseau de clés. - Database Key Base de données des clés - Select a Key File Selectionner un trousseau de clés - *.key *.key - Unexpected Error: File does not exist. Erreur inattendue: Le fichier n'existe pas. - The selected key file or directory does not exist. Le trousseau de clés ou le répertoire n'existe pas. - The given directory does not contain any key files. Le répertoire désigné ne contient aucun trousseau de clés. - The given directory contains more then one key file. Please specify the key file directly. Le répertoire désigné contient plus d'un trousseau de clés. Pourriez-vous sélectionner le trousseau de clés désiré. - The key file found in the given directory is not readable. Please check your permissions. Le trousseau de clés choisi dans le répertoire n'est pas lisible. S'il vous plait, vérifier vos permissions. - Key file could not be found. Le trousseau de clés n'a pu être trouvé. - Key file is not readable. Please check your permissions. Le trousseau de clés n'est pas lisible. S'il vous plait, vérifier vos permissions. - Warning Avertissement - Password an password repetition are not equal. Please check your input. Le mot de passe et sa confirmation ne sont pas identiques ! S'il vous plait, vérifier votre saisie. - Please enter a password or select a key file. Entrer un mot de passe ou sélectionner un trousseau de clés. - A file with the name 'pwsafe.key' already exisits in the given directory. Do you want to replace it? Un fichier avec le nom 'pwsafe.key' existe déjà dans le répertoire selectionné. Voulez-vous le remplacer ? - Yes Oui - No Non - The exisiting file is not writable. L'existant fichier est protégé en écriture . - A file with the this name already exisits. Do you want to replace it? Un fichier avec un même nom existe déjà. Désirez-vous le remplacer ? - The selected key file or directory is not readable. Please check your permissions. Le trousseau de clés choisi n'est pas lisible. S'il vous plait, vérifier vos permissions. - All Files (*) - Key Files (*.key) - File exists. - A file with the selected name already exists, should this file be used as key file or do you want to overwrite it with a newly generated one? - Use - Overwrite - Cancel Annuler - Key file could not be created. %1 + + Last File + + CSearchDlg - Notice Notification - Please enter a search string. Saisissez une recherche. - OK Accepter - Search Recherche @@ -893,76 +811,75 @@ S'il vous plait, vérifier vos permissions. CSelectIconDlg - Delete Supprimer - Add Icons... Ajouter une icône... - Images (%1) Images (%1) - %1: File could not be loaded. - %1: Le fichier n'a pu être chargé. + %1: Le fichier n'a pu être chargé. - Error Erreur - An error occured while loading the icon(s): Une erreur est survenue lors du chargement (des) de l'icône(s): - Replace... Remplacez... - An error occured while loading the icon(s): %1 - Une erreur est survenue lors du chargement (des) de l'icône(s): %1 + Une erreur est survenue lors du chargement (des) de l'icône(s): %1 - An error occured while loading the icon. Une erreur est survenue lors du chargement de l'icône. + + Add Custom Icon + + + + Pick + Sélectionner + + + %1: File could not be loaded. + + + + An error occured while loading the icon(s): + + CSettingsDlg - Settings Préférences - Select a directory... Sélectionner un répertoire.... - - - Error: %1 - - CalendarDialog - Calendar @@ -970,23 +887,19 @@ S'il vous plait, vérifier vos permissions. CollectEntropyDlg - Entropy Collection - Random Number Generator - Collecting entropy... Please move the mouse and/or press some keys until enought entropy for a reseed of the random number generator is collected. - <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> @@ -997,320 +910,275 @@ p, li { white-space: pre-wrap; } CustomizeDetailViewDialog - Group - Title Títre - Username Nom d'utilisateur - Password Mot de passe - Url - Comment Commentaire - Attachment Name - Creation Date - Last Access Date - Last Modification Date - Expiration Date - Time till Expiration - Dialog - Rich Text Editor - Bold - B - Italic - I - Underlined - U - Left-Aligned - L - Centered - C - Right-Aligned - R - Justified - Text Color - Font Size - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 14 - 16 - 18 - 20 - 22 - 24 - 26 - 28 - 36 - 42 - 78 - Templates - T - HTML - - Restore Default - + Cancel + Annuler + + + Database - - Save - + Never + Jamais + + + DatabaseSettingsDlg - - Cancel - Annuler + Database Settings + Préférences de la Base de Données + + + Encryption + Encryptage + + + Algorithm: + Algorithme: + + + Encryption Rounds: + Nombre de passes: DetailViewTemplate - Group - Title Títre - Username Nom d'utilisateur - Password Mot de passe - URL URL - Creation - Last Access Dernier accès - Last Modification - Expiration - Comment Commentaire @@ -1318,117 +1186,94 @@ p, li { white-space: pre-wrap; } EditEntryDialog - Edit Entry Édition de l'entrée - Username: Nom d'utilisateur: - Password Repet.: Confirmation: - Title: Títre: - URL: URL: - Password: Mot de passe: - Quality: Qualité - Comment: Commentaire: - Expires: Expire le: - Group: Groupe: - &Cancel A&nnuler - Alt+C Alt+N - %1 %1 - Icon: Icône: - % Bit % Bits - Ge&n. &Gen. - ... - ... + ... - O&K &Accepter - Alt+K Alt+A - Never Jamais - Attachment: Pièce jointe: - > - > + > - %1 Bit %1 Bits @@ -1436,42 +1281,34 @@ p, li { white-space: pre-wrap; } EditGroupDialog - Group Properties Propriétés du groupe - Title: Títre: - Icon: Icône: - &Cancel - A&nnuler + A&nnuler - Alt+C - Alt+N + Alt+N - O&K - &Accepter + &Accepter - Alt+K - Alt+A + Alt+A - > > @@ -1479,81 +1316,75 @@ p, li { white-space: pre-wrap; } ExpiredEntriesDialog - - Expried Entries of the Database - - - - Expired Entries - Double click on an entry to jump to it. - Group - Title Títre - Username Nom d'utilisateur - Expired + + Expired Entries in the Database + + Export_KeePassX_Xml - XML Files (*.xml) - All Files (*) + + KeePassX XML File + + Export_Txt - Could not open file (FileError=%1) N'a pas pu ouvrir le fichier (FileError=%1) - All Files (*) - Text Files (*.txt) + + Text File + + ExporterBase - Import File... - Export Failed @@ -1561,77 +1392,62 @@ p, li { white-space: pre-wrap; } FileErrors - No error occurred. - An error occurred while reading from the file. - An error occurred while writing to the file. - A fatal error occurred. - An resource error occurred. - The file could not be opened. - The operation was aborted. - A timeout occurred. - An unspecified error occurred. - The file could not be removed. - The file could not be renamed. - The position in the file could not be changed. - The file could not be resized. - The file could not be accessed. - The file could not be copied. @@ -1639,147 +1455,118 @@ p, li { white-space: pre-wrap; } GenPwDlg - Alt+U Alt+U - Alt+N Alt+N - Alt+M Alt+M - Alt+L Alt+L - Password Generator Générateur de mots de passe - Accep&t Accep&ter - &Cancel &Annuler - Generate Générer - New Password: Nouveau mot de passe: - Quality: Qualité: - Options Options - &Upper Letters Lettres majusc&ules - &Lower Letters Lettres minuscu&les - &Numbers &Nombres - &Special Characters Caractères &Spéciaux - Minus Moins - U&nderline Soulig&né - h&igher ANSI-Characters Caractères ANS&I étendus - Alt+H Alt+H - Use &only following characters: Utiliser s&eulement les caractères suivant: - Alt+O Alt+E - Length: Longueur: - Use "/dev/rando&m" Utiliser "/dev/rando&m" - Use follo&wing character groups: Utiliser le &groupe de caractères suivant: - Alt+W Alt+G - White &Spaces E&space - Alt+S Alt+S - Enable entropy collection - Collect only once per session @@ -1787,32 +1574,26 @@ p, li { white-space: pre-wrap; } Import_KWalletXml - XML Files (*.xml) - All Files (*) - Import Failed - Invalid XML data (see stdout for details). Donnée XML invalide (voir 'stdout pour plus de détails). - Invalid XML file. Fichier XML invalide. - Document does not contain data. Le document ne contient pas de donnée. @@ -1820,28 +1601,23 @@ p, li { white-space: pre-wrap; } Import_KeePassX_Xml - KeePass XML Files (*.xml) - All Files (*) - Import Failed - XML parsing error on line %1 column %2: %3 - Parsing error: File is no valid KeePassX XML file. @@ -1849,62 +1625,50 @@ p, li { white-space: pre-wrap; } Import_PwManager - PwManager Files (*.pwm) - All Files (*) - Import Failed - File is empty. Le fichier est vide. - File is no valid PwManager file. Le fichier n'est pas un fichier PwManager valide. - Unsupported file version. Version de fichier non supportée. - Unsupported hash algorithm. L'algorithme de hachage non supporté. - Unsupported encryption algorithm. Algorithme d'encryptage non supporté. - Compressed files are not supported yet. Fichiers de compression non supportés encore. - Wrong password. Mauvais mot de passe. - File is damaged (hash test failed). Le fichier est endommagé (Le test de hachage a échoué). - Invalid XML data (see stdout for details). Donnée XML invalide (voir 'stdout pour plus de détails). @@ -1912,12 +1676,10 @@ p, li { white-space: pre-wrap; } ImporterBase - Import File... - Import Failed @@ -1925,187 +1687,187 @@ p, li { white-space: pre-wrap; } Kdb3Database - Could not open file. - Unexpected file size (DB_TOTAL_SIZE < DB_HEADER_SIZE) Taille de fichier inattendue (DB_TOTAL_SIZE < DB_HEADER_SIZE) - Wrong Signature Mauvaise signature - Unsupported File Version. Version de fichier non supportée. - Unknown Encryption Algorithm. Algorithme d'encryptage inconnu. - Decryption failed. The key is wrong or the file is damaged. Le décryptage a échoué. La clé est mauvaise ou le fichier est endommagé. - Hash test failed. The key is wrong or the file is damaged. Le test de hachage a échoué. La clé est mauvaise ou le fichier est endommagé. - Unexpected error: Offset is out of range. [G1] - Erreur inattendue: Le décalage est hors limite.[G1] + Erreur inattendue: Le décalage est hors limite.[G1] - Unexpected error: Offset is out of range. [G2] - Erreur inattendue: Le décalage est hors limite.[G2] + Erreur inattendue: Le décalage est hors limite.[G2] - Unexpected error: Offset is out of range. [E1] - Erreur inattendue: Le décalage est hors limite.[E1] + Erreur inattendue: Le décalage est hors limite.[E1] - Unexpected error: Offset is out of range. [E2] - Erreur inattendue: Le décalage est hors limite.[E2] + Erreur inattendue: Le décalage est hors limite.[E2] - Unexpected error: Offset is out of range. [E3] - Erreur inattendue: Le décalage est hors limite.[E3] + Erreur inattendue: Le décalage est hors limite.[E3] - Invalid group tree. - Key file is empty. - The database must contain at least one group. - Could not open file for writing. N'a pu ouvrir le fichier pour écriture. + + Unexpected error: Offset is out of range. + + + + + Kdb3Database::EntryHandle + + Bytes + + + + KiB + + + + MiB + + + + GiB + + KeepassEntryView - Title Títre - Username Nom d'utilisateur - URL URL - Password Mot de passe - Comments Commentaires - Expires Expire le - Creation Créé le - Last Change Dernier changement - Last Access Dernier accès - Attachment Pièce jointe - %1 items %1 élements - Are you sure you want delete this entry? - Are you sure you want delete these %1 entries? - Delete? - Group + + Error + Erreur + + + At least one group must exist before adding an entry. + + + + OK + + KeepassGroupView - Search Results Résultats de la recherche - Groups - Groupes + Groupes - Delete? - Are you sure you want to delete this group, all it's child groups and all their entries? @@ -2113,908 +1875,805 @@ La clé est mauvaise ou le fichier est endommagé. KeepassMainWindow - Ctrl+N Ctrl+N - Ctrl+O Ctrl+O - Ctrl+S Ctrl+S - Ctrl+G Ctrl+G - Ctrl+C Ctrl+C - Ctrl+B Ctrl+B - Ctrl+U Ctrl+U - Ctrl+Y Ctrl+Y - Ctrl+E Ctrl+E - Ctrl+D Ctrl+D - Ctrl+K Ctrl+A - Ctrl+F Ctrl+F - Ctrl+W Ctrl+W - Shift+Ctrl+S Shift+Ctrl+S - Shift+Ctrl+F Shift+Ctrl+F - Error Erreur - The following error occured while opening the database: %1 - l'erreur suivante est survenue à l'ouverture de la base de données: + l'erreur suivante est survenue à l'ouverture de la base de données: %1 - OK - Accepter + Accepter - Save modified file? Enregistrer le fichier modifié ? - The current file was modified. Do you want to save the changes? Le courant fichier a été modifié. Désirez-vous enregistrer le changement ? - Yes Oui - No Non - Cancel Annuler - KeePassX - %1 KeePassX - %1 - <B>Group: </B>%1 <B>Title: </B>%2 <B>Username: </B>%3 <B>URL: </B><a href=%4>%4</a> <B>Password: </B>%5 <B>Creation: </B>%6 <B>Last Change: </B>%7 <B>LastAccess: </B>%8 <B>Expires: </B>%9 <B>Groupe: </B>%1 <B>Titre: </B>%2 <B>Nom d'utilisateur: </B>%3 <B>URL: </B><a href=%4>%4</a> <B>Mot de passe: </B>%5 <B>Date de création: </B>%6 <B>Dernier changement: </B>%7 <B>Dernier accès: </B>%8 <B>Date d'expiration: </B>%9 - Clone Entry Dupliquer l'entrée - Delete Entry Supprimer l'entrée - Clone Entries Dupliquer les entrées - Delete Entries Supprimer les entrées - File could not be saved. %1 - Le fichier n'a pu être enregistré. + Le fichier n'a pu être enregistré. %1 - Save Database As... Enregistrer la BD sous... - Ready Prêt - [new] - [nouveau] + [nouveau] - Open Database... Ouvrir la BD... - Loading Database... Chargement de la BD... - Loading Failed Le chargement a échoué - Could not create key file. The following error occured: %1 N'a pu créer le trousseau de clés. L'erreur suivante est survenue: %1 - Export To... Exporter vers... - KeePassX [new] KeePassX [nouveau] - Unknown error in Import_PwManager::importFile()() Erreur inconnue dans Import_PwManager::importFile()() - Unknown error in Import_KWalletXml::importFile() Erreur inconnue dans Import_KWalletXml::importFile() - Unknown error in PwDatabase::openDatabase() Erreur inconnue dans PwDatabase::openDatabase() - Ctrl+V Ctrl+V - Show Toolbar Afficher la barre outils - KeePassX - KeePassX - - - - %1 - KeePassX - + KeePassX - Unknown error while loading database. - KeePass Databases (*.kdb) - All Files (*) - Save Database... - - KeePassX - [unsaved] - - - - New Database - - expired - - - - 1 Month - %1 Months - - , - - - - 1 Year - %1 Years - 1 Day - %1 Days - less than 1 day - Set Master Key - - * - KeePassX + Locked + + + + Unlocked + + + + Ctrl+L + + + + Ctrl+Q + + + + The database file does not exist. + + + + new + + + + Expired + + + + Un&lock Workspace + + + + &Lock Workspace + + + + The following error occured while opening the database: + + + + File could not be saved. + + + + + Main + + Error + Erreur + + + File '%1' could not be found. + + + + OK MainWindow - KeePassX KeePassX - File Fichier - Import from... Importer d'un... - View Affichage - Columns Colonnes - Extras Extras - Help Aide - New Database... Nouvelle BD... - Open Database... Ouvrir une BD... - Close Database Fermer la BD - Save Database Enregistrer la BD - Save Database As... Enregistrer la BD sous... - Database Settings... Paramétrage de la BD... - Change Master Key... Changer la clé maitresse... - Exit Quitter - PwManager File (*.pwm) Fichier PwManager (*.pwm) - KWallet XML-File (*.xml) Fichier XML, KWallet (*.xml) - Add New Group... Ajouter un nouveau groupe... - Edit Group... Modifier le groupe... - Delete Group Supprimer le groupe - Copy Password to Clipboard Copier le mot de passe dans le presse-papier - Copy Username to Clipboard Copier l'utilisateur dans le presse-papier - Open URL Ouvrir l'URL - Save Attachment As... Enregistrer la pièce jointe sous... - Add New Entry... Ajouter une nouvelle entrée... - View/Edit Entry... Modifier/afficher l'entrée... - Delete Entry Supprimer l'entrée - Clone Entry Dupliquer l'entrée - Search In Database... - Rechercher dans la BD... + Rechercher dans la BD... - Search in this group... - Rechercher dans ce groupe... + Rechercher dans ce groupe... - Show Toolbar Afficher la barre outils - Show Entry Details Afficher les détails de l'entrée - Hide Usernames Cacher l'utilisateur - Hide Passwords Cacher les mots de passe - Title Títre - Username Nom d'utilisateur - URL URL - Password Mot de passe - Comment Commentaire - Expires Date d'expiration - Creation Date de création - Last Change Dernier changement - Last Access Dernier accès - Attachment Pièce jointe - Settings... Préférences... - About... À propos... - Edit Édition - Show Statusbar Afficher la barre de statuts - Export to... Exporter vers... - KeePassX Handbook... Le manuel de KeePassX... - Plain Text (*.txt) Un fichier plein texte (*.txt) - Hide Cacher - Perform AutoType Exécuter l'auto-saisie - Type Here Saisir ici - Toolbar Icon Size Taille des icônes de la barre d'outils - 16x16 - 22x22 - 28x28 - &View &Affichage - &File &Fichier - &Import from... &Importer d'un... - &Export to... &Exporter vers... - &Edit Ed&iter - E&xtras E&xtras - &Help Ai&de - &New Database... &Nouvelle BD... - &Open Database... &Ouvrir une BD... - &Close Database Fer&mer la BD - &Save Database &Enregistrer la BD - Save Database &As... Enre&gistrer la BD sous... - &Database Settings... Paramé&trage de la BD... - Change &Master Key... &Changer la clé maitresse... - E&xit - &Quitter + &Quitter - &Settings... &Préférences... - &About... À pr&opos... - &KeePassX Handbook... Le manuel de &KeePassX... - Standard KeePass Single User Database (*.kdb) - Advanced KeePassX Database (*.kxdb) - Password Generator... - Group (search results only) - Show Expired Entries... - - Show Expired Entries + Recycle Bin... - - Recycle Bin... + Groups + Groupes + + + Bookmarks + + + + Manage Bookmarks... - - Lock Workspace + &Lock Workspace + + + + Q&uit + + + + Search in Database... + + + + Search in this Group... + + + + Add Bookmark... + + + + Bookmark this Database... - PasswordDlg + ManageBookmarksDlg - - TextLabel - + Manage Bookmarks + + + + PasswordDlg - OK - Accepter + Accepter - ... ... - Cancel - Annuler + Annuler - Enter a Password and/or choose a key file. Entrer un mot de passe et/ou sélectionner un trousseau de clés. - Key Clé maitresse - Password: Mot de passe: - Key file or directory: Trousseau de clés ou répertoire: - &Browse... &Parcourir... - Alt+B Alt+P - Use Password AND Key File Utiliser un mot de passe ET un trousseau de clés - Exit - Quitter + Quitter - Password Repet.: Confirmation: + + Last File + + PwDatabase - Unknown Error Erreur inconnue - Unexpected file size (DB_TOTAL_SIZE < DB_HEADER_SIZE) Taille de fichier inattendue (DB_TOTAL_SIZE < DB_HEADER_SIZE) - Wrong Signature Mauvaise signature - AES-Init Failed L'initialisation de AES a échoué - Unexpected error: Offset is out of range. [G1] Erreur inattendue: Le décalage est hors limite.[G1] - Unexpected error: Offset is out of range. [G2] Erreur inattendue: Le décalage est hors limite.[G2] - Unexpected error: Offset is out of range. [E1] Erreur inattendue: Le décalage est hors limite.[E1] - Unexpected error: Offset is out of range. [E2] Erreur inattendue: Le décalage est hors limite.[E2] - Unexpected error: Offset is out of range. [E3] Erreur inattendue: Le décalage est hors limite.[E3] - Hash test failed. The key is wrong or the file is damaged. Le test de hachage a échoué. La clé est mauvaise ou le fichier est endommagé. - Could not open key file. N'a pu ouvrir le trousseau de clés. - Key file could not be written. Le trousseau de clés n'a pas pu être écrit. - Could not open file. N'a pu ouvrir le fichier. - Unsupported File Version. Version de fichier non supportée. - Unknown Encryption Algorithm. Algorithme d'encryptage inconnu. - Decryption failed. The key is wrong or the file is damaged. Le décryptage a échoué. La clé est mauvaise ou le fichier est endommagé. - Could not open file for writing. N'a pu ouvrir le fichier pour écriture. @@ -3022,133 +2681,100 @@ La clé est mauvaise ou le fichier est endommagé. QObject - Warning Avertissement - Could not save configuration file. Make sure you have write access to '~/.keepass'. N'a pu enregistrer le fichier de configuration. Étes-vous sûr de posséder le droit en écriture sur '~/.keepass'. - OK - Accepter + Accepter - File '%1' could not be found. - Le fichier '%1' n'a pu être trouvé. + Le fichier '%1' n'a pu être trouvé. - File not found. Fichier non trouvé. - Could not open file. N'a pu ouvrir le fichier. - File is no valid PwManager file. Le fichier n'est pas un fichier PwManager valide. - Unsupported file version. Version de fichier non supportée. - Unsupported hash algorithm. L'algorithme de hachage non supporté. - Unsupported encryption algorithm. Algorithme d'encryptage non supporté. - Compressed files are not supported yet. Fichiers de compression non supportés encore. - Wrong password. Mauvais mot de passe. - File is damaged (hash test failed). Le fichier est endommagé (Le test de hachage a échoué). - Invalid XML data (see stdout for details). Donnée XML invalide (voir 'stdout pour plus de détails). - File is empty. Le fichier est vide. - Invalid XML file (see stdout for details). Fichier XML invalide (voir 'stdout' pour plus de détails). - Invalid XML file. Fichier XML invalide. - Document does not contain data. Le document ne contient pas de donnée. - Error - Erreur + Erreur - Warning: Avertissement: - Invalid RGB color value. Valeur de la couleur RGB invalide. - Never - Jamais - - - - Initialization failed. - - - - - Could not locate library file. - + Jamais SearchDialog - Search @@ -3156,117 +2782,94 @@ Make sure you have write access to '~/.keepass'. Search_Dlg - Alt+T Alt+T - Alt+U Alt+U - A&nhang A&nnexe - Alt+N Alt+N - Alt+W Alt+P - Alt+C Alt+C - Search... Rechercher... - Search For: Recherche de: - Regular E&xpression E&xpression Régulière - Alt+X Alt+X - &Case Sensitive Respecter la &casse - Include: Inclure: - &Titles &Títres - &Usernames Nom d'&utilisateurs - C&omments C&ommentaires - Alt+O Alt+O - U&RLs U&RLs - Alt+R Alt+R - Pass&words Mot de &passe - Search - Chercher + Chercher - Clo&se - &Quitter + &Quitter - Alt+S - Alt+Q + Alt+Q - Include Subgroups (recursive) Inclure les sous-groupes (récursive) @@ -3274,398 +2877,363 @@ Make sure you have write access to '~/.keepass'. SelectIconDlg - Icon Selection Choix d'icônes - Add Custom Icon... - Ajouter une icône... + Ajouter une icône... - Pick - Sélectionner + Sélectionner - Cancel - Annuler + Annuler SettingsDialog - Alt+Ö Alt+R - O&K &Accepter - Alt+K Alt+A - Alt+C Alt+N - Settings Préférences - &Cancel A&nnuler - Clear clipboard after: Effacer le presse-papier après: - Seconds Secondes - Sh&ow passwords in plain text by default A&fficher le mot de passe en clair par défaut - Alt+O Alt+F - Appea&rance Appa&rence - Banner Color Couleur du bandeau - Text Color: Couleur du texte: - Change... Changer... - Color 2: Couleur 2: - C&hange... C&hanger... - Alt+H Alt+H - Color 1: Couleur 1: - Expand group tree when opening a database Développer l'arborescence du groupe à l'ouverture de la base de données - &Other Au&tre - Remember last opend file Se souvenir du dernier fichier ouvert - Browser Command: Commande du navigateur: - Securi&ty Séc&urité - Alternating Row Colors Couleurs alternées pour les rangées - Browse... Parcourir... - Remember last key type and location Se souvenir de la dernière saisie de clé et du dernier emplacement - Mounting Root: Point de montage: - Remember last opened file Se souvenir du dernier fichier ouvert - The integration plugins provide features like usage of the native file dialogs and message boxes of the particular desktop environments. - General - Show system tray icon - Minimize to tray when clicking the main window's close button - Save recent directories of file dialogs - Group tree at start-up: - Restore last state - Expand all items - Do not expand any item - Security - Show passwords in plain text in: - Edit Entry Dialog - Key Dialogs - Desktop Integration - Plug-Ins - None - Gnome Desktop Integration (Gtk 2.x) - KDE 4 Desktop Integration - You need to restart the program before the changes take effect. - Configure... - Advanced - Clear History Now - Always ask before deleting entries or groups - - Unified Title and Toolbar - - - - Customize Entry Detail View... - Features - You can disable several features of KeePassX here according to your needs in order to keep the user interface slim. - Bookmarks - Auto-Type Fine Tuning - Time between the activation of an auto-type action by the user and the first simulated key stroke. - ms - Pre-Gap: - Key Stroke Delay: - Delay between two simulated key strokes. Increase this if Auto-Type is randomly skipping characters. - The directory where storage devices like CDs and memory sticks are normally mounted. - Media Root: - System Default - Enable this if you want to use your bookmarks and the last opened file independet from their absolute paths. This is especially useful when using KeePassX portably and therefore with changing mount points in the file system. - Save relative paths (bookmarks and last file) + + Minimize to tray instead of taskbar + + + + Start minimized + + + + Start locked + + + + Lock workspace when minimizing the main window + + + + Global Auto-Type Shortcut: + + + + Use entry titles to match the window for Global Auto-Type + + + + + ShortcutWidget + + Ctrl + + + + Shift + + + + Alt + + + + AltGr + + + + Win + + SimplePasswordDialog - O&K &Accepter - Alt+K Alt+A - Alt+C Alt+N - ... - ... + ... - Enter your Password Entrer votre mot de passe - Password: Mot de passe: - &Cancel A&nnuler @@ -3673,66 +3241,54 @@ Make sure you have write access to '~/.keepass'. StandardDatabase - Unexpected file size (DB_TOTAL_SIZE < DB_HEADER_SIZE) Taille de fichier inattendue (DB_TOTAL_SIZE < DB_HEADER_SIZE) - Wrong Signature Mauvaise signature - Unsupported File Version. Version de fichier non supportée. - Unknown Encryption Algorithm. Algorithme d'encryptage inconnu. - Decryption failed. The key is wrong or the file is damaged. Le décryptage a échoué. La clé est mauvaise ou le fichier est endommagé. - Hash test failed. The key is wrong or the file is damaged. Le test de hachage a échoué. La clé est mauvaise ou le fichier est endommagé. - Unexpected error: Offset is out of range. [G1] Erreur inattendue: Le décalage est hors limite.[G1] - Unexpected error: Offset is out of range. [G2] Erreur inattendue: Le décalage est hors limite.[G2] - Unexpected error: Offset is out of range. [E1] Erreur inattendue: Le décalage est hors limite.[E1] - Unexpected error: Offset is out of range. [E2] Erreur inattendue: Le décalage est hors limite.[E2] - Unexpected error: Offset is out of range. [E3] Erreur inattendue: Le décalage est hors limite.[E3] - Could not open file for writing. N'a pu ouvrir le fichier pour écriture. @@ -3740,92 +3296,73 @@ La clé est mauvaise ou le fichier est endommagé. TrashCanDialog - - Recycle Bin - - - - - Double click on an entry to restore it. - - - - - Group - - - - Title - Títre + Títre