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){
 | 
				
			||||||
| 
						 | 
					@ -95,12 +107,13 @@ void AutoTypeGlobalX11::windowTitles(Window window, QStringList& titleList){
 | 
				
			||||||
	Window* children = NULL;
 | 
						Window* children = NULL;
 | 
				
			||||||
	unsigned int num_children;
 | 
						unsigned int num_children;
 | 
				
			||||||
	int tree = XQueryTree(dpy, window, &root, &parent, &children, &num_children);
 | 
						int tree = XQueryTree(dpy, window, &root, &parent, &children, &num_children);
 | 
				
			||||||
	if (tree && children){
 | 
						if (tree && children) {
 | 
				
			||||||
		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(){
 | 
				
			||||||
| 
						 | 
					@ -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