Interrupt auto-type if the focused window changed meanwhile
Update changelog git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@332 b624d157-de02-0410-bad0-e51aec6abb33
This commit is contained in:
parent
be548a6446
commit
d97fce6394
10
changelog
10
changelog
|
@ -1,15 +1,21 @@
|
||||||
----------------------------
|
----------------------------
|
||||||
0.4.1 (2009-06-XX)
|
0.4.1 (2009-08-XX)
|
||||||
----------------------------
|
----------------------------
|
||||||
- Added initial documentation
|
- Added initial documentation
|
||||||
- Added and improved many translations
|
- Added and improved many translations
|
||||||
|
- Seperate columns settings between normal and search results view
|
||||||
|
- Interrupt auto-type if the focused window changed meanwhile
|
||||||
|
- Reduced height of password generator dialog (Bug #2831504)
|
||||||
|
- Fixed: "Key Stroke Delay" interpreted as seconds instead of ms (Bug #2716877)
|
||||||
|
- Escape HTML chars in detail view (Bug #2836096)
|
||||||
- Fixed: Mispelling of initialize in interface (Bug #2806402)
|
- Fixed: Mispelling of initialize in interface (Bug #2806402)
|
||||||
- Fixed: Race condition on lock file (Bug #2801583)
|
- Fixed: Race condition on lock file (Bug #2801583)
|
||||||
- Fixed: Modified entry does not refresh Entry Details Pane (Bug #2782262)
|
- Fixed: Modified entry does not refresh Entry Details Pane (Bug #2782262)
|
||||||
- Fixed: Logoff doesn't close database correctly (Bug #2726197)
|
- Fixed: Logoff doesn't close database correctly (Bug #2726197)
|
||||||
- Fixed: Incorrect auto-type keymapping when KeePassX is in autostart
|
- Fixed: Incorrect auto-type keymapping when KeePassX is in autostart
|
||||||
- Fixed: Workspace is being locked after auto-type
|
- Fixed: Workspace is being locked after auto-type
|
||||||
- Fixed: Wrong "Key Stroke Delay" (Bug #2716877)
|
- Fixed: compiler warning/error "format not a string literal and no format arguments" (Bug #2815290)
|
||||||
|
- Fixed: Makefile uninstall target removes system directories (Bug #2830345)
|
||||||
- Fixed key rounds benchmark to return incorrect results
|
- Fixed key rounds benchmark to return incorrect results
|
||||||
- Set default auto-type key stroke delay to 5ms
|
- Set default auto-type key stroke delay to 5ms
|
||||||
- Removed "Close to Tray" option
|
- Removed "Close to Tray" option
|
||||||
|
|
|
@ -1456,7 +1456,9 @@ bool Kdb3Database::save(){
|
||||||
int size = EncryptedPartSize+DB_HEADER_SIZE;
|
int size = EncryptedPartSize+DB_HEADER_SIZE;
|
||||||
|
|
||||||
if (!File->resize(size)){
|
if (!File->resize(size)){
|
||||||
|
// only recreate file if the new database is smaller
|
||||||
if (File->size() > size) {
|
if (File->size() > size) {
|
||||||
|
qDebug("Unable to resize, trying to recreate file");
|
||||||
if (!File->remove() || !File->open(QIODevice::ReadWrite)) {
|
if (!File->remove() || !File->open(QIODevice::ReadWrite)) {
|
||||||
delete [] buffer;
|
delete [] buffer;
|
||||||
error=decodeFileError(File->error());
|
error=decodeFileError(File->error());
|
||||||
|
|
|
@ -19,7 +19,11 @@
|
||||||
#include <QDesktopWidget>
|
#include <QDesktopWidget>
|
||||||
#include "AutoTypeDlg.h"
|
#include "AutoTypeDlg.h"
|
||||||
|
|
||||||
|
bool AutoTypeDlg::dialogVisible = false;
|
||||||
|
|
||||||
AutoTypeDlg::AutoTypeDlg(QList<IEntryHandle*> entries, QList<int> numbers, bool wasLocked) : pWasLocked(wasLocked){
|
AutoTypeDlg::AutoTypeDlg(QList<IEntryHandle*> entries, QList<int> numbers, bool wasLocked) : pWasLocked(wasLocked){
|
||||||
|
Q_ASSERT(!dialogVisible);
|
||||||
|
dialogVisible = true;
|
||||||
setupUi(this);
|
setupUi(this);
|
||||||
|
|
||||||
setAttribute(Qt::WA_DeleteOnClose);
|
setAttribute(Qt::WA_DeleteOnClose);
|
||||||
|
@ -86,8 +90,14 @@ void AutoTypeDlg::paintEvent(QPaintEvent* event){
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutoTypeDlg::resizeEvent(QResizeEvent* event){
|
void AutoTypeDlg::resizeEvent(QResizeEvent* event){
|
||||||
Q_UNUSED(event);
|
|
||||||
createBanner(&BannerPixmap,getPixmap("keepassx_large"),tr("Auto-Type"),width());
|
createBanner(&BannerPixmap,getPixmap("keepassx_large"),tr("Auto-Type"),width());
|
||||||
|
QWidget::resizeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AutoTypeDlg::closeEvent(QCloseEvent* event) {
|
||||||
|
Q_ASSERT(dialogVisible);
|
||||||
|
dialogVisible = false;
|
||||||
|
QWidget::closeEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AutoTypeDlg::event(QEvent* event){
|
bool AutoTypeDlg::event(QEvent* event){
|
||||||
|
|
|
@ -25,10 +25,12 @@ class AutoTypeDlg : public QWidget, private Ui::AutoTypeDlg
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AutoTypeDlg(QList<IEntryHandle*> entries, QList<int> numbers, bool wasLocked);
|
AutoTypeDlg(QList<IEntryHandle*> entries, QList<int> numbers, bool wasLocked);
|
||||||
|
inline static bool isDialogVisible() { return dialogVisible; };
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void paintEvent(QPaintEvent* event);
|
void paintEvent(QPaintEvent* event);
|
||||||
void resizeEvent(QResizeEvent* event);
|
void resizeEvent(QResizeEvent* event);
|
||||||
|
void closeEvent(QCloseEvent* event);
|
||||||
bool event(QEvent* event);
|
bool event(QEvent* event);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
@ -43,4 +45,5 @@ class AutoTypeDlg : public QWidget, private Ui::AutoTypeDlg
|
||||||
QHash<QTreeWidgetItem*,AutoTypeEntry> itemToEntry;
|
QHash<QTreeWidgetItem*,AutoTypeEntry> itemToEntry;
|
||||||
QPixmap BannerPixmap;
|
QPixmap BannerPixmap;
|
||||||
bool pWasLocked;
|
bool pWasLocked;
|
||||||
|
static bool dialogVisible;
|
||||||
};
|
};
|
||||||
|
|
|
@ -38,6 +38,8 @@ AutoTypeGlobalX11::AutoTypeGlobalX11(KeepassMainWindow* mainWin) : AutoTypeX11(m
|
||||||
focusedWindow = 0;
|
focusedWindow = 0;
|
||||||
oldCode = 0;
|
oldCode = 0;
|
||||||
oldMod = 0;
|
oldMod = 0;
|
||||||
|
inGlobalAutoType = false;
|
||||||
|
|
||||||
//windowBlacklist << "kicker" << "KDE Desktop";
|
//windowBlacklist << "kicker" << "KDE Desktop";
|
||||||
classBlacklist << "desktop_window" << "gnome-panel"; // Gnome
|
classBlacklist << "desktop_window" << "gnome-panel"; // Gnome
|
||||||
classBlacklist << "kdesktop" << "kicker"; // KDE 3
|
classBlacklist << "kdesktop" << "kicker"; // KDE 3
|
||||||
|
@ -51,11 +53,21 @@ void AutoTypeGlobalX11::updateKeymap() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutoTypeGlobalX11::perform(IEntryHandle* entry, bool hideWindow, int nr, bool wasLocked){
|
void AutoTypeGlobalX11::perform(IEntryHandle* entry, bool hideWindow, int nr, bool wasLocked){
|
||||||
|
if (inGlobalAutoType)
|
||||||
|
return;
|
||||||
|
inGlobalAutoType = true;
|
||||||
|
|
||||||
if (focusedWindow && (!hideWindow || wasLocked)) { // detect if global auto-type
|
if (focusedWindow && (!hideWindow || wasLocked)) { // detect if global auto-type
|
||||||
XSetInputFocus(dpy, focusedWindow, RevertToPointerRoot, CurrentTime);
|
XSetInputFocus(dpy, focusedWindow, RevertToPointerRoot, CurrentTime);
|
||||||
focusedWindow = 0;
|
focusedWindow = 0;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
focusWindow = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
AutoTypeX11::perform(entry, hideWindow, nr, wasLocked);
|
AutoTypeX11::perform(entry, hideWindow, nr, wasLocked);
|
||||||
|
|
||||||
|
inGlobalAutoType = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutoTypeGlobalX11::windowTitles(Window window, QStringList& titleList){
|
void AutoTypeGlobalX11::windowTitles(Window window, QStringList& titleList){
|
||||||
|
@ -99,9 +111,10 @@ void AutoTypeGlobalX11::windowTitles(Window window, QStringList& titleList){
|
||||||
for (uint i=0; i<num_children; i++)
|
for (uint i=0; i<num_children; i++)
|
||||||
windowTitles(children[i], titleList);
|
windowTitles(children[i], titleList);
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
XFree(children);
|
XFree(children);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QStringList AutoTypeGlobalX11::getAllWindowTitles(){
|
QStringList AutoTypeGlobalX11::getAllWindowTitles(){
|
||||||
QStringList titleList;
|
QStringList titleList;
|
||||||
|
@ -111,6 +124,13 @@ void AutoTypeGlobalX11::windowTitles(Window window, QStringList& titleList){
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutoTypeGlobalX11::performGlobal(){
|
void AutoTypeGlobalX11::performGlobal(){
|
||||||
|
if (AutoTypeDlg::isDialogVisible()) {
|
||||||
|
qWarning("Already performing auto-type, ignoring this one");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
focusWindow = getFocusWindow();
|
||||||
|
|
||||||
bool wasLocked = mainWin->isLocked();
|
bool wasLocked = mainWin->isLocked();
|
||||||
if (wasLocked)
|
if (wasLocked)
|
||||||
mainWin->OnUnLockWorkspace();
|
mainWin->OnUnLockWorkspace();
|
||||||
|
|
|
@ -47,6 +47,7 @@ class AutoTypeGlobalX11 : public AutoTypeX11, public AutoTypeGlobal {
|
||||||
Window focusedWindow;
|
Window focusedWindow;
|
||||||
int oldCode;
|
int oldCode;
|
||||||
uint oldMod;
|
uint oldMod;
|
||||||
|
bool inGlobalAutoType;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _AUTOTYPEGLOBALX11_H_
|
#endif // _AUTOTYPEGLOBALX11_H_
|
||||||
|
|
|
@ -38,6 +38,7 @@ AutoTypeAction::AutoTypeAction(AutoTypeActionType t, KeySym d) : type(t), data(d
|
||||||
AutoTypeX11::AutoTypeX11(KeepassMainWindow* mainWin) {
|
AutoTypeX11::AutoTypeX11(KeepassMainWindow* mainWin) {
|
||||||
this->mainWin = mainWin;
|
this->mainWin = mainWin;
|
||||||
dpy = QX11Info::display();
|
dpy = QX11Info::display();
|
||||||
|
inAutoType = false;
|
||||||
|
|
||||||
keysym_table = NULL;
|
keysym_table = NULL;
|
||||||
alt_mask = 0;
|
alt_mask = 0;
|
||||||
|
@ -57,7 +58,18 @@ void AutoTypeX11::updateKeymap() {
|
||||||
meta_mask = Mod4Mask;
|
meta_mask = Mod4Mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Window AutoTypeX11::getFocusWindow() {
|
||||||
|
Window w;
|
||||||
|
int revert_to_return;
|
||||||
|
XGetInputFocus(dpy, &w, &revert_to_return);
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
void AutoTypeX11::perform(IEntryHandle* entry, bool hideWindow, int nr, bool wasLocked){
|
void AutoTypeX11::perform(IEntryHandle* entry, bool hideWindow, int nr, bool wasLocked){
|
||||||
|
if (inAutoType)
|
||||||
|
return;
|
||||||
|
inAutoType = true;
|
||||||
|
|
||||||
QString indexStr;
|
QString indexStr;
|
||||||
if (nr==0)
|
if (nr==0)
|
||||||
indexStr = "Auto-Type:";
|
indexStr = "Auto-Type:";
|
||||||
|
@ -130,8 +142,16 @@ void AutoTypeX11::perform(IEntryHandle* entry, bool hideWindow, int nr, bool was
|
||||||
QApplication::processEvents();
|
QApplication::processEvents();
|
||||||
sleepTime(config->autoTypePreGap());
|
sleepTime(config->autoTypePreGap());
|
||||||
|
|
||||||
|
if (!focusWindow)
|
||||||
|
focusWindow = getFocusWindow();
|
||||||
|
|
||||||
QString type;
|
QString type;
|
||||||
for(int i=0;i<Keys.size();i++){
|
for(int i=0;i<Keys.size();i++){
|
||||||
|
if (focusWindow != getFocusWindow()) {
|
||||||
|
qWarning("Focus window changed, interrupting auto-type");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (Keys[i].type==TypeKey){
|
if (Keys[i].type==TypeKey){
|
||||||
SendKeyPressedEvent(Keys[i].data, 0);
|
SendKeyPressedEvent(Keys[i].data, 0);
|
||||||
sleepKeyStrokeDelay();
|
sleepKeyStrokeDelay();
|
||||||
|
@ -154,6 +174,9 @@ void AutoTypeX11::perform(IEntryHandle* entry, bool hideWindow, int nr, bool was
|
||||||
if (hideWindow && !(config->showSysTrayIcon() && config->minimizeTray()) )
|
if (hideWindow && !(config->showSysTrayIcon() && config->minimizeTray()) )
|
||||||
mainWin->showMinimized();
|
mainWin->showMinimized();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inAutoType = false;
|
||||||
|
focusWindow = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutoTypeX11::sleepTime(int msec){
|
void AutoTypeX11::sleepTime(int msec){
|
||||||
|
|
|
@ -53,6 +53,7 @@ class AutoTypeX11 : public AutoType {
|
||||||
void SendKeyPressedEvent(KeySym keysym, unsigned int shift);
|
void SendKeyPressedEvent(KeySym keysym, unsigned int shift);
|
||||||
void SendEvent(XKeyEvent *event);
|
void SendEvent(XKeyEvent *event);
|
||||||
static int MyErrorHandler(Display *my_dpy, XErrorEvent *event);
|
static int MyErrorHandler(Display *my_dpy, XErrorEvent *event);
|
||||||
|
Window getFocusWindow();
|
||||||
|
|
||||||
KeepassMainWindow* mainWin;
|
KeepassMainWindow* mainWin;
|
||||||
Display* dpy;
|
Display* dpy;
|
||||||
|
@ -65,6 +66,10 @@ class AutoTypeX11 : public AutoType {
|
||||||
int altgr_mask;
|
int altgr_mask;
|
||||||
KeySym altgr_keysym;
|
KeySym altgr_keysym;
|
||||||
bool reReadKeymap;
|
bool reReadKeymap;
|
||||||
|
Window focusWindow;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool inAutoType;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _AUTOTYPEX11_H_
|
#endif // _AUTOTYPEX11_H_
|
||||||
|
|
Loading…
Reference in New Issue