From 29f3d8b2b367620cd0d7fda6989acad79f9f9181 Mon Sep 17 00:00:00 2001 From: tarek_saidi Date: Sun, 22 Oct 2006 23:20:54 +0000 Subject: [PATCH] CollectEntryDlg: fixed random crashes caused by first external paint event, finished collection routines. git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@109 b624d157-de02-0410-bad0-e51aec6abb33 --- src/dialogs/CollectEntropyDlg.cpp | 54 +++++++++++++++++++++++++++++-- src/dialogs/CollectEntropyDlg.h | 12 +++++++ src/forms/CollectEntropyDlg.ui | 42 +++++++++++++----------- src/lib/WaitAnimationWidget.cpp | 50 ++++++++++++++++++++-------- src/lib/WaitAnimationWidget.h | 3 ++ src/main.cpp | 8 +++-- src/mainwindow.cpp | 6 ++-- 7 files changed, 135 insertions(+), 40 deletions(-) diff --git a/src/dialogs/CollectEntropyDlg.cpp b/src/dialogs/CollectEntropyDlg.cpp index 2d61c12..fd533f4 100644 --- a/src/dialogs/CollectEntropyDlg.cpp +++ b/src/dialogs/CollectEntropyDlg.cpp @@ -19,15 +19,27 @@ ***************************************************************************/ #include +#include #include "CollectEntropyDlg.h" #include "main.h" CollectEntropyDlg::CollectEntropyDlg(QWidget* parent):QDialog(parent){ setupUi(this); - createBanner(&BannerPixmap,Icon_Settings32x32,tr("Entropy Collection"),width()); - - + createBanner(&BannerPixmap,NULL,tr("Entropy Collection"),width()); + KeyEntropyBuffer=new unsigned char[105]; + MouseEntropyBuffer=new quint16[210]; + KeyCounter=0; + MouseCounter=0; + QTimer* timer=new QTimer(this); + connect(timer,SIGNAL(timeout()),this,SLOT(trackMousePos())); + timer->setInterval(50); + timer->start(); + ReseedDone=false; +} +CollectEntropyDlg::~CollectEntropyDlg(){ + delete [] KeyEntropyBuffer; + delete [] MouseEntropyBuffer; } void CollectEntropyDlg::paintEvent(QPaintEvent *event){ @@ -36,3 +48,39 @@ void CollectEntropyDlg::paintEvent(QPaintEvent *event){ painter.setClipRegion(event->region()); painter.drawPixmap(QPoint(0,0),BannerPixmap); } + +void CollectEntropyDlg::trackMousePos(){ + QPoint p=QCursor::pos(); + if(LastPos-p==QPoint(0,0))return; + LastPos=p; + if(MouseCounter==105 || ReseedDone)return; + MouseEntropyBuffer[2*MouseCounter]=p.x(); + MouseEntropyBuffer[2*MouseCounter+1]=p.y(); + MouseCounter++; + updateProgress(); +} + +void CollectEntropyDlg::keyReleaseEvent(QKeyEvent* event ){ + QDialog::keyReleaseEvent(event); + if(KeyCounter==105 || ReseedDone)return; + KeyEntropyBuffer[KeyCounter]=event->key(); + KeyCounter++; + updateProgress(); +} + +void CollectEntropyDlg::updateProgress(){ + if(4*KeyCounter+4*MouseCounter>=420){ + progressBar->setValue(420); + ReseedDone=true; + + } + else + progressBar->setValue(4*KeyCounter+4*MouseCounter); + +} + +void CollectEntropyDlg::showEvent(QShowEvent* event){ + if(!event->spontaneous()){ + Animation->start(); + } +} diff --git a/src/dialogs/CollectEntropyDlg.h b/src/dialogs/CollectEntropyDlg.h index 7fe53e4..3973d0b 100644 --- a/src/dialogs/CollectEntropyDlg.h +++ b/src/dialogs/CollectEntropyDlg.h @@ -24,15 +24,27 @@ #include "ui_CollectEntropyDlg.h" #include #include +#include class CollectEntropyDlg: public QDialog, public Ui_CollectEntropyDlg{ Q_OBJECT public: CollectEntropyDlg(QWidget* parent); + ~CollectEntropyDlg(); private: QPixmap BannerPixmap; virtual void paintEvent(QPaintEvent* event); + virtual void keyReleaseEvent(QKeyEvent* event ); + virtual void showEvent(QShowEvent* event); + void updateProgress(); + unsigned char* KeyEntropyBuffer; + quint16* MouseEntropyBuffer; + int KeyCounter,MouseCounter; + QPoint LastPos; + bool ReseedDone; + private slots: + void trackMousePos(); }; diff --git a/src/forms/CollectEntropyDlg.ui b/src/forms/CollectEntropyDlg.ui index a22990b..ccfdbe4 100644 --- a/src/forms/CollectEntropyDlg.ui +++ b/src/forms/CollectEntropyDlg.ui @@ -32,22 +32,6 @@ Please move the mouse and/or press some keys until enought entropy for a reseed true - - - - 70 - 140 - 391 - 23 - - - - 24 - - - Qt::Horizontal - - @@ -67,13 +51,35 @@ Please move the mouse and/or press some keys until enought entropy for a reseed - 420 - 10 + 8 + 5 41 41 + + + + 10 + 140 + 451 + 23 + + + + 420 + + + 0 + + + Qt::Horizontal + + + %v Bits + + diff --git a/src/lib/WaitAnimationWidget.cpp b/src/lib/WaitAnimationWidget.cpp index 0c7e9d5..db32b56 100644 --- a/src/lib/WaitAnimationWidget.cpp +++ b/src/lib/WaitAnimationWidget.cpp @@ -21,6 +21,8 @@ #include #include #include +#include "PwmConfig.h" +#include "main.h" #include "WaitAnimationWidget.h" @@ -28,9 +30,28 @@ WaitAnimationWidget::WaitAnimationWidget(QWidget* parent):QWidget(parent){ speed=60; setRefreshRate(25); CurAngle=0; - connect(&timer,SIGNAL(timeout()),this,SLOT(refreshAnimation())); - timer.start(); + for(int i=0;i<6;i++){ + float diff=CurAngle-i*0.16666667f; + if(diff>0.5f) + diff=1.0f-diff; + if(diff<-0.5f) + diff=1.0f+diff; + CircSizes[i]=1.0+exp(-14.0f*diff*diff); + } + connect(&timer,SIGNAL(timeout()),this,SLOT(refreshAnimation())); +} +WaitAnimationWidget::~WaitAnimationWidget(){ + timer.stop(); +} + +void WaitAnimationWidget::start(){ + timer.start(); +} + +void WaitAnimationWidget::stop(){ + timer.stop(); + repaint(); } void WaitAnimationWidget::setRefreshRate(int fps){ @@ -53,16 +74,17 @@ void WaitAnimationWidget::refreshAnimation(){ } void WaitAnimationWidget::paintEvent(QPaintEvent* event){ - QPainter painter(this); - painter.setRenderHints(QPainter::Antialiasing,true); - painter.setBrush(QColor(255,255,255)); - painter.setPen(QColor(255,255,255)); - for(int i=0;i<6;i++){ - float d=CircSizes[i]*5.0; - QRectF rect(CircPositions[i].x()-d/2,CircPositions[i].y()-d/2,d,d); - painter.drawEllipse(rect); - - } + if(timer.isActive()){ + QPainter painter(this); + painter.setRenderHints(QPainter::Antialiasing,true); + painter.setBrush(config.BannerTextColor); + painter.setPen(config.BannerTextColor); + for(int i=0;i<6;i++){ + float d=CircSizes[i]*5.0; + QRectF rect(CircPositions[i].x()-d/2,CircPositions[i].y()-d/2,d,d); + painter.drawEllipse(rect); + } + } } void WaitAnimationWidget::resizeEvent(QResizeEvent* event){ @@ -75,5 +97,5 @@ void WaitAnimationWidget::resizeEvent(QResizeEvent* event){ CircPositions[i].setX((r-10)*cos(-2.0*3.14159265*(0.16666667*i))+r); CircPositions[i].setY((r-10)*sin(-2.0*3.14159265*(0.16666667*i))+r); } - -} \ No newline at end of file +} + diff --git a/src/lib/WaitAnimationWidget.h b/src/lib/WaitAnimationWidget.h index 1b89f06..b09ccbe 100644 --- a/src/lib/WaitAnimationWidget.h +++ b/src/lib/WaitAnimationWidget.h @@ -28,8 +28,11 @@ class WaitAnimationWidget:public QWidget{ Q_OBJECT public: WaitAnimationWidget(QWidget* parent); + ~WaitAnimationWidget(); void setSpeed(int rpm){speed=rpm;} void setRefreshRate(int fps); + void start(); + void stop(); public slots: void refreshAnimation(); private: diff --git a/src/main.cpp b/src/main.cpp index c7c42cc..ad19342 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -187,9 +187,11 @@ void createBanner(QPixmap* Pixmap, QPixmap* IconAlpha,const QString& Text,int Wi painter.drawRect(0,0,Width,50); QPixmap Icon(32,32); - Icon.fill(TextColor); - Icon.setAlphaChannel(*IconAlpha); - painter.drawPixmap(10,10,Icon); + if(IconAlpha){ + Icon.fill(TextColor); + Icon.setAlphaChannel(*IconAlpha); + painter.drawPixmap(10,10,Icon); + } painter.setPen(QPen(TextColor)); painter.setFont(QFont(QApplication::font().family(),16)); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 8f3b03e..eceefbb 100755 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -373,13 +373,15 @@ return true; void KeepassMainWindow::OnFileNewKdb(){ - /* + //Test + /* CollectEntropyDlg dialog(this); dialog.exec(); return; - //~Test */ + //~Test + CPasswordDialog dlg(this,true,false,true); dlg.setWindowTitle("New Database");