Added "Tools" button to EditEntryDlg: Window List and Auto-Type sequence
git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@228 b624d157-de02-0410-bad0-e51aec6abb33
This commit is contained in:
		
							parent
							
								
									a5d427d262
								
							
						
					
					
						commit
						699befe618
					
				| 
						 | 
				
			
			@ -23,7 +23,7 @@
 | 
			
		|||
#include "PasswordGenDlg.h"
 | 
			
		||||
#include "EditEntryDlg.h"
 | 
			
		||||
#include "CalendarDlg.h"
 | 
			
		||||
 | 
			
		||||
#include "TargetWindowDlg.h"
 | 
			
		||||
 | 
			
		||||
CEditEntryDlg::CEditEntryDlg(IDatabase* _db, IEntryHandle* _entry,QWidget* parent,  bool modal, bool newEntry)
 | 
			
		||||
: QDialog(parent)
 | 
			
		||||
| 
						 | 
				
			
			@ -107,10 +107,6 @@ CEditEntryDlg::CEditEntryDlg(IDatabase* _db, IEntryHandle* _entry,QWidget* paren
 | 
			
		|||
	Edit_Comment->setPlainText(entry->comment());
 | 
			
		||||
	InitGroupComboBox();
 | 
			
		||||
 | 
			
		||||
/* MX-TO-DO: After approval, remove this invokation
 | 
			
		||||
	InitIconComboBox();
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
	if(!entry->binarySize()){
 | 
			
		||||
		ButtonSaveAttachment->setDisabled(true);
 | 
			
		||||
		ButtonDeleteAttachment->setDisabled(true);
 | 
			
		||||
| 
						 | 
				
			
			@ -126,12 +122,22 @@ CEditEntryDlg::CEditEntryDlg(IDatabase* _db, IEntryHandle* _entry,QWidget* paren
 | 
			
		|||
	else{
 | 
			
		||||
		DateTime_Expire->setDateTime(entry->expire());
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
#ifdef AUTOTYPE
 | 
			
		||||
	QToolButton* buttonTools = new QToolButton(buttonBox);
 | 
			
		||||
	buttonTools->setText("Tools");
 | 
			
		||||
	buttonTools->setPopupMode(QToolButton::InstantPopup);
 | 
			
		||||
	QMenu* menuTools = new QMenu(buttonTools);
 | 
			
		||||
	connect(menuTools->addAction("Auto-Type: Customize Sequence"), SIGNAL(triggered(bool)), SLOT(OnCustomizeSequence()));
 | 
			
		||||
#ifdef GLOBAL_AUTOTYPE
 | 
			
		||||
	connect(menuTools->addAction("Auto-Type: Select target window"), SIGNAL(triggered(bool)), SLOT(OnSelectTarget()));
 | 
			
		||||
#endif
 | 
			
		||||
	buttonTools->setMenu(menuTools);
 | 
			
		||||
	buttonBox->addButton(buttonTools, QDialogButtonBox::ResetRole); // ResetRole: workaround to display button on the left
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CEditEntryDlg::~CEditEntryDlg()
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CEditEntryDlg::~CEditEntryDlg(){
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CEditEntryDlg::resizeEvent(QResizeEvent *event){
 | 
			
		||||
| 
						 | 
				
			
			@ -148,16 +154,6 @@ void CEditEntryDlg::paintEvent(QPaintEvent *event){
 | 
			
		|||
	painter.drawPixmap(QPoint(0,0),BannerPixmap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* MX-TO-DO: After approval, remove this implementation
 | 
			
		||||
 | 
			
		||||
void CEditEntryDlg::InitIconComboBox(){
 | 
			
		||||
	for(int i=0;i<db->numIcons();i++){
 | 
			
		||||
		Combo_IconPicker->insertItem(i,db->icon(i),"");
 | 
			
		||||
	}
 | 
			
		||||
	Combo_IconPicker->setCurrentIndex(entry->image());
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void CEditEntryDlg::InitGroupComboBox(){
 | 
			
		||||
	QString Space;
 | 
			
		||||
	groups=db->sortedGroups();
 | 
			
		||||
| 
						 | 
				
			
			@ -433,3 +429,25 @@ void CEditEntryDlg::OnCalendar(QAction* action){
 | 
			
		|||
void CEditEntryDlg::OnClose(){
 | 
			
		||||
	config->setDialogGeometry(this);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void CEditEntryDlg::OnCustomizeSequence(){
 | 
			
		||||
#ifdef AUTOTYPE
 | 
			
		||||
	QString text = Edit_Comment->toPlainText();
 | 
			
		||||
	if (!text.isEmpty())
 | 
			
		||||
		text.append("\n");
 | 
			
		||||
	Edit_Comment->setPlainText(text.append("Auto-Type: {USERNAME}{TAB}{PASSWORD}{ENTER}"));
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CEditEntryDlg::OnSelectTarget(){
 | 
			
		||||
#ifdef GLOBAL_AUTOTYPE
 | 
			
		||||
	TargetWindowDlg dlg(this);
 | 
			
		||||
	if (dlg.exec() && !dlg.windowTitle().isEmpty()){
 | 
			
		||||
		QString text = Edit_Comment->toPlainText();
 | 
			
		||||
		if (!text.isEmpty())
 | 
			
		||||
			text.append("\n");
 | 
			
		||||
		Edit_Comment->setPlainText(text.append(dlg.windowTitle()));
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,9 +31,6 @@ class CEditEntryDlg : public QDialog, private Ui_EditEntryDialog
 | 
			
		|||
		CEditEntryDlg(IDatabase* _db, IEntryHandle* _entry,QWidget* parent = 0,  bool modal = FALSE, bool newEntry = FALSE);
 | 
			
		||||
		~CEditEntryDlg();
 | 
			
		||||
		void InitGroupComboBox();
 | 
			
		||||
/* MX-TO-DO: Remove this declaration
 | 
			
		||||
		void InitIconComboBox();
 | 
			
		||||
*/
 | 
			
		||||
		static void saveAttachment(IEntryHandle* pEntry, QWidget* ParentWidget=NULL);
 | 
			
		||||
		
 | 
			
		||||
		IEntryHandle* entry;
 | 
			
		||||
| 
						 | 
				
			
			@ -60,6 +57,8 @@ class CEditEntryDlg : public QDialog, private Ui_EditEntryDialog
 | 
			
		|||
		void OnExpirePreset(QAction* action);
 | 
			
		||||
		void OnCalendar(QAction* action);
 | 
			
		||||
		void OnClose();
 | 
			
		||||
		void OnCustomizeSequence();
 | 
			
		||||
		void OnSelectTarget();
 | 
			
		||||
		
 | 
			
		||||
	private:
 | 
			
		||||
		virtual void paintEvent(QPaintEvent*);
 | 
			
		||||
| 
						 | 
				
			
			@ -70,4 +69,3 @@ class CEditEntryDlg : public QDialog, private Ui_EditEntryDialog
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -448,7 +448,6 @@ void CGenPwDialog::generatePasswordInternal(char* buffer, int length){
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else{
 | 
			
		||||
		qDebug("ja");
 | 
			
		||||
		for (int i=0; i<length; i++)
 | 
			
		||||
			buffer[i] = assoctable[randint(num)];
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,37 @@
 | 
			
		|||
/***************************************************************************
 | 
			
		||||
 *   Copyright (C) 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 "TargetWindowDlg.h"
 | 
			
		||||
#include "AutoType.h"
 | 
			
		||||
 | 
			
		||||
TargetWindowDlg::TargetWindowDlg(QWidget* parent) : QDialog(parent){
 | 
			
		||||
	setupUi(this);
 | 
			
		||||
	QStringList windowTitles = AutoType::getAllWindowTitles();
 | 
			
		||||
	windowTitles.sort();
 | 
			
		||||
	for (QStringList::const_iterator i = windowTitles.constBegin(); i != windowTitles.constEnd(); ++i)
 | 
			
		||||
		comboWindow->addItem(*i);
 | 
			
		||||
	
 | 
			
		||||
	connect(buttonBox, SIGNAL(accepted()), SLOT(OnAccept()));
 | 
			
		||||
	connect(buttonBox, SIGNAL(rejected()), SLOT(reject()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TargetWindowDlg::OnAccept(){
 | 
			
		||||
	pWindowTitle = comboWindow->itemText(comboWindow->currentIndex());
 | 
			
		||||
	accept();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,40 @@
 | 
			
		|||
/***************************************************************************
 | 
			
		||||
 *   Copyright (C) 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 TARGETWINDOWDLG_H
 | 
			
		||||
#define TARGETWINDOWDLG_H
 | 
			
		||||
 | 
			
		||||
#include "ui_TargetWindowDlg.h"
 | 
			
		||||
 | 
			
		||||
class TargetWindowDlg : public QDialog, private Ui_TargetWindowDlg
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
	
 | 
			
		||||
	public:
 | 
			
		||||
		TargetWindowDlg(QWidget* parent);
 | 
			
		||||
		inline QString windowTitle() { return pWindowTitle; };
 | 
			
		||||
	
 | 
			
		||||
	private slots:
 | 
			
		||||
		void OnAccept();
 | 
			
		||||
	
 | 
			
		||||
	private:
 | 
			
		||||
		QString pWindowTitle;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // TARGETWINDOWDLG_H
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,42 @@
 | 
			
		|||
<ui version="4.0" >
 | 
			
		||||
 <class>TargetWindowDlg</class>
 | 
			
		||||
 <widget class="QDialog" name="TargetWindowDlg" >
 | 
			
		||||
  <property name="geometry" >
 | 
			
		||||
   <rect>
 | 
			
		||||
    <x>0</x>
 | 
			
		||||
    <y>0</y>
 | 
			
		||||
    <width>574</width>
 | 
			
		||||
    <height>145</height>
 | 
			
		||||
   </rect>
 | 
			
		||||
  </property>
 | 
			
		||||
  <property name="windowTitle" >
 | 
			
		||||
   <string>Auto-Type: Select Target Window</string>
 | 
			
		||||
  </property>
 | 
			
		||||
  <layout class="QVBoxLayout" name="verticalLayout" >
 | 
			
		||||
   <item>
 | 
			
		||||
    <widget class="QLabel" name="label" >
 | 
			
		||||
     <property name="text" >
 | 
			
		||||
      <string>To specify the target window, either select an existing currently-opened window
 | 
			
		||||
from the drop-down list, or enter the window title manually:</string>
 | 
			
		||||
     </property>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item>
 | 
			
		||||
    <widget class="QComboBox" name="comboWindow" >
 | 
			
		||||
     <property name="editable" >
 | 
			
		||||
      <bool>true</bool>
 | 
			
		||||
     </property>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
   <item>
 | 
			
		||||
    <widget class="QDialogButtonBox" name="buttonBox" >
 | 
			
		||||
     <property name="standardButtons" >
 | 
			
		||||
      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
 | 
			
		||||
     </property>
 | 
			
		||||
    </widget>
 | 
			
		||||
   </item>
 | 
			
		||||
  </layout>
 | 
			
		||||
 </widget>
 | 
			
		||||
 <resources/>
 | 
			
		||||
 <connections/>
 | 
			
		||||
</ui>
 | 
			
		||||
| 
						 | 
				
			
			@ -40,6 +40,8 @@ class AutoType{
 | 
			
		|||
		static void performGlobal();
 | 
			
		||||
		static bool registerGlobalShortcut(const Shortcut& s);
 | 
			
		||||
		static void unregisterGlobalShortcut();
 | 
			
		||||
		static void init();
 | 
			
		||||
		static QStringList getAllWindowTitles();
 | 
			
		||||
#endif // GLOBAL_AUTOTYPE
 | 
			
		||||
};
 | 
			
		||||
#endif // AUTOTYPE
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -159,6 +159,64 @@ void AutoType::perform(IEntryHandle* entry, QString& err,bool hideWindow,int nr)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
#ifdef GLOBAL_AUTOTYPE
 | 
			
		||||
 | 
			
		||||
Window windowRoot;
 | 
			
		||||
QStringList windowBlacklist;
 | 
			
		||||
Atom wm_state;
 | 
			
		||||
 | 
			
		||||
void windowTitles(Window window, QStringList& titleList){
 | 
			
		||||
	Display* d = QX11Info::display();
 | 
			
		||||
	
 | 
			
		||||
	Atom type = None;
 | 
			
		||||
	int format;
 | 
			
		||||
	unsigned long nitems, after;
 | 
			
		||||
	unsigned char* data;
 | 
			
		||||
	XGetWindowProperty(d, window, wm_state, 0, 0, false, AnyPropertyType, &type, &format, &nitems, &after, &data);
 | 
			
		||||
	if (type){
 | 
			
		||||
		XTextProperty textProp;
 | 
			
		||||
		if (XGetWMName(d, window, &textProp) != 0) {
 | 
			
		||||
			char** list = NULL;
 | 
			
		||||
			int count;
 | 
			
		||||
			if (Xutf8TextPropertyToTextList(d, &textProp, &list, &count)>=0 && list){
 | 
			
		||||
				QString title = QString::fromUtf8(list[0]);
 | 
			
		||||
				if (window!=windowRoot && window!=AutoType::MainWin->winId() &&
 | 
			
		||||
				    (QApplication::activeWindow()==NULL || window!=QApplication::activeWindow()->winId()) &&
 | 
			
		||||
				    !windowBlacklist.contains(title)
 | 
			
		||||
				){
 | 
			
		||||
					titleList.append(title);
 | 
			
		||||
				}
 | 
			
		||||
				XFreeStringList(list);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	Window root;
 | 
			
		||||
	Window parent;
 | 
			
		||||
	Window* children = NULL;
 | 
			
		||||
	unsigned int num_children;
 | 
			
		||||
	int tree = XQueryTree(d, window, &root, &parent, &children, &num_children);
 | 
			
		||||
	if (tree && children){
 | 
			
		||||
		for (int i=0; i<num_children; i++)
 | 
			
		||||
			windowTitles(children[i], titleList);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
		XFree(children);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AutoType::init(){
 | 
			
		||||
	Display* d = QX11Info::display();
 | 
			
		||||
	wm_state = XInternAtom(d, "WM_STATE", true);
 | 
			
		||||
	windowRoot = XRootWindow(d, MainWin->x11Info().screen());
 | 
			
		||||
	windowBlacklist << "kicker" << "KDE Desktop";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QStringList AutoType::getAllWindowTitles(){
 | 
			
		||||
	QStringList titleList;
 | 
			
		||||
	if (wm_state) // don't do anything if WM_STATE doesn't exist
 | 
			
		||||
		windowTitles(windowRoot, titleList);
 | 
			
		||||
	return titleList;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AutoType::performGlobal(){
 | 
			
		||||
	if (MainWin->isLocked())
 | 
			
		||||
		MainWin->OnUnLockWorkspace();
 | 
			
		||||
| 
						 | 
				
			
			@ -277,7 +335,7 @@ bool AutoType::registerGlobalShortcut(const Shortcut& s){
 | 
			
		|||
		return true;
 | 
			
		||||
	
 | 
			
		||||
	Display* display = QX11Info::display();
 | 
			
		||||
	Window root = XDefaultRootWindow(display);
 | 
			
		||||
	Window root = XRootWindow(display, MainWin->x11Info().screen());
 | 
			
		||||
	int code=XKeysymToKeycode(display, HelperX11::getKeysym(s.key));
 | 
			
		||||
	int mod=HelperX11::getShortcutModifierMask(s);
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -195,6 +195,9 @@ int main(int argc, char **argv)
 | 
			
		|||
 | 
			
		||||
	QApplication::setQuitOnLastWindowClosed(false);
 | 
			
		||||
	KeepassMainWindow *mainWin = new KeepassMainWindow(args.file(), args.startMinimized(), args.startLocked());
 | 
			
		||||
#ifdef GLOBAL_AUTOTYPE
 | 
			
		||||
	AutoType::init();
 | 
			
		||||
#endif
 | 
			
		||||
	int r=app->exec();
 | 
			
		||||
	delete mainWin;
 | 
			
		||||
	delete eventListener;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -112,9 +112,9 @@ isEqual(QMAKE_WIN32,1){
 | 
			
		|||
INSTALLS += target data
 | 
			
		||||
 | 
			
		||||
contains(DEFINES,GLOBAL_AUTOTYPE){
 | 
			
		||||
	FORMS += forms/AutoTypeDlg.ui
 | 
			
		||||
	HEADERS += dialogs/AutoTypeDlg.h lib/AutoTypeTreeWidget.h
 | 
			
		||||
	SOURCES += dialogs/AutoTypeDlg.cpp lib/AutoTypeTreeWidget.cpp
 | 
			
		||||
	FORMS += forms/AutoTypeDlg.ui forms/TargetWindowDlg.ui
 | 
			
		||||
	HEADERS += dialogs/AutoTypeDlg.h lib/AutoTypeTreeWidget.h dialogs/TargetWindowDlg.h
 | 
			
		||||
	SOURCES += dialogs/AutoTypeDlg.cpp lib/AutoTypeTreeWidget.cpp dialogs/TargetWindowDlg.cpp
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue