From 9e8f6a336ac5f29a68226622f0d35bd2e711d8fd Mon Sep 17 00:00:00 2001 From: tariq Date: Sat, 8 Apr 2006 15:57:13 +0000 Subject: [PATCH] AutoType: Finished X11 implementation for faked key press events from unicode chars (also with modifiers). git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@70 b624d157-de02-0410-bad0-e51aec6abb33 --- src/lib/AutoType.cpp | 68 +++++++++++++++++++++++++++++++++----------- src/lib/AutoType.h | 12 +++++++- src/mainwindow.cpp | 2 -- 3 files changed, 62 insertions(+), 20 deletions(-) diff --git a/src/lib/AutoType.cpp b/src/lib/AutoType.cpp index f526e27..95d56f7 100644 --- a/src/lib/AutoType.cpp +++ b/src/lib/AutoType.cpp @@ -21,35 +21,70 @@ #include "AutoType.h" #include #include -#ifdef Q_WS_X11 - #include - #include -#endif - +/* { 0x05c7, 0x0627 }, Arabic_alef ا ARABIC LETTER ALEF */ QWidget* AutoType::MainWin=NULL; +int AutoType::getModifiers(Display *d,KeySym keysym, int keycode){ +int SymsPerKey; +KeySym* Syms=XGetKeyboardMapping(d,keycode,1,&SymsPerKey); +int c=-1; +for(int i=0;i<4;i++) + if(Syms[i]==keysym){ + c=i; break;} +Q_ASSERT(c!=-1); +XFree(Syms); +return c; +} + +void AutoType::releaseModifiers(Display* d,int mods){ +pressModifiers(d,mods,False); +} + +void AutoType::pressModifiers(Display* d,int mods,bool press){ +int keycode; +switch(mods){ + case 0: //no modifier + break; + case 1: //Shift + XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,5); + break; + case 2: //AltGr + XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,5); + break; + case 3: //Shift+AltGr + XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,5); + XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,5); + break; +} +} + + void AutoType::perform(const QString& string){ -QList Chars; -QString str("Fragezeichen ? Umlaute öäü Euro €"); +QString str=string; +//replace all {..} string templates + +QList Keys; for(int i=0;ihide(); - Display* pDisplay = XOpenDisplay( NULL ); -for(int i=0;ishow(); +} -MainWin->show(); -} tKeysymMap AutoType::KeysymMap[] = @@ -829,10 +864,9 @@ tKeysymMap AutoType::KeysymMap[] = { 0x20ac, 0x20ac }, /* EuroSign € EURO SIGN */ }; -unsigned long AutoType::getKeysym(const QChar& c){ +Q_UINT16 AutoType::getKeysym(const QChar& c){ int MapSize=sizeof(KeysymMap); Q_UINT16 unicode=c.unicode(); - /* first check for Latin-1 characters (1:1 mapping) */ if ((unicode >= 0x0020 && unicode <= 0x007e) || (unicode >= 0x00a0 && unicode <= 0x00ff)) diff --git a/src/lib/AutoType.h b/src/lib/AutoType.h index b932256..c4ec96c 100644 --- a/src/lib/AutoType.h +++ b/src/lib/AutoType.h @@ -23,6 +23,13 @@ #include #include +#ifdef Q_WS_X11 + #define XK_MISCELLANY + #define XK_XKB_KEYS + #include + #include + #include +#endif typedef struct tKeysymMap{ Q_UINT16 keysym; @@ -35,7 +42,10 @@ public: static void perform(const QString& KeePassAutoTypeString); private: static tKeysymMap KeysymMap[]; - static unsigned long getKeysym(const QChar& unicode); + static Q_UINT16 getKeysym(const QChar& unicode); + static int getModifiers(Display*,KeySym,int); + static void pressModifiers(Display*,int,bool Press=true); + static void releaseModifiers(Display*,int); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 8ad17ac..9a0104c 100755 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -324,8 +324,6 @@ return true; void KeepassMainWindow::OnFileNew(){ -AutoType::perform(""); -return; if(FileOpen) if(!closeDatabase())return; CPasswordDialog dlg(this,"PasswordDlg",true,false,true);