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
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;
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 }