diff options
Diffstat (limited to 'kmilo/generic')
-rw-r--r-- | kmilo/generic/Makefile.am | 34 | ||||
-rw-r--r-- | kmilo/generic/README | 38 | ||||
-rw-r--r-- | kmilo/generic/generic_monitor.cpp | 324 | ||||
-rw-r--r-- | kmilo/generic/generic_monitor.h | 94 | ||||
-rw-r--r-- | kmilo/generic/kmilo_generic.desktop | 108 |
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 |