summaryrefslogtreecommitdiff
path: root/noncore/applets/keyhelper/keyhelperapplet/extension/KeyExtensions.cpp
blob: a61ea0ad7ec465e9d2c92fb629ee416154918d21 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include "KeyExtensions.h"

KeyExtensions::KeyExtensions()
{
	qDebug("KeyExtensions::KeyExtensions()");
	m_cancelcode = 0;
}

KeyExtensions::~KeyExtensions()
{
	qDebug("KeyExtensions::~KeyExtensions()");
	clear();
}

void KeyExtensions::assign(const QString& kind, int keycode,
	int keymask, const QValueList<int>& modcodes)
{
	ExtensionInterface* ext;
#if 0
	ext = m_oExtFactory.createInstance(kind);
	if(ext != NULL){
		ext->setKeycode(keycode);
		ext->setKeymask(keymask);
		ext->setModcodes(modcodes);
	}
#else
	ext = m_oExtFactory.createInstance(kind, keycode, keymask);
	if(ext != NULL){
		ext->setModcodes(modcodes);
	}
#endif
}

void KeyExtensions::assign(const QString& kind, int keycode,
	int keymask, int modcode)
{
	QValueList<int> modcodes;
	modcodes.append(modcode);
	assign(kind, keycode, keymask, modcodes);
}

bool KeyExtensions::doKey(int keycode, int keymask, bool isPress)
{
	bool fCancel = false;
	ExtensionList& list = m_oExtFactory.getList();
	for(ExtensionList::Iterator it=list.begin();
			it!=list.end(); ++it){
		if(isPress){
			int code = (*it)->getKeycode();
			if((*it)->getKeymask() == keymask
				&& (code == 0 || code == keycode)){
				if((*it)->onKeyPress(keycode)){
					fCancel = true;
				}
				qWarning("ext:onKeyPress[%s][%x][%d]",
					(*it)->kind().latin1(),
					(*it)->getKeycode(),
					fCancel);
			}
		} else {
			if(keycode == m_cancelcode){
				fCancel = true;
			}
			const QValueList<int>& rlist = (*it)->getModcodes();
			if(rlist.contains(keycode)){
				if((*it)->onModRelease(keycode)){
					m_pModifiers->resetToggles();
				}
				qWarning("ext:onModRelease[%s][%x]",
					(*it)->kind().latin1(),
					keycode);
			}
		}
	}
	if(isPress && fCancel){
		m_cancelcode = keycode;
	} else {
		m_cancelcode = 0;
	}
	return(fCancel);
}

void KeyExtensions::clear()
{
	m_oExtFactory.clear();
}

void KeyExtensions::reset()
{
	//clear();
	m_oExtFactory.reset();
}

void KeyExtensions::init()
{
	m_oExtFactory.sweep();
}

void KeyExtensions::statistics()
{
	qWarning("KeyExtensions::statistics()");
	ExtensionList& list = m_oExtFactory.getList();
	for(ExtensionList::Iterator it=list.begin();
			it!=list.end(); ++it){
		qWarning(" [%s][%x][%x]",
			(*it)->kind().latin1(),
			(*it)->getKeycode(),
			(*it)->getKeymask());
	}
}