?? autotype_x11.cpp
字號:
/*************************************************************************** * Copyright (C) 2005-2006 by Tarek Saidi * * tarek.saidi@arcor.de * * * * 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; either version 2 of the License, or * * (at your option) any later version. * * * * 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 <QApplication>#include "AutoType.h"#include <QTime>#include <QList>#include <QChar>QWidget* AutoType::MainWin=NULL; #ifdef Q_WS_X11int 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,2); break; case 2: //AltGr XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,2); break; case 3: //Shift+AltGr XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_Shift_L),press,2); XTestFakeKeyEvent(d,XKeysymToKeycode(d,XK_ISO_Level3_Shift),press,2); break;}}void AutoType::perform(CEntry* entry, QString& err){struct timespec timeOut,remains;timeOut.tv_sec = 0;timeOut.tv_nsec = 300000000; /* 300 milliseconds */for(int i=0;i<10;i++)nanosleep(&timeOut, &remains);QString str;int c=entry->Additional.count("Auto-Type:");if(c>1){ err=tr("More than one 'Auto-Type:' key sequence found.\nAllowed is only one per entry."); return;}if(c==1){ int start=entry->Additional.indexOf("Auto-Type:")+10; int len; if(entry->Additional.size()==10)return; for(len=0;len<entry->Additional.size();len++){ if(entry->Additional.size()==(start+len))break; if(entry->Additional.at(start+len)==QChar('\n'))break;} if(!len)return; str=entry->Additional.mid(start,len);}else str="{USERNAME}{TAB}{PASSWORD}{ENTER}";QList<quint16> Keys;for(int i=0;i<str.size();i++){ if(str[i]=='{'){ int start=i; QString tmpl; i++; while(str[i]!='}' && i<str.size()){ tmpl += str[i]; i++; } if(i>=str.size()){ err=tr("Syntax Error in Auto-Type sequence near character %1\n\ Found '{' without closing '}'").arg(i+10); return; } templateToKeysyms(tmpl.toLower(),Keys,entry); continue; } else Keys << getKeysym(str[i]);}MainWin->hide();Display* pDisplay = XOpenDisplay( NULL );for(int i=0;i<Keys.size();i++){ int keycode=XKeysymToKeycode(pDisplay,Keys[i]); int mods=getModifiers(pDisplay,Keys[i],keycode); pressModifiers(pDisplay,mods); XTestFakeKeyEvent(pDisplay,keycode,True,0); XTestFakeKeyEvent(pDisplay,keycode,False,1); releaseModifiers(pDisplay,mods);}XCloseDisplay(pDisplay);MainWin->show();}void AutoType::templateToKeysyms(const QString& tmpl, QList<quint16>& keys,CEntry* entry){//tmpl must be lower case!!!if(!tmpl.compare("title")){ stringToKeysyms(entry->Title,keys); return;}if(!tmpl.compare("username")){ stringToKeysyms(entry->UserName,keys); return;}if(!tmpl.compare("url")){ stringToKeysyms(entry->URL,keys); return;}if(!tmpl.compare("password")){ entry->Password.unlock(); stringToKeysyms(entry->Password.string(),keys); entry->Password.lock(); return;}if(!tmpl.compare("space")){ keys << getKeysym(' '); return;}if(!tmpl.compare("backspace") || !tmpl.compare("bs") || !tmpl.compare("bksp")){ keys << XK_BackSpace; return;}if(!tmpl.compare("break")){ keys << XK_Break; return;}if(!tmpl.compare("capslock")){ keys << XK_Caps_Lock; return;}if(!tmpl.compare("del") || !tmpl.compare("delete")){ keys << XK_Delete; return;}if(!tmpl.compare("end")){ keys << XK_End; return;}if(!tmpl.compare("enter")){ keys << XK_Return; return;}if(!tmpl.compare("esc")){ keys << XK_Escape; return;}if(!tmpl.compare("help")){ keys << XK_Help; return;}if(!tmpl.compare("home")){ keys << XK_Home; return;}if(!tmpl.compare("ins")){ keys << XK_Insert; return;}if(!tmpl.compare("numlock")){ keys << XK_Num_Lock; return;}if(!tmpl.compare("scroll")){ keys << XK_Scroll_Lock; return;}if(!tmpl.compare("pgdn")){ keys << XK_Page_Down; return;}if(!tmpl.compare("pgup")){ keys << XK_Page_Up; return;}if(!tmpl.compare("prtsc")){ keys << XK_3270_PrintScreen; return;}if(!tmpl.compare("up")){ keys << XK_Up; return;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -