summaryrefslogtreecommitdiffstats
path: root/kmilo/generic
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit2bda8f7717adf28da4af0d34fb82f63d2868c31d (patch)
tree8d927b7b47a90c4adb646482a52613f58acd6f8c /kmilo/generic
downloadtdeutils-2bda8f7717adf28da4af0d34fb82f63d2868c31d.tar.gz
tdeutils-2bda8f7717adf28da4af0d34fb82f63d2868c31d.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdeutils@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kmilo/generic')
-rw-r--r--kmilo/generic/Makefile.am34
-rw-r--r--kmilo/generic/README38
-rw-r--r--kmilo/generic/generic_monitor.cpp324
-rw-r--r--kmilo/generic/generic_monitor.h94
-rw-r--r--kmilo/generic/kmilo_generic.desktop108
5 files changed, 598 insertions, 0 deletions
diff --git a/kmilo/generic/Makefile.am b/kmilo/generic/Makefile.am
new file mode 100644
index 0000000..1dd7094
--- /dev/null
+++ b/kmilo/generic/Makefile.am
@@ -0,0 +1,34 @@
+# This file is part of the KDE project
+# Copyright (C) 2003 George Staikos <staikos@kde.org>
+
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+
+# This library 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
+# Library General Public License for more details.
+
+# You should have received a copy of the GNU Library General Public License
+# along with this library; see the file COPYING.LIB. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
+
+INCLUDES=-I$(srcdir)/../kmilod $(all_includes)
+
+kde_module_LTLIBRARIES = kmilo_generic.la
+
+kmilo_generic_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+kmilo_generic_la_LIBADD = ../kmilod/libkmilo.la $(LIB_KIO)
+kmilo_generic_la_SOURCES = generic_monitor.cpp
+METASOURCES = AUTO
+
+noinst_HEADERS = generic_monitor.h
+
+services_DATA = kmilo_generic.desktop
+servicesdir = $(kde_servicesdir)/kmilo
+
+messages:
+ $(XGETTEXT) $(kmilo_generic_la_SOURCES) -o $(podir)/kmilo_generic.pot
diff --git a/kmilo/generic/README b/kmilo/generic/README
new file mode 100644
index 0000000..1727e8e
--- /dev/null
+++ b/kmilo/generic/README
@@ -0,0 +1,38 @@
+This module provides support for the VolumeUp, VolumeDown and Mute Internet
+keys found in many laptops and special keyboards.
+
+Please note that in order this module to work, mentioned special keys have to
+generate appropriate X key symbols (keysyms), namely XF86AudioLowerVolume,
+XF86AudioRaiseVolume, XF86AudioMute. You can use "xev" program to watch events
+generated by X server and "xmodmap" program to assign events (keycodes) to
+keysyms. Also watch kernel log (dmesg) for unknown scancodes.
+
+If you use CTRL in conjunction with volUp/Down it changes the volume by 1%,
+otherwise by 10%.
+
+This module is now configurable (though with no configuration GUI), you can
+change which channels (kmix device indexes) to change volume on, you can also
+tweak volume changing steps. Channels are represented by numeric indexes
+starting from zero, in order to get the right channel, you have to experiment
+a little (keep the kmix mixer window open). ;) Examples:
+
+# Change "fast" step to 5% and "slow" step to 2%:
+kwriteconfig --file kmilodrc --group "generic monitor" --key volumeStepFast 5
+kwriteconfig --file kmilodrc --group "generic monitor" --key volumeStepSlow 2
+
+# Change channel to set volume on to 1 (use -1 to use kmix' master device):
+kwriteconfig --file kmilodrc --group "generic monitor" --key volumeDeviceIdx 1
+
+# You can also specify different mute channel (leave it unset or set it to -1
+# to use the same channel for muting and changing volume):
+kwriteconfig --file kmilodrc --group "generic monitor" --key muteDeviceIdx 2
+
+# KMilo now supports an extra channel, whose volume and mute will be set to
+# whatever your primary channel is set to. (leave it unset or set it to -1 to
+# disable this functionality):
+kwriteconfig --file kmilodrc --group "generic monitor" --key extraDeviceIdx 5
+
+# Use following call to apply these settings without restarting your session:
+dcop kded kmilod reconfigure
+
+Have fun.
diff --git a/kmilo/generic/generic_monitor.cpp b/kmilo/generic/generic_monitor.cpp
new file mode 100644
index 0000000..40e7169
--- /dev/null
+++ b/kmilo/generic/generic_monitor.cpp
@@ -0,0 +1,324 @@
+// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: t; tab-width: 2; -*-
+/*
+ This file is part of the KDE project
+
+ Copyright (c) 2003 Willi Richert <w.richert@gmx.net>
+ Pretty much ripped off from :
+ George Staikos <staikos@kde.org> :)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+*/
+
+#include <kgenericfactory.h>
+#include <kdebug.h>
+#include <kconfig.h>
+
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "generic_monitor.h"
+#include "kmilointerface.h"
+#include <qmessagebox.h>
+#include <qfile.h>
+
+#define CONFIG_FILE "kmilodrc"
+
+
+using namespace KMilo;
+
+GenericMonitor::GenericMonitor(QObject *parent, const char *name, const QStringList& args)
+: Monitor(parent, name, args)
+{
+ _poll = false;
+ m_displayType = Monitor::None;
+
+ m_mute = false;
+ m_progress = 0;
+ m_minVolume = 0;
+ m_maxVolume = 100;
+ m_volume = 50;
+}
+
+GenericMonitor::~GenericMonitor()
+{
+ if(ga) {
+ ga->remove("FastVolumeUp");
+ ga->remove("FastVolumeDown");
+ ga->remove("SlowVolumeUp");
+ ga->remove("SlowVolumeDown");
+ ga->remove("Mute");
+ delete ga;
+ }
+}
+
+bool GenericMonitor::init()
+{
+ KConfig config(CONFIG_FILE);
+ reconfigure(&config);
+
+ if(!m_enabled)
+ return false; // exit early if we are not supposed to run
+
+ static const ShortcutInfo shortcuts[] = {
+ { "FastVolumeUp", Qt::Key_VolumeUp, SLOT(fastVolumeUp()) },
+ { "FastVolumeDown", Qt::Key_VolumeDown, SLOT(fastVolumeDown()) },
+ { "SlowVolumeUp", Qt::CTRL+Qt::Key_VolumeUp, SLOT(slowVolumeUp()) },
+ { "SlowVolumeDown", Qt::CTRL+Qt::Key_VolumeDown, SLOT(slowVolumeDown()) },
+ { "Mute", KShortcut("XF86AudioMute"), SLOT(mute()) }
+ };
+
+ ga = new KGlobalAccel(this, "miloGenericAccel");
+
+ ShortcutInfo si;
+ int len = (int)sizeof(shortcuts)/sizeof(ShortcutInfo);
+ for (int i = 0; i < len; i++) {
+ si = shortcuts[i];
+
+ ga->insert(si.name, QString::null, QString::null,
+ si.symbol, si.symbol,
+ this,
+ si.slot, false);
+ }
+
+ ga->readSettings();
+ ga->updateConnections();
+
+ kmixClient = new DCOPRef("kmix", "Mixer0");
+ kmixWindow = new DCOPRef("kmix", "kmix-mainwindow#1");
+
+ return true;
+}
+
+void GenericMonitor::reconfigure(KConfig *config)
+{
+ config->setGroup("generic monitor");
+
+ m_volumeDeviceIdx = config->readNumEntry("volumeDeviceIdx", -1);
+ m_muteDeviceIdx = config->readNumEntry("muteDeviceIdx", m_volumeDeviceIdx);
+ m_extraDeviceIdx = config->readNumEntry("extraDeviceIdx", -1);
+ m_volumeStepFast = config->readNumEntry("volumeStepFast", 10);
+ m_volumeStepSlow = config->readNumEntry("volumeStepSlow", 1);
+ m_enabled = config->readBoolEntry("enabled", true);
+}
+
+bool GenericMonitor::retrieveKmixDevices()
+{
+ if(m_volumeDeviceIdx != -1 && m_muteDeviceIdx != -1)
+ return true; // both indexes already set
+
+ DCOPReply reply = kmixClient->call("masterDeviceIndex");
+ if (!reply.isValid())
+ { // maybe the error occurred because kmix wasn't running
+ _interface->displayText(i18n("Starting KMix..."));
+ if (kapp->startServiceByDesktopName("kmix")==0) // trying to start kmix
+ {
+ reply = kmixClient->call("masterDeviceIndex");
+ if (reply.isValid())
+ kmixWindow->send("hide");
+ }
+ }
+
+ if (!reply.isValid())
+ {
+ kdDebug() << "KMilo: GenericMonitor could not access kmix/Mixer0 via dcop"
+ << endl;
+ _interface->displayText(i18n("It seems that KMix is not running."));
+
+ return false;
+ } else {
+ if (m_volumeDeviceIdx == -1)
+ m_volumeDeviceIdx = reply;
+ if (m_muteDeviceIdx == -1)
+ m_muteDeviceIdx = m_volumeDeviceIdx; // this is the behaviour documented in README
+ return true;
+ }
+}
+
+bool GenericMonitor::retrieveVolume()
+{
+ bool kmix_error = false;
+
+ if(!retrieveKmixDevices())
+ return false;
+
+ DCOPReply reply = kmixClient->call("absoluteVolume", m_volumeDeviceIdx);
+ if (reply.isValid())
+ m_volume = reply;
+ else
+ kmix_error = true;
+
+ if (kmix_error) // maybe the error occurred because kmix wasn't running
+ {
+ _interface->displayText(i18n("Starting KMix..."));
+ if (kapp->startServiceByDesktopName("kmix")==0) // trying to start kmix
+ {
+ // trying again
+ reply = kmixClient->call("absoluteVolume", m_volumeDeviceIdx);
+ if (reply.isValid())
+ {
+ m_volume = reply;
+ kmix_error = false;
+ kmixWindow->send("hide");
+ }
+ }
+ }
+
+ if (kmix_error)
+ {
+ kdDebug() << "KMilo: GenericMonitor could not access kmix/Mixer0 via dcop"
+ << endl;
+ _interface->displayText(i18n("It seems that KMix is not running."));
+
+ return false;
+ } else {
+ reply = kmixClient->call("absoluteVolumeMax", m_volumeDeviceIdx);
+ m_maxVolume = reply;
+ reply = kmixClient->call("absoluteVolumeMin", m_volumeDeviceIdx);
+ m_minVolume = reply;
+ return true;
+ }
+}
+
+void GenericMonitor::volumeChange(int direction, int step)
+{
+ if (!retrieveVolume())
+ return;
+
+ /* Following snippet of code may seem to be overcomplicated, but it works for both devices with
+ * volume grain < 100 (32 tested) and devices with volume grain > 100 (256 tested) while preserving
+ * accuracy for devices with fine grain and preserving usability for devices with rough grain. */
+ int userVisibleVolume = qRound(m_volume * 100.0 / (m_maxVolume - m_minVolume));
+ userVisibleVolume += direction * step; // add requested volume step
+ long previousVolume = m_volume;
+ m_volume = qRound(m_minVolume + userVisibleVolume * (m_maxVolume - m_minVolume) / 100.0);
+ if (m_volume == previousVolume) // if the change was rounded to zero
+ m_volume += direction;
+
+ if (m_volume > m_maxVolume)
+ m_volume = m_maxVolume;
+ if (m_volume < m_minVolume)
+ m_volume = m_minVolume;
+
+ displayVolume();
+}
+
+void GenericMonitor::slowVolumeUp() { volumeChange( 1, m_volumeStepSlow); }
+void GenericMonitor::slowVolumeDown() { volumeChange(-1, m_volumeStepSlow); }
+void GenericMonitor::fastVolumeUp() { volumeChange( 1, m_volumeStepFast); }
+void GenericMonitor::fastVolumeDown() { volumeChange(-1, m_volumeStepFast); }
+
+void GenericMonitor::displayVolume()
+{
+ _interface->displayProgress(i18n("Volume"), qRound(m_volume * 100.0 / (m_maxVolume - m_minVolume)));
+
+ // If we got this far, the DCOP communication with kmix works,
+ // so we don't have to test the result.
+ // Also, device indexes are set to their proper values.
+ kmixClient->send("setAbsoluteVolume", m_volumeDeviceIdx, m_volume);
+ if(m_extraDeviceIdx != -1)
+ // for simplicity, use relative volume rather that absolute (extra precision is not needed here)
+ kmixClient->send("setVolume", m_extraDeviceIdx, qRound(m_volume * 100.0 / (m_maxVolume - m_minVolume)));
+
+ // if mute then unmute
+ if (m_mute)
+ {
+ m_mute = false;
+ kmixClient->send("setMute", m_muteDeviceIdx, m_mute);
+ }
+}
+
+bool GenericMonitor::retrieveMute()
+{
+ bool kmix_error = false;
+
+ if(!retrieveKmixDevices())
+ return false;
+
+ DCOPReply reply = kmixClient->call("mute", m_muteDeviceIdx);
+ if (reply.isValid())
+ m_mute = reply;
+ else
+ kmix_error = true;
+
+ if (kmix_error)
+ {
+ // maybe the error occurred because kmix wasn't running
+ _interface->displayText(i18n("Starting KMix..."));
+ if (kapp->startServiceByDesktopName("kmix")==0) // trying to start kmix
+ {
+ // trying again
+ reply = kmixClient->call("mute", m_muteDeviceIdx);
+ if (reply.isValid())
+ {
+ m_mute = reply;
+ kmix_error = false;
+ kmixWindow->send("hide");
+ }
+ } else
+ {
+ kmixWindow->send("hide");
+ kmix_error = true;
+ }
+ }
+
+ if (kmix_error)
+ {
+ kdDebug() << "KMilo: GenericMonitor could not access kmix/Mixer0 via dcop"
+ << endl;
+ _interface->displayText(i18n("It seems that KMix is not running."));
+
+ return false;
+ } else {
+ return true;
+ }
+}
+
+void GenericMonitor::mute()
+{
+ if (!retrieveMute())
+ return;
+
+ m_mute = !m_mute;
+ QString muteText;
+ if (m_mute)
+ {
+ muteText = i18n("Mute on");
+ } else {
+ muteText = i18n("Mute off");
+ }
+
+ kmixClient->send("setMute", m_muteDeviceIdx, m_mute);
+ if(m_extraDeviceIdx != -1)
+ kmixClient->send("setMute", m_extraDeviceIdx, m_mute);
+
+ _interface->displayText(muteText);
+}
+
+int GenericMonitor::progress() const
+{
+ return m_progress;
+}
+
+Monitor::DisplayType GenericMonitor::poll()
+{
+ return m_displayType;
+}
+
+
+K_EXPORT_COMPONENT_FACTORY(kmilo_generic, KGenericFactory<GenericMonitor>("kmilo_generic"))
+
+#include "generic_monitor.moc"
diff --git a/kmilo/generic/generic_monitor.h b/kmilo/generic/generic_monitor.h
new file mode 100644
index 0000000..c2477c4
--- /dev/null
+++ b/kmilo/generic/generic_monitor.h
@@ -0,0 +1,94 @@
+// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: t; tab-width: 2; -*-
+/*
+ This file is part of the KDE project
+
+ Copyright (c) 2003 Willi Richert <w.richert@gmx.net>
+ Pretty much ripped of from :
+ George Staikos <staikos@kde.org> :)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+*/
+#ifndef _GENERICMONITOR_H_
+#define _GENERICMONITOR_H_
+
+#include <kmainwindow.h>
+#include <kglobalaccel.h>
+#include <dcopref.h>
+#include <kapplication.h>
+
+#include "kmilod.h"
+#include "monitor.h"
+
+namespace KMilo {
+
+// now the key data (from kkeyserver_x11.h and $QTDIR/include/qnamespace.h)
+struct ShortcutInfo
+{
+ const char* name;
+ uint symbol;
+ const char *slot;
+};
+
+
+class GenericMonitor : public Monitor
+{
+ Q_OBJECT
+
+public:
+ GenericMonitor(QObject *parent, const char *name, const QStringList&);
+ virtual ~GenericMonitor();
+
+ virtual bool init();
+ virtual int progress() const;
+ virtual DisplayType poll();
+ virtual void reconfigure(KConfig*);
+
+public slots:
+ void slowVolumeUp();
+ void slowVolumeDown();
+ void fastVolumeUp();
+ void fastVolumeDown();
+ void mute();
+
+private:
+ bool retrieveKmixDevices();
+ void volumeChange(int direction, int step);
+ bool retrieveMute();
+ bool retrieveVolume();
+ void displayVolume();
+
+ KGlobalAccel *ga;
+
+ DCOPRef *kmixClient, *kmixWindow;
+
+ int m_progress;
+ long m_volume;
+ bool m_mute;
+
+ long m_maxVolume, m_minVolume;
+
+ // following properties are read from config file:
+ int m_volumeStepFast, m_volumeStepSlow;
+ int m_volumeDeviceIdx, m_muteDeviceIdx, m_extraDeviceIdx;
+ bool m_enabled;
+
+ Monitor::DisplayType m_displayType;
+};
+
+}
+
+#endif
diff --git a/kmilo/generic/kmilo_generic.desktop b/kmilo/generic/kmilo_generic.desktop
new file mode 100644
index 0000000..89d55d0
--- /dev/null
+++ b/kmilo/generic/kmilo_generic.desktop
@@ -0,0 +1,108 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=KMilo Plugin
+X-KDE-ModuleType=Plugin
+Name=Generic Keyboard Plugin
+Name[ar]=ملحق عام للوحة المفاتيح
+Name[bg]=Приставка за клавиатурата
+Name[bs]=Opšti dodatak za tastaturu
+Name[ca]=Connector de teclat genèric
+Name[cs]=Obecný modul klávesnice
+Name[cy]=Ategyn Bysellfwrdd Cyffredinol
+Name[da]=Generisk tastatur-plugin
+Name[de]=Allgemeines Tastatur-Plugin
+Name[el]=Γενικευμένο πρόσθετο πληκτρολογίου
+Name[eo]=Komuna klavar-kromprogramo
+Name[es]=Extensión de teclado genérico
+Name[et]=Tavaline klaviatuuriplugin
+Name[eu]=Teklatu Arruntaren Plugina
+Name[fa]=وصلۀ کلی صفحه کلید
+Name[fi]=Yleinen näppäimistöliitännäinen
+Name[fr]=Module externe de clavier générique
+Name[ga]=Breiseán Cineálach Méarchláir
+Name[he]=תוסף גנרי למקלדות
+Name[hi]=जेनेरिक कुंजीपट प्लगइन
+Name[hu]=Általános billentyűzet-bővítőmodul
+Name[is]=Almennt lyklaborðsíforrit
+Name[it]=Plugin tastiera generica
+Name[ja]=一般キーボードプラグイン
+Name[ka]=სტანდარტული კლავიატურა მოდული
+Name[kk]=Негізгі пернетақта модулі
+Name[km]=កម្មវិធី​ជំនួយ​ក្តារចុច​ទូទៅ
+Name[lt]=Bendro pobūdžio klaviatūros priedas
+Name[mk]=Општ приклучок за тастатура
+Name[nb]=Programtillegg for generisk tastatur
+Name[nds]=Allgemeen Tastatuurmoduul
+Name[ne]=जेनेरिक कुञ्जीपाटी प्लगइन
+Name[nl]=Algemene toetsenbord-plugin
+Name[nn]=Programtillegg for generisk tastatur
+Name[pa]=ਸਧਾਰਨ ਕੀ-ਬੋਰਡ ਪਲੱਗਿੰਨ
+Name[pl]=Wtyczka zwykłej klawiatury
+Name[pt]='Plugin' de Teclado Genérico
+Name[pt_BR]=Plug-in de Teclado Genérico
+Name[ro]=Modul generic de tastatură
+Name[ru]=Модуль клавиатуры
+Name[sk]=Modul pre generickú klávesnicu
+Name[sl]=Generični vstavek za tipkovnice
+Name[sr]=Генерички прикључак тастатуре
+Name[sr@Latn]=Generički priključak tastature
+Name[sv]=Allmänt insticksprogram för tangentbord
+Name[ta]= பொதுவான விசைப்பலகை சொருகுபொருள்
+Name[tg]=Модули Умумии Забонак
+Name[tr]=Generic Klavye Plugini
+Name[uk]=Загальний втулок клавіатури
+Name[uz]=Umumiy tugmatag plagini
+Name[uz@cyrillic]=Умумий тугматаг плагини
+Name[wa]=Tchôke-divins djenerike di taprece
+Name[zh_CN]=常规键盘插件
+Name[zh_TW]=一般鍵盤外掛程式
+Comment=This plugin enables support for special keys on all sorts of keyboards and laptops.
+Comment[ar]=تمكّن الدعم للمفاتيح الخاصة فى كل أنواع لوحات المفاتيح والحواسيب المحمولة.
+Comment[bg]=Тази приставка позволява поддръжката на специалните клавиши на различните видове лаптопи и специални клавиатури
+Comment[bs]=Ovaj dodatak (plugin) omogućuje podršku za posebne tipke na raznim vrstama tastatura i laptopa.
+Comment[ca]=Aquest connector activa el funcionament per a tecles especials en tot tipus de teclats i portàtils.
+Comment[cs]=Tento modul umožňuje používat zvláštní klávesy na všech typech klávesnic a notebooků.
+Comment[cy]=Mae'r ategyn yn galluogi cynhaliaeth ar gyfer bysyll arbennig ar bob math o bysellfyrdd a gluniaduron.
+Comment[da]=Dette plugin aktivere støtte for specielle taster på alle slags tastaturer og bærbare.
+Comment[de]=Dieses Plugin aktiviert die Unterstützung für die Sondertasten diverser Tastaturen und Notebooks.
+Comment[el]=Αυτό το πρόσθετο ενεργοποιεί την υποστήριξη για ειδικά πλήκτρα σε όλα τα είδη των πληκτρολογίων και φορητών υπολογιστών.
+Comment[es]=Esta extensión activa el soporte de las teclas especiales en todo tipo de teclados y portátiles.
+Comment[et]=See plugin võimaldab kasutada eriklahve igasugustel klaviatuuridel ja sülearvutitel.
+Comment[eu]=Plugin honek tekla berezientzako euskarria gaitzen du teklatu eta magaleko mota guztietan.
+Comment[fa]=این وصله، برای کلیدهای ویژه روی همۀ انواع صفحه کلید و رایانه‌های کیفی، پشتیبانی را فعال می‌سازد.
+Comment[fi]=Tämä liitännäinen mahdollistaa erikoisnäppäinten tuen kaikenlaisille näppäimistöille ja kannettavilla tietokoneille.
+Comment[fr]=Ce module active la gestion des touches spéciales pour toutes sortes de claviers et de portables.
+Comment[ga]=Tacaíonn an breiseán seo le cnaipí speisialta ar neart sóirt méarchlár agus ríomhairí glúine.
+Comment[he]=תוסף זה מאפשר את השימוש בכל המקשים המיוחדים במקלדת ומחשבים ניידים.
+Comment[hi]=यह प्लगइन सभी क़िस्म के कुंजीपट तथा लैपटॉप पर विशिष्ट कुंजी समर्थन सक्षम करता है
+Comment[hu]=Ez a bővítőmodul lehetővé teszi az extra billentyűk használatát speciális billentyűzeteknél és noteszgépeken.
+Comment[is]=Þetta íforrit virkjar sérhnappana sem eru á allskynd gerðum lyklaborða og ferðavéla.
+Comment[it]=Questo plugin abilita il supporto per i tasti speciali su qualsiasi tipo di tastiera e portatile.
+Comment[ja]=このプラグインはあらゆる種類のキーボードとラップトップで特殊キーをサポートします
+Comment[ka]=ეს მოდული რთავს ყველანაერი ტიპის კლავიატურების (მათ შორის ლეპტოპების) სპეციალური კლავიშების მხარდაჭერას.
+Comment[kk]=Бұл модуль барлық пернетақталар мен ноутбуктердегі арнаулы пернелерді қолдайды.
+Comment[km]=កម្មវិធី​ជំនួយ​នេះបើក​ការគាំទ្រ សម្រាប់​គ្រាប់ចុច​ពិសេស​នៅ​លើ​ប្រភេទ​ក្តារចុច និង​កុំព្យូទ័រ​យួរដៃ​ទាំងអស់ ។
+Comment[lt]=Šis priedas įgalina ypatingų klavišų palaikymą įvairių tipų klaviatūrose bei nešiojamuose kompiuteriuose.
+Comment[mk]=Овој приклучок дава поддршка за специјалните копчиња на сите видови на тастатури и лаптопи.
+Comment[nb]=Dette programtillegget muliggjør støtte for spesielle taster på alle tastatur og bærbare maskiner
+Comment[nds]=Dit Moduul maakt de Sünnertasten-Ünnerstütten för all Oorden vun Tastaturen un Klappreekners an.
+Comment[ne]=यो प्लगइनले कुञ्जीपाटी र ल्यापटपको सबै क्रमबद्धतामा विशेष कुञ्जीका लागि समर्थन सक्षम पार्दछ ।
+Comment[nl]=Deze plugin biedt ondersteuning voor allerlei speciale toetsen op laptops en gewone toetsenborden.
+Comment[nn]=Dette programtillegget gjer det mogleg å bruka spesialtastar på alle tastatur og bærbare maskiner.
+Comment[pl]=Ta wtyczka umożliwia używanie klawiszy specjalnych na wszystkich rodzajach klawiatur i laptopach.
+Comment[pt]=Este 'plugin' activa o suporte para as teclas especiais em todos os tipos de teclados e portáteis.
+Comment[pt_BR]=Este plug-in habilita suporte para teclas especiais em todos os tipos de laptops e teclados.
+Comment[ro]=Acest modul activează suportul pentru tastele speciale de pe tot felul de tastaturi şi laptop-uri.
+Comment[ru]=Этот модуль поддерживает специальные клавиши на всех типах клавиатур и ноутбуках.
+Comment[sk]=Tento modul obsahuje podporu pre špeciálne klávesy na rôznych klávesniciach a prenosných počítačoch.
+Comment[sl]=Ta vstavek omogoča podporo za posebne tipke na vseh vrstah tipkovnic in prenosnikov.
+Comment[sr]=Овај прикључак омогућава подршку за специјалне тастере на свакаквим тастатурама и лаптоповима.
+Comment[sr@Latn]=Ovaj priključak omogućava podršku za specijalne tastere na svakakvim tastaturama i laptopovima.
+Comment[sv]=Det här insticksprogrammet aktiverar stöd för speciella tangenter för alla typer av tangentbord och bärbara datorer.
+Comment[ta]=எல்லா அடுக்குகளிலும் உள்ள விசைபலகைகள் மற்றும் மடிக் கணினிகளின் விசேஷ விசைகளுக்கு இந்த சொருகு சாதனம் ஆதரவளிக்கிறது.
+Comment[tg]=Ин модул пуштибонии калидҳои махсусро дар ҳамаи навъҳои забонакҳо ва компютерҳои дастӣ дармегиронад.
+Comment[tr]=Bu plugin tüm klavye ve dizüstülerdeki özel tuşlar için desteği sağlar.
+Comment[uk]=Цей втулок додає підтримку спеціальних клавіш для різних типів клавіатур та лептопів.
+Comment[zh_CN]=此插件启用各种键盘和便携电脑的特殊按键。
+Comment[zh_TW]=這個外掛程式開啟所有鍵盤與筆記型電腦的特殊鍵支援。
+X-KDE-Library=kmilo_generic