mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2025-07-29 09:38:48 -04:00
Merge branch '2.0'
This commit is contained in:
commit
ecfbf72a57
33 changed files with 9516 additions and 347 deletions
|
@ -33,6 +33,8 @@ AutoTypeSelectDialog::AutoTypeSelectDialog(QWidget* parent)
|
|||
, m_entryActivatedEmitted(false)
|
||||
{
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
// Places the window on the active (virtual) desktop instead of where the main window is.
|
||||
setAttribute(Qt::WA_X11BypassTransientForHint);
|
||||
setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
|
||||
setWindowTitle(tr("Auto-Type - KeePassX"));
|
||||
setWindowIcon(filePath()->applicationIcon());
|
||||
|
@ -41,7 +43,7 @@ AutoTypeSelectDialog::AutoTypeSelectDialog(QWidget* parent)
|
|||
resize(size);
|
||||
|
||||
// move dialog to the center of the screen
|
||||
QPoint screenCenter = QApplication::desktop()->screenGeometry(QCursor::pos()).center();
|
||||
QPoint screenCenter = QApplication::desktop()->availableGeometry(QCursor::pos()).center();
|
||||
move(screenCenter.x() - (size.width() / 2), screenCenter.y() - (size.height() / 2));
|
||||
|
||||
QVBoxLayout* layout = new QVBoxLayout(this);
|
||||
|
|
|
@ -113,7 +113,7 @@ QIcon FilePath::icon(const QString& category, const QString& name, bool fromThem
|
|||
icon.addFile(filename, QSize(size, size));
|
||||
}
|
||||
}
|
||||
filename = QString("%1/icons/application/scalable/%3.svgz").arg(m_dataPath, combinedName);
|
||||
filename = QString("%1/icons/application/scalable/%2.svgz").arg(m_dataPath, combinedName);
|
||||
if (QFile::exists(filename)) {
|
||||
icon.addFile(filename);
|
||||
}
|
||||
|
@ -158,7 +158,7 @@ QIcon FilePath::onOffIcon(const QString& category, const QString& name)
|
|||
icon.addFile(filename, QSize(size, size), QIcon::Normal, state);
|
||||
}
|
||||
}
|
||||
filename = QString("%1/icons/application/scalable/%3-%4.svgz").arg(m_dataPath, combinedName, stateName);
|
||||
filename = QString("%1/icons/application/scalable/%2-%3.svgz").arg(m_dataPath, combinedName, stateName);
|
||||
if (QFile::exists(filename)) {
|
||||
icon.addFile(filename, QSize(), QIcon::Normal, state);
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#include <QElapsedTimer>
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#include <windows.h> // for Sleep()
|
||||
#include <windows.h> // for Sleep(), SetDllDirectoryA() and SetSearchPathMode()
|
||||
#endif
|
||||
|
||||
#ifdef Q_OS_UNIX
|
||||
|
@ -147,6 +147,16 @@ bool isHex(const QByteArray& ba)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool isBase64(const QByteArray& ba)
|
||||
{
|
||||
QRegExp regexp("^(?:[a-z0-9+/]{4})*(?:[a-z0-9+/]{3}=|[a-z0-9+/]{2}==)?$",
|
||||
Qt::CaseInsensitive, QRegExp::RegExp2);
|
||||
|
||||
QString base64 = QString::fromLatin1(ba.constData(), ba.size());
|
||||
|
||||
return regexp.exactMatch(base64);
|
||||
}
|
||||
|
||||
void sleep(int ms)
|
||||
{
|
||||
Q_ASSERT(ms >= 0);
|
||||
|
@ -219,4 +229,13 @@ void disableCoreDumps()
|
|||
}
|
||||
}
|
||||
|
||||
void setupSearchPaths()
|
||||
{
|
||||
#ifdef Q_OS_WIN
|
||||
// Make sure Windows doesn't load DLLs from the current working directory
|
||||
SetDllDirectoryA("");
|
||||
SetSearchPathMode(BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE);
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace Tools
|
||||
|
|
|
@ -36,9 +36,11 @@ bool readFromDevice(QIODevice* device, QByteArray& data, int size = 16384);
|
|||
bool readAllFromDevice(QIODevice* device, QByteArray& data);
|
||||
QString imageReaderFilter();
|
||||
bool isHex(const QByteArray& ba);
|
||||
bool isBase64(const QByteArray& ba);
|
||||
void sleep(int ms);
|
||||
void wait(int ms);
|
||||
void disableCoreDumps();
|
||||
void setupSearchPaths();
|
||||
|
||||
template <typename RandomAccessIterator, typename T>
|
||||
KEEPASSX_EXPORT RandomAccessIterator binaryFind(RandomAccessIterator begin, RandomAccessIterator end, const T& value)
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <QHBoxLayout>
|
||||
#include <QLabel>
|
||||
#include <QLineEdit>
|
||||
#include <QKeyEvent>
|
||||
#include <QSplitter>
|
||||
#include <QTimer>
|
||||
#include <QProcess>
|
||||
|
@ -88,6 +89,7 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent)
|
|||
m_searchUi->closeSearchButton->setShortcut(Qt::Key_Escape);
|
||||
m_searchWidget->hide();
|
||||
m_searchUi->caseSensitiveCheckBox->setVisible(false);
|
||||
m_searchUi->searchEdit->installEventFilter(this);
|
||||
|
||||
QVBoxLayout* vLayout = new QVBoxLayout(rightHandSideWidget);
|
||||
vLayout->setMargin(0);
|
||||
|
@ -982,3 +984,34 @@ bool DatabaseWidget::currentEntryHasNotes()
|
|||
}
|
||||
return !currentEntry->notes().isEmpty();
|
||||
}
|
||||
|
||||
bool DatabaseWidget::eventFilter(QObject* object, QEvent* event)
|
||||
{
|
||||
if (object == m_searchUi->searchEdit) {
|
||||
if (event->type() == QEvent::KeyPress) {
|
||||
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
|
||||
|
||||
if (keyEvent->matches(QKeySequence::Copy)) {
|
||||
// If Control+C is pressed in the search edit when no
|
||||
// text is selected, copy the password of the current
|
||||
// entry.
|
||||
Entry* currentEntry = m_entryView->currentEntry();
|
||||
if (currentEntry && !m_searchUi->searchEdit->hasSelectedText()) {
|
||||
setClipboardTextAndMinimize(currentEntry->password());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (keyEvent->matches(QKeySequence::MoveToNextLine)) {
|
||||
// If Down is pressed at EOL in the search edit, move
|
||||
// the focus to the entry view.
|
||||
if (!m_searchUi->searchEdit->hasSelectedText()
|
||||
&& m_searchUi->searchEdit->cursorPosition() == m_searchUi->searchEdit->text().size()) {
|
||||
m_entryView->setFocus();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -101,6 +101,9 @@ Q_SIGNALS:
|
|||
void splitterSizesChanged();
|
||||
void entryColumnSizesChanged();
|
||||
|
||||
protected:
|
||||
bool eventFilter(QObject* object, QEvent* event) Q_DECL_OVERRIDE;
|
||||
|
||||
public Q_SLOTS:
|
||||
void createEntry();
|
||||
void cloneEntry();
|
||||
|
|
|
@ -447,7 +447,8 @@ void MainWindow::closeEvent(QCloseEvent* event)
|
|||
void MainWindow::changeEvent(QEvent* event)
|
||||
{
|
||||
if ((event->type() == QEvent::WindowStateChange) && isMinimized()
|
||||
&& isTrayIconEnabled() && config()->get("GUI/MinimizeToTray").toBool())
|
||||
&& isTrayIconEnabled() && m_trayIcon && m_trayIcon->isVisible()
|
||||
&& config()->get("GUI/MinimizeToTray").toBool())
|
||||
{
|
||||
event->ignore();
|
||||
QTimer::singleShot(0, this, SLOT(hide()));
|
||||
|
|
|
@ -211,7 +211,10 @@ QByteArray FileKey::loadXmlKey(QXmlStreamReader& xmlReader)
|
|||
while (!xmlReader.error() && xmlReader.readNextStartElement()) {
|
||||
if (xmlReader.name() == "Data") {
|
||||
// TODO: do we need to enforce a specific data.size()?
|
||||
data = QByteArray::fromBase64(xmlReader.readElementText().toLatin1());
|
||||
QByteArray rawData = xmlReader.readElementText().toLatin1();
|
||||
if (Tools::isBase64(rawData)) {
|
||||
data = QByteArray::fromBase64(rawData);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ int main(int argc, char** argv)
|
|||
#ifdef QT_NO_DEBUG
|
||||
Tools::disableCoreDumps();
|
||||
#endif
|
||||
Tools::setupSearchPaths();
|
||||
|
||||
Application app(argc, argv);
|
||||
Application::setApplicationName("keepassx");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue