summaryrefslogtreecommitdiff
path: root/noncore/applets/keyhelper/keyhelperapplet/config/ModifiersHandler.cpp
Side-by-side diff
Diffstat (limited to 'noncore/applets/keyhelper/keyhelperapplet/config/ModifiersHandler.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/config/ModifiersHandler.cpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/noncore/applets/keyhelper/keyhelperapplet/config/ModifiersHandler.cpp b/noncore/applets/keyhelper/keyhelperapplet/config/ModifiersHandler.cpp
new file mode 100644
index 0000000..b2cde92
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/config/ModifiersHandler.cpp
@@ -0,0 +1,99 @@
+#include "ModifiersHandler.h"
+
+void ModifiersHandler::dispose(QXmlReader* parser, QXmlContentHandler* parent)
+{
+ m_parser = parser;
+ m_parent = parent;
+ m_parser->setContentHandler(this);
+}
+
+bool ModifiersHandler::startElement(const QString& /* namespaceURI */,
+ const QString& localName,
+ const QString& /* qName */,
+ const QXmlAttributes& attr)
+{
+ if(localName == "define"){
+ /* ÊÑ¿ô½é´ü²½ */
+ m_type = QString::null;
+ m_code = 0;
+ m_mask = 0;
+ m_release.clear();
+ m_toggle = false;
+ m_mapping = false;
+ for(int i=0; i<attr.length(); i++){
+ if(attr.localName(i).lower() == "key"){
+ /* keyname */
+ m_code = KeyNames::getCode(attr.value(i));
+ } else if(attr.localName(i).lower() == "code"){
+ /* keycode */
+ m_code = KHUtil::hex2int(attr.value(i).lower());
+ } else if(attr.localName(i).lower() == "type"){
+ /* modifier type */
+ m_type = attr.value(i);
+ } else if(attr.localName(i).lower() == "mapping"){
+ /* auto mapping */
+ if(attr.value(i).lower() == "true"){
+ m_mapping = true;
+ }
+ } else if(attr.localName(i).lower() == "toggle"){
+ /* toggle mode */
+ if(attr.value(i).lower() == "true"){
+ m_toggle = true;
+ }
+ }
+ }
+ } else if(localName == "modifier"){
+ /* modifier keys */
+ for(int i=0; i<attr.length(); i++){
+ if(attr.value(i).lower() == "on"){
+ m_mask |= m_pModifiers->getMask(attr.localName(i));
+ }
+ }
+ } else if(localName == "release"){
+ /* release keys */
+ int code = 0;
+ for(int i=0; i<attr.length(); i++){
+ if(attr.localName(i) == "key"){
+ /* keyname */
+ code = KeyNames::getCode(attr.value(i));
+ } else if(attr.localName(i) == "code"){
+ /* keycode */
+ code = KHUtil::hex2int(attr.value(i).lower());
+ }
+ }
+ if(code > 0){
+ m_release.append(code);
+ }
+ }
+ return(true);
+}
+
+bool ModifiersHandler::endElement(const QString& /* namespaceURI */,
+ const QString& localName,
+ const QString& /* qName */)
+{
+ if(localName == "define"){
+ if(m_type != QString::null && m_code > 0){
+ /* assign modifier */
+ m_pModifiers->assign(m_type, m_code, m_mask, m_toggle);
+ for(QValueList<int>::Iterator it=m_release.begin();
+ it!=m_release.end(); ++it){
+ /* assign modifier release keys */
+ m_pModifiers->assignRelease(*it);
+ }
+ int code = KeyNames::getCode(m_type);
+ if(code <= 0){
+ qDebug("setCode[%s][%x]", m_type.latin1(), m_code);
+ KeyNames::setCode(m_type, m_code);
+ }
+ if(m_mapping){
+ /* auto mapping */
+ m_pMappings->assign(m_code, m_mask, code, 0);
+ }
+ }
+ } else if(localName == "modifiers"){
+ /* return parent */
+ m_parser->setContentHandler(m_parent);
+ }
+ return(true);
+}