Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

KeyModifiers.cpp

Go to the documentation of this file.
00001 #include "KeyModifiers.h"
00002 
00003 KeyModifiers::KeyModifiers()
00004 {
00005         qDebug("KeyModifiers::KeyModifiers()");
00006         m_pTimer = new QTimer(this);
00007         connect(m_pTimer, SIGNAL(timeout()),
00008                         this, SLOT(resetToggles()));
00009         init();
00010 }
00011 
00012 KeyModifiers::~KeyModifiers()
00013 {
00014         qDebug("KeyModifiers::~KeyModifiers()");
00015         delete m_pTimer;
00016         clear();
00017 }
00018 
00019 void KeyModifiers::addType(const QString& type)
00020 {
00021         if(m_types.contains(type) == false){
00022                 qDebug("addType[%s][%x]", type.latin1(), m_bitmask);
00023                 m_types.insert(type, m_bitmask);
00024                 m_bitmask = m_bitmask << 1;
00025         }
00026 }
00027 
00028 ModifierInfo* KeyModifiers::assign(const QString& type, int keycode,
00029         int keymask, bool mode)
00030 {
00031         m_info = new ModifierInfo(type, keycode, keymask, mode);
00032         addType(type);
00033         m_modifiers.append(m_info);
00034         if(mode){
00035                 m_togglekeys.append(m_info);
00036         }
00037         assignRelease(m_info, keycode);
00038         return(m_info);
00039 }
00040 
00041 void KeyModifiers::assignRelease(int keycode)
00042 {
00043         assignRelease(m_info, keycode);
00044 }
00045 
00046 void KeyModifiers::assignRelease(ModifierInfo* info, int keycode)
00047 {
00048         if(m_releasekeys.contains(keycode) == false){
00049                 m_releasekeys.insert(keycode, new ModifierList);
00050         }
00051         m_releasekeys[keycode]->append(info);
00052 }
00053 
00054 void KeyModifiers::setToggle()
00055 {
00056         setToggle(m_info);
00057 }
00058 
00059 void KeyModifiers::setToggle(ModifierInfo* info)
00060 {
00061         info->toggle_mode = true;
00062         m_togglekeys.append(info);
00063 }
00064 
00065 void KeyModifiers::keepToggles()
00066 {
00067         if(m_timeout > 0){
00068                 m_pTimer->start(m_timeout, true);
00069         }
00070 }
00071 
00072 bool KeyModifiers::pressKey(int keycode, int modifiers)
00073 {
00074         int keymask;
00075 
00076         keymask = getState(modifiers, true);
00077         
00078         for(ModifierList::Iterator it=m_modifiers.begin();
00079                         it!=m_modifiers.end(); ++it){
00080                 if((*it)->keycode == keycode
00081                         && ((*it)->keymask & keymask) == (*it)->keymask){
00082                         (*it)->pressed = true;
00083                         if((*it)->toggle_mode){
00084                                 /* change toggle state */
00085                                 (*it)->toggled = !((*it)->toggled);
00086                                 if((*it)->toggled){
00087                                         keepToggles();
00088                                 } else {
00089                                         m_pTimer->stop();
00090                                 }
00091                         }
00092                         return(true);
00093                 }
00094         }
00095         return(false);
00096 }
00097 
00098 bool KeyModifiers::isModifier(int keycode)
00099 {
00100         if(keycode == Qt::Key_Shift
00101                 || keycode == Qt::Key_Control
00102                 || keycode == Qt::Key_Alt
00103                 || keycode == Qt::Key_Meta
00104                 || keycode == Qt::Key_F22){
00105                 return(true);
00106         } else {
00107                 return(false);
00108         }
00109 }
00110 
00111 void KeyModifiers::releaseKey(int keycode)
00112 {
00113         if(m_releasekeys.contains(keycode)){
00114                 ModifierList* list = m_releasekeys[keycode];
00115                 for(ModifierList::Iterator it=(*list).begin();
00116                                 it!=(*list).end(); ++it){
00117                         (*it)->pressed = false;
00118                 }
00119         }
00120 }
00121 
00122 int KeyModifiers::getState()
00123 {
00124         int state = 0;
00125         for(ModifierList::Iterator it=m_modifiers.begin();
00126                         it!=m_modifiers.end(); ++it){
00127                 if((*it)->pressed || (*it)->toggled){
00128                         state |= m_types[(*it)->type];
00129                 }
00130         }
00131         return(state);
00132 }
00133 
00134 int KeyModifiers::getState(int modifiers, bool reset)
00135 {
00136         int state = getState();
00137         int mask;
00138 
00139         mask = getMask("Shift");
00140         if(modifiers & Qt::ShiftButton){
00141                 state |= mask;
00142         } else {
00143                 if(reset){
00144                         state &= ~mask;
00145                 }
00146         }
00147         mask = getMask("Control");
00148         if(modifiers & Qt::ControlButton){
00149                 state |= mask;
00150         } else {
00151                 if(reset){
00152                         state &= ~mask;
00153                 }
00154         }
00155         mask = getMask("Alt");
00156         if(modifiers & Qt::AltButton){
00157                 state |= mask;
00158         } else {
00159                 if(reset){
00160                         state &= ~mask;
00161                 }
00162         }
00163 
00164         return(state);
00165 }
00166 
00167 int KeyModifiers::getModifiers(int modifiers)
00168 {
00169         int state = getState();
00170 
00171         if(state & getMask("Shift")){
00172                 modifiers |= Qt::ShiftButton;
00173         }
00174         if(state & getMask("Control")){
00175                 modifiers |= Qt::ControlButton;
00176         }
00177         if(state & getMask("Alt")){
00178                 modifiers |= Qt::AltButton;
00179         }
00180 
00181         return(modifiers);
00182 }
00183 
00184 int KeyModifiers::getMask(const QString& type)
00185 {
00186         if(m_types.contains(type)){
00187                 return(m_types[type]);
00188         } else {
00189                 return(0);
00190         }
00191 }
00192 
00193 void KeyModifiers::clear()
00194 {
00195         m_types.clear();
00196 
00197         m_togglekeys.clear();
00198 
00199         for(ModifierList::Iterator it=m_modifiers.begin();
00200                         it!=m_modifiers.end(); ++it){
00201                 delete *it;
00202         }
00203         m_modifiers.clear();
00204 
00205         for(QMap<int, ModifierList*>::Iterator it=m_releasekeys.begin();
00206                         it!=m_releasekeys.end(); ++it){
00207                 delete *it;
00208         }
00209         m_releasekeys.clear();
00210 }
00211 
00212 void KeyModifiers::init()
00213 {
00214         m_bitmask = 0x00000001;
00215         addType("Shift");
00216         addType("Control");
00217         addType("Alt");
00218 
00219         ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
00220 
00221         cfg.setGroup("Global");
00222 
00223         QString timeout = cfg.readEntry("ToggleTimeout", "10");
00224         int msec = timeout.toInt();
00225         msec *= 1000; /* sec to msec */
00226         m_timeout = msec;
00227 }
00228 
00229 void KeyModifiers::reset()
00230 {
00231         clear();
00232         init();
00233 }
00234 
00235 bool KeyModifiers::isToggled()
00236 {
00237         for(ModifierList::Iterator it=m_togglekeys.begin();
00238                         it!=m_togglekeys.end(); ++it){
00239                 if((*it)->toggled){
00240                         return(true);
00241                 }
00242         }
00243         return(false);
00244 }
00245 
00246 void KeyModifiers::resetToggles()
00247 {
00248         for(ModifierList::Iterator it=m_togglekeys.begin();
00249                         it!=m_togglekeys.end(); ++it){
00250                 (*it)->toggled = false;
00251         }
00252         m_pTimer->stop();
00253 }
00254 
00255 void KeyModifiers::resetStates()
00256 {
00257         for(ModifierList::Iterator it=m_modifiers.begin();
00258                         it!=m_modifiers.end(); ++it){
00259                 (*it)->pressed = false;
00260         }
00261         resetToggles();
00262 }
00263 
00264 void KeyModifiers::statistics()
00265 {
00266         qWarning("KeyModifiers::statistics()");
00267         for(ModifierList::Iterator it=m_modifiers.begin();
00268                         it!=m_modifiers.end(); ++it){
00269                 qWarning(" [%s][%x][%x][%d][%d]",
00270                         (*it)->type.latin1(),
00271                         (*it)->keycode,
00272                         (*it)->keymask,
00273                         (*it)->pressed,
00274                         (*it)->toggled);
00275                 for(QMap<int, ModifierList*>::Iterator it2=m_releasekeys.begin();
00276                                 it2!=m_releasekeys.end(); ++it2){
00277                         for(ModifierList::Iterator it3=(*it2)->begin();
00278                                         it3!=(*it2)->end(); ++it3){
00279                                 if(*it == *it3){
00280                                         qWarning("  release[%x]", it2.key());
00281                                 }
00282                         }
00283                 }
00284         }
00285 }

Generated on Sat Nov 5 16:16:43 2005 for OPIE by  doxygen 1.4.2