summaryrefslogtreecommitdiffstats
path: root/kcontrol/access
diff options
context:
space:
mode:
Diffstat (limited to 'kcontrol/access')
-rw-r--r--kcontrol/access/Makefile.am30
-rw-r--r--kcontrol/access/configure.in.in7
-rw-r--r--kcontrol/access/eventsrc1072
-rw-r--r--kcontrol/access/kaccess.cpp896
-rw-r--r--kcontrol/access/kaccess.desktop78
-rw-r--r--kcontrol/access/kaccess.h114
-rw-r--r--kcontrol/access/kcmaccess.cpp805
-rw-r--r--kcontrol/access/kcmaccess.desktop240
-rw-r--r--kcontrol/access/kcmaccess.h111
-rw-r--r--kcontrol/access/main.cpp49
10 files changed, 3402 insertions, 0 deletions
diff --git a/kcontrol/access/Makefile.am b/kcontrol/access/Makefile.am
new file mode 100644
index 000000000..f57c865b3
--- /dev/null
+++ b/kcontrol/access/Makefile.am
@@ -0,0 +1,30 @@
+
+AM_CPPFLAGS= $(all_includes)
+METASOURCES = AUTO
+
+bin_PROGRAMS =
+lib_LTLIBRARIES =
+kde_module_LTLIBRARIES = kcm_access.la
+kdeinit_LTLIBRARIES = kaccess.la
+
+kaccess_la_SOURCES = kaccess.cpp main.cpp
+kaccess_la_LDFLAGS = $(all_libraries) -module -avoid-version
+kaccess_la_LIBADD = $(LIB_KDEUI)
+
+kcm_access_la_SOURCES = kcmaccess.cpp
+kcm_access_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_access_la_LIBADD = $(LIB_KIO)
+
+noinst_HEADERS = kcmaccess.h
+
+xdg_apps_DATA = kcmaccess.desktop
+
+services_DATA = kaccess.desktop
+servicesdir = $(kde_servicesdir)
+
+eventsrcdir = $(kde_datadir)/kaccess/
+eventsrc_DATA = eventsrc
+
+messages:
+ $(XGETTEXT) $(kaccess_la_SOURCES) -o $(podir)/kaccess.pot
+ $(XGETTEXT) $(kcm_access_la_SOURCES) -o $(podir)/kcmaccess.pot
diff --git a/kcontrol/access/configure.in.in b/kcontrol/access/configure.in.in
new file mode 100644
index 000000000..170fc8dea
--- /dev/null
+++ b/kcontrol/access/configure.in.in
@@ -0,0 +1,7 @@
+ACCESS_SUBDIR=
+KDE_CHECK_HEADER(X11/extensions/XKBstr.h, ACCESS_SUBDIR=access, ,
+[
+#include <X11/Xlib.h>
+])
+
+AM_CONDITIONAL(include_kcontrol_access, test -n "$ACCESS_SUBDIR")
diff --git a/kcontrol/access/eventsrc b/kcontrol/access/eventsrc
new file mode 100644
index 000000000..185460ec4
--- /dev/null
+++ b/kcontrol/access/eventsrc
@@ -0,0 +1,1072 @@
+[!Global!]
+IconName=kaccess
+Comment=KDE Accessibility Tool
+Comment[af]=KDE toeganklikheid program
+Comment[be]=Інструмент даступнасці KDE
+Comment[bg]=Равностоен достъп
+Comment[bn]=কে.ডি.ই. সহায়ক প্রযুক্তি টুল
+Comment[br]=Ostilh haezadusted KDE
+Comment[bs]=KDE alat za pristupačnost
+Comment[ca]=Eina d'accessibilitat KDE
+Comment[cs]=KDE nástroj pro zpřístupnění
+Comment[csb]=Nôrzãdze pòmòcë przistãpù KDE
+Comment[cy]=Erfyn Hygyrchedd KDE
+Comment[da]=KDE Tilgængelighedsværktøj
+Comment[de]=KDE-Dienstprogramm für Zugangshilfen
+Comment[el]=Εργαλείο προσβασιμότητας του KDE
+Comment[eo]=KDE-ilo por Alirebleco
+Comment[es]=Herramienta de accesibilidad de KDE
+Comment[et]=KDE hõlbustusvahend
+Comment[eu]=KDEren erabilerraztasun tresna
+Comment[fa]=ابزار دستیابی‌پذیری KDE
+Comment[fi]=KDE:n helppokäyttötoiminnot
+Comment[fr]=Outil d'accessibilité de KDE
+Comment[fy]=KDE Tagonklikens
+Comment[ga]=Uirlis Inrochtaineachta KDE
+Comment[gl]=Ferramenta de Acesibilidade de KDE
+Comment[he]=כלי הנגישות של KDE
+Comment[hr]=KDE alat pristupačnosti
+Comment[hu]=KDE kezelési segédeszköz
+Comment[is]=KDE aðgengistól
+Comment[it]=Strumento per l'accessibilità di KDE
+Comment[ja]=KDE アクセシビリティ支援ツール
+Comment[ka]=KDE დამხმარე საშუალებები
+Comment[kk]=KDE арнайы мүмкіндіктері
+Comment[km]=ឧបករណ៍​មធ្យោបាយ​ងាយស្រួល KDE
+Comment[ko]=KDE 접근성 도구
+Comment[mk]=Алатка за пристапливост во KDE
+Comment[ms]=Alatan Kebolehcapaian KDE
+Comment[nb]=Tilgjengelighetsverktøy for KDE
+Comment[nds]=KDE-Warktüüch för Behinnerte
+Comment[ne]=KDE पहुँचयोग्य उपकरण
+Comment[nl]=KDE Toegankelijkheid
+Comment[nn]=Tilgjengeverktøy for KDE
+Comment[pa]=KDE ਸਹੂਲਤ ਸੰਦ
+Comment[pl]=Narzędzie ułatwień dostępu KDE
+Comment[pt]=Ferramenta de Acessibilidade do KDE
+Comment[pt_BR]=Ferramenta de Acessibilidade do KDE
+Comment[ro]=Utilitar de accesibilitate pentru KDE
+Comment[ru]=Специальные возможности
+Comment[se]=KDE reaidu álkkibut geavaheami várás
+Comment[sk]=Nástroj na sprístupnenie KDE
+Comment[sl]=Orodje za dostopnost KDE
+Comment[sr]=KDE алатка за приступачност
+Comment[sr@Latn]=KDE alatka za pristupačnost
+Comment[sv]=Handikappverktyg för KDE
+Comment[tg]=Барномаи Тавонёбии KDE
+Comment[th]=เครื่องมือช่วยใช้งานโปรแกรม KDE
+Comment[tr]=KDE Erişilebilirlik Aracı
+Comment[uk]=Засіб доступності для KDE
+Comment[uz]=KDE qulaylik vositasi
+Comment[uz@cyrillic]=KDE қулайлик воситаси
+Comment[vi]=Công cụ hỗ trợ người tàn tật cho KDE
+Comment[wa]=Usteye d' accessibilité KDE
+Comment[zh_CN]=KDE 辅助工具
+Comment[zh_TW]=KDE 無障礙工具
+
+[modifierkey-latched]
+Name=A modifier key has become active
+Name[af]='n Verandering sleutel was geaktiveer
+Name[be]=Задзейнічаная клавіша мадыфікацыі
+Name[bg]=Клавиш модификатор е активен
+Name[bn]=একটি মডিফায়ার কী সক্রিয় হয়েছে
+Name[bs]=Modifikatorska tipka je postala aktivna
+Name[ca]=S'ha activat una tecla modificadora
+Name[cs]=Modifikační klávesa se stala aktivní
+Name[csb]=Klawisza zjinaczi ùstôła włączonô
+Name[da]=En ændringstast er blevet aktiv
+Name[de]=Eine Sondertaste ist aktiv
+Name[el]=Ενεργοποιήθηκε ένα πλήκτρο τροποποιητή
+Name[eo]=Modifigita klavo aktiviĝis
+Name[es]=Se ha activado una tecla modificadora
+Name[et]=Muuteklahv muutus aktiivseks
+Name[eu]=Tekla aldatzaile bat aktibatu da
+Name[fa]=کلید تغییردهنده فعال شده است
+Name[fi]=Muunnosnäppäin on aktivoitunut
+Name[fr]=Une touche de modification est devenue active
+Name[fy]=In modifkaasjetoets wurdt aktyf
+Name[gl]=Activou-se unha tecla modificadora
+Name[hr]=Tipka modifikatora je aktivirana
+Name[hu]=Egy módosító billentyű aktívvá vált
+Name[is]=Breytilykill er nú virkur
+Name[it]=Un tasto modificatore è diventato attivo
+Name[ja]=修飾キーがアクティブになりました
+Name[kk]=Түрлендіру пернесі белсендірілді
+Name[km]=គ្រាប់ចុច​កែប្រែ​មួយ​សកម្ម
+Name[ko]=수정자 키가 활성화됨
+Name[lt]=Modifikavimo klavišas tapo aktyvus
+Name[mk]=Некое копче за модификација стана активно
+Name[nb]=En valgtast er tatt i bruk
+Name[nds]=En Sünnertast is nu aktiv
+Name[ne]=परिमार्जक कुञ्जी सक्रिय बनेको छ
+Name[nl]=Een modificatietoets is geactiveerd
+Name[nn]=Ein valtast er teken i bruk
+Name[pa]=ਇੱਕ ਸਵਿੱਚ ਸੋਧਕ ਸਰਗਰਮ ਹੋ ਗਿਆ ਹA
+Name[pl]=Klawisz modyfikujący został włączony
+Name[pt]=Uma tecla modificadora ficou activa
+Name[pt_BR]=Uma tecla modificadora tornou-se ativa
+Name[ro]=Un modificator de taste a devenit activ
+Name[ru]=Нажата клавиша модификатора
+Name[se]=Válljenboallu lea aktiverejuvvon
+Name[sk]=Modifikačný kláves je aktivovaný.
+Name[sl]=Spremenilna tipka je omogočena
+Name[sr]=Модификаторски тастер је активиран
+Name[sr@Latn]=Modifikatorski taster je aktiviran
+Name[sv]=En väljartangent har aktiverats
+Name[tg]=Калиди ислоҳгар фаъол карда шуд
+Name[th]=ปุ่มสำหรับเปลี่ยนหน้าที่ถูกเปิดใช้งาน
+Name[uk]=Клавішу-модифікатор активовано
+Name[vi]=Một phím bổ trợ đã được kích hoạt
+Name[wa]=Ene tape di candjmint s' a rtrové en alaedje
+Name[zh_CN]=修饰键变为激活
+Name[zh_TW]=輔助按鍵值已變為作用中
+Comment=A modifier key (e.g. Shift or Ctrl) has changed its state and is now active
+Comment[af]='n Verandering sleutel (bv. Shift of Control) se toestand het verander en is nou aktief
+Comment[be]=Клавіша мадыфікацыі (напр. Shift ці Ctrl) змяніла свой стан і зрабілася актыўнай
+Comment[bg]=Клавиш модификатор (Shift или Ctrl) си промени състоянието и е активен сега
+Comment[bn]=একটি মডিফায়ার কী (e.g. Shift বা Ctrl) অবস্থা পরিবর্তন করে এখন সক্রিয় হয়েছে
+Comment[bs]=Modifikatorska tipka (npr. Shift ili Ctrl) je promijenila stanje i postala je aktivna
+Comment[ca]=Una tecla modificadora (p.ex. Majús o Ctrl) ha canviat d'estat i ara està activa
+Comment[cs]=Modifikační kláves (např. Shift nebo Control) změnila svůj stav a je nyní aktivní.
+Comment[csb]=Klawisza zjinaczi (n.p. Shift czë Control) zmieniła stón ë je terô aktiwnô
+Comment[da]=En ændringstast (f.eks., Shift eller Ctrl) har ændret sin tilstand og er nu aktiv
+Comment[de]=Eine Sondertaste (z. B. Umschalt oder Strg) hat ihren Status geändert und ist jetzt aktiv
+Comment[el]=Άλλαξε η κατάσταση ενός πλήκτρου τροποποιητή (π.χ. Shift ή Control) και τώρα είναι ενεργό
+Comment[eo]=Modifa klavo (ekz. majuskliga klavo aŭ stirklavo) ŝanĝis sian staton kaj nun estas aktiva
+Comment[es]=Una tecla modificadora (p.ej. Mayúsculas o Control) ha cambiado su estado y está activa ahora
+Comment[et]=Muuteklahv (nt. Shift või Ctrl) muutis oma olekut ning on nüüd aktiivne
+Comment[eu]=Tekla aldatzaile bat (hau da, Shift edo Kontrol) egoeraz aldatu da eta orain aktiboa da
+Comment[fa]=یک کلید تغییردهنده )مثلاًً، تبدیل یا مهار( وضعیت خود را تغییر داده و اکنون فعال می‌باشد
+Comment[fi]=Muunnosnäppäin (esim. Shift tai Ctrl) on vaihtanut tilaa ja on nyt aktiivinen
+Comment[fr]=L'état d'une touche de modification (ex : Maj ou Ctrl) est modifié et elle est maintenant active
+Comment[fy]=De tastân fan in modifikaasjetoets (sa as Shift of Control) is feroare en is no aktyf.
+Comment[gl]=Unha tecla modificadora (ex. Alt ou Control) mudou de estado e agora está activa
+Comment[hr]=Tipka modifikatora (npr. Shift ili Ctrl) promijenila je svoje stanje i sad je aktivna
+Comment[hu]=Egy módosító billentyű (pl. a Shift vagy a Ctrl) állapota aktívvá változott
+Comment[is]=Breytilykill (Shift eða Ctrl) hefur breytt um stöðu og er nú virkur
+Comment[it]=Un tasto modificatore (es. Shift o Ctrl) ha cambiato stato ed è diventato attivo
+Comment[ja]=修飾キー (Shift や Ctrl など) の状態が変更され、アクティブになりました
+Comment[kk]=Түрледіру пернесі (Shift я Control секілді) күйін өзгертіп, енді белсенді
+Comment[km]=គ្រាប់ចុច​កែប្រែ​មួយ (ឧ. ប្តូរ ឬ ពាក្យ​បញ្ជា) បាន​ផ្លាស់ប្តូរ​សភាព​របស់​វា ហើយឥឡូវ​នេះ​សកម្ម
+Comment[ko]=Shift나 Control 키 같은 수정자 키의 상태가 바뀌었고 현재 사용 가능함
+Comment[lt]=Klavišo - modifikatoriaus (pvz., Lyg2(Shift) arba Vald(Ctrl)) būsena pakito ir jis dabar – aktyvus
+Comment[mk]=Некое копче за модификација (пр. Shift или Ctrl) си ја смени состојбата и сега е активно
+Comment[nb]=En valgtast (f.eks. «Shift» eller «Control») har endret status og er i bruk.
+Comment[nds]=En Sünnertast (t.B. Ümschalt oder Strg) hett den Tostand ännert un is nu aktiv
+Comment[ne]= परिमार्जक कुञ्जीले (जस्तै: Shift वा Ctrl) यसको स्थीति परिवर्तन गरेको छ र अहिले सक्रिय छ
+Comment[nl]=De status van een modificatietoets (zoals Shift of Control) is gewijzigd en is nu actief
+Comment[nn]=Ein valtast (t.d. «Shift» eller «Control») har endra statusen og er no i bruk
+Comment[pl]=Klawisz modyfikujący (np. Shift lub Ctrl) zmienił stan i jest teraz włączony
+Comment[pt]=Uma tecla modificadora (p.ex., o Shift ou o Ctrl) mudou o seu estado e ficou activa
+Comment[pt_BR]=Uma tecla modificadora (p.ex. Shift ou Ctrl) mudou seu estado e agora está ativa
+Comment[ro]=Un modificator de taste (cum ar fi Shift sau Ctrl) și-a schimbat starea și este acum activ
+Comment[ru]=Нажата клавиша модификатора (например, Shift или Ctrl)
+Comment[sk]=Modifikačný kláves (napr. Shift alebo Ctrl) zmenil svoj stav a je teraz aktívny.
+Comment[sl]=Spremenilna tipka (npr. Shift ali Ctrl) je spremenila svoje stanje in je sedaj omogočena
+Comment[sr]=Модификаторски тастер (нпр. Shift или Control) је променио стање и сада је активан
+Comment[sr@Latn]=Modifikatorski taster (npr. Shift ili Control) je promenio stanje i sada je aktivan
+Comment[sv]=En väljartangent (t.ex. Skift eller Ctrl) har ändrat tillstånd och är nu aktiv
+Comment[tg]=Калиди ислоҳгар (мисоли, Shift ё Ctrl) вазъияти худ иваз кард ва ҳозир фаъол аст
+Comment[th]=มีการเปลี่ยนสถานะปุ่มสำหรับเปลี่ยนหน้าที่ (เช่น Shift หรือ Control) และขณะนี้ เปิดใช้งาน
+Comment[uk]=Клавіша-модифікатор (напр., Shift або Control) змінила свій стан і тепер активна
+Comment[vi]=Một phím bổ trợ (như Shift hay Ctrl) đã thay đổi trạng thái và được kích hoạt
+Comment[wa]=Ene tape di candjmint (metans SHIFT ou CTRL) a candjî si-estat et est asteure en alaedje
+Comment[zh_CN]=修饰键(即 Shift 或 Ctrl)更改了其状态,现已激活
+Comment[zh_TW]=輔助按鍵 (例, Shift 或 Control) 已改變其狀態且目前為作用中
+default_sound=KDE_Click.wav
+default_presentation=0
+nopresentation=236
+
+[modifierkey-unlatched]
+Name=A modifier key has become inactive
+Name[af]='n Verandering sleutel was gedeaktiveer
+Name[be]=Клавіша мадыфікацыі зрабілася неактыўнай
+Name[bg]=Клавиш модификатор е неактивен
+Name[bn]=একটি মডিফায়ার কী নিষ্ক্রীয় হয়েছে
+Name[bs]=Modifikatorska tipka je postala neaktivna
+Name[ca]=S'ha desactivat una tecla modificadora
+Name[cs]=Modifikační klávesa se stala neaktivní
+Name[csb]=Klawisza zjinaczi òstałą włączonô
+Name[da]=En ændringstast er blevet deaktiveret
+Name[de]=Eine Sondertaste ist nicht mehr aktiv
+Name[el]=Απενεργοποιήθηκε ένα πλήκτρο τροποποιητή
+Name[eo]=Modifa klavo malaktiviĝis
+Name[es]=Se ha desactivado una tecla modificadora
+Name[et]=Muuteklahv muutus mitteaktiivseks
+Name[eu]=Tekla aldatzaile bat desaktibatu da
+Name[fa]=کلید تغییردهنده غیرفعال شده است
+Name[fi]=Muunnosnäppäin ei ole enää aktiivinen
+Name[fr]=Une touche de modification est devenue inactive
+Name[fy]=In modifikaasjetoets wurdt ynaktief
+Name[gl]=Unha tecla modificadora foi desactivada
+Name[hr]=Tipka modifikatora je deaktivirana
+Name[hu]=Egy módosító billentyű inaktívvá vált
+Name[is]=Breytilykill er nú óvirkur
+Name[it]=Un tasto modificatore è diventato inattivo
+Name[ja]=修飾キーが非アクティブになりました
+Name[kk]=Түрлендіру пернесі белсендігін жоғалтты
+Name[km]=គ្រាប់ចុច​កែប្រែ​មួយ​អសកម្ម​ហើយ
+Name[ko]=수정자 키가 비활성화됨
+Name[lt]=Klavišas - modifikatorius tapo neaktyvus
+Name[mk]=Некое копче за модификација стана неактивно
+Name[nb]=En valgtast er blitt skrudd av
+Name[nds]=En Sünnertast is nich mehr aktiv
+Name[ne]=परिमार्जक कुञ्जी निस्क्रिय बनेको छ
+Name[nl]=Een modificatietoets is gedeactiveerd
+Name[nn]=Ein valtast er slått av
+Name[pl]=Klawisz modyfikujący został wyłączony
+Name[pt]=Uma tecla modificadora ficou inactiva
+Name[pt_BR]=Uma tecla modificadora tornou-se inativa
+Name[ro]=Un modificator de taste a devenit inactiv
+Name[ru]=Отжата клавиша модификатора
+Name[se]=Válljenboallu ii leat šat aktiivalaš
+Name[sk]=Modifikačný kláves je neaktívny.
+Name[sl]=Spremenilna tipka je onemogočena
+Name[sr]=Модификаторски тастер је деактивиран
+Name[sr@Latn]=Modifikatorski taster je deaktiviran
+Name[sv]=En väljartangent har inaktiverats
+Name[tg]=Калиди ислоҳгар ғайри фаъол карда шуд
+Name[th]=ปุ่มสำหรับเปลี่ยนหน้าที่ถูกปิดการใช้งาน
+Name[uk]=Клавішу-модифікатор деактивовано
+Name[vi]=Một phím bổ trợ đã bị tắt
+Name[wa]=Ene tape di candjmint s' a rtrové dismetowe
+Name[zh_CN]=修饰键变为非激活
+Name[zh_TW]=輔助按鍵已變為非作用中
+Comment=A modifier key (e.g. Shift or Ctrl) has changed its state and is now inactive
+Comment[af]='n Verandering sleutel (bv. Shift of Contorl) se toestand het verander en is nou onaktief
+Comment[be]=Клавіша мадыфікацыі (напр. Shift ці Ctrl) змяніла свой стан і зрабілася неактыўнай
+Comment[bg]=Клавиш модификатор (Shift или Ctrl) си промени състоянието и е неактивен сега
+Comment[bn]=একটি মডিফায়ার কী (e.g. Shift বা Ctrl) অবস্থা পরিবর্তন করে এখন নিষ্ক্রীয় হয়েছে
+Comment[bs]=Modifikatorska tipka (npr. Shift ili Ctrl) je promijenila stanje i sada je neaktivna
+Comment[ca]=Una tecla modificadora (p.ex. Majús o Ctrl) ha canviat d'estat i ara està inactiva
+Comment[cs]=Modifikační kláves (např. Shift nebo Control) změnila svůj stav a je nyní neaktivní.
+Comment[csb]=Klawisza zjinaczi (n.p. Shift czë Control) zmieniła stón ë je terô aktiwnô
+Comment[da]=En ændringstast (f.eks., Shift eller Ctrl) har ændret sin tilstand og er nu inaktiv
+Comment[de]=Eine Sondertaste (z. B. Umschalt oder Strg) hat ihren Status geändert und ist jetzt inaktiv
+Comment[el]=Άλλαξε η κατάσταση ενός πλήκτρου τροποποιητή (π.χ. Shift ή Control) και τώρα είναι ανενεργό
+Comment[eo]=Modifa klavo (ekz. majuskliga klavo aŭ stirklavo) ŝanĝis sian staton kaj nun estas malaktiva
+Comment[es]=Una tecla modificadora (p.ej. Mayúsculas o Control) ha cambiado su estado y ahora está inactiva
+Comment[et]=Muuteklahv (nt. Shift või Ctrl) muutis oma olekut ning on nüüd mitteaktiivne
+Comment[eu]=Tekla aldatzaile bat (hau da, Shift edo Kontrol) egoeraz aldatu da eta orain inaktiboa da
+Comment[fa]=یک کلید تغییردهنده )مثلاً، تبدیل یا مهار( وضعیت خود را تغییر داده و اکنون غیر‌فعال می‌باشد
+Comment[fi]=Muunnosnäppäin (esim. Shift tai Ctrl) on vaihtanut tilaa eikä ole enää aktiivinen
+Comment[fr]=L'état d'une touche de modification (ex : Maj ou Ctrl) est modifié et elle est maintenant inactive
+Comment[fy]=De tastân fan in modifikaasjetoets (sa as Shift of Control) is feroare en is no ynaktyf.
+Comment[gl]=Unha tecla modificadora (ex. Alt ou Control) mudou de estado e agora está inactiva
+Comment[hr]=Tipka modifikatora (npr. Shift ili Ctrl) promijenila je svoje stanje i sad nije aktivna
+Comment[hu]=Egy módosító billentyű (pl. a Shift vagy a Ctrl) állapota inaktívvá változott
+Comment[is]=Breytilykill (Shift eða Ctrl) hefur breytt um stöðu og er nú óvirkur
+Comment[it]=Un tasto modificatore (es. Shift o Ctrl) ha cambiato stato ed è diventato inattivo
+Comment[ja]=修飾キー (Shift や Ctrl など) の状態が変更され、非アクティブになりました
+Comment[kk]=Түрледіру пернесі (Shift я Control секілді) күйін өзгертіп, енді белсенді емес
+Comment[km]=គ្រាប់​ចុច​កែប្រែ (ឧ. ប្តូរ ឬ បញ្ជា) បាន​ផ្លាស់ប្តូរ​សភាព​របស់វា ហើយ ឥឡូវ​នេះ​អសកម្ម
+Comment[ko]=Shift나 Control 키 같은 수정자 키의 상태가 바뀌었고 현재 사용 불가능함
+Comment[lt]=Klavišo - modifikatoriaus (pvz., Lyg2(Shift) arba Vald(Ctrl)) būsena pakito ir jis dabar - neaktyvus
+Comment[mk]=Некое копче за модификација (пр. Shift или Ctrl) си ја смени состојбата и сега е неактивно
+Comment[nb]=En valgtast (f.eks. «Shift» eller «Ctrl») har endret status og er ikke mer i bruk
+Comment[nds]=En Sünnertast (t.B. Ümschalt oder Strg) hett den Tostand ännert un is nu inaktiv
+Comment[ne]=परिमार्जक कुञ्जीले (जस्तै: Shift वा Ctrl) यसको स्थिति परिवर्तन गरेको छ र अहिले निस्क्रिय छ
+Comment[nl]=De status van een modificatietoets (zoals Shift of Control) is gewijzigd en is nu inactief
+Comment[nn]=Ein valtast (t.d. «Shift» eller «Ctrl») har endra statusen og er ikkje i bruk lenger
+Comment[pl]=Klawisz modyfikujący (np. Shift lub Ctrl) zmienił stan i jest teraz wyłączony
+Comment[pt]=Uma tecla modificadora (p.ex., o Shift ou o Ctrl) mudou o seu estado e ficou inactiva
+Comment[pt_BR]=Uma tecla modificadora (p.ex. Shift ou Ctrl) mudou seu estado e agora está inativa
+Comment[ro]=Un modificator de taste (cum ar fi Shift sau Ctrl) și-a schimbat starea și este acum inactiv
+Comment[ru]=Деактивирована клавиша модификатора (например, Shift или Ctrl)
+Comment[sk]=Modifikačný kláves (napr. Shift alebo Ctrl) zmenil svoj stav a je teraz neaktívny.
+Comment[sl]=Spremenilna tipka (npr. Shift ali Ctrl) je spremenila svoje stanje in je sedaj oneomogočena
+Comment[sr]=Модификаторски тастер (нпр. Shift или Control) је променио стање и више није активан
+Comment[sr@Latn]=Modifikatorski taster (npr. Shift ili Control) je promenio stanje i više nije aktivan
+Comment[sv]=En väljartangent (t.ex. Skift eller Ctrl) har ändrat tillstånd och är nu inaktiv
+Comment[tg]=Калиди ислоҳгар (мисоли, Shift ё Ctrl) вазъияти худ иваз кард ва ҳозир ғайри фаъол аст
+Comment[th]=มีการเปลี่ยนสถานะปุ่มสำหรับเปลี่ยนหน้าที่ (เช่น Shift หรือ Control) และขณะนี้ ถูกปิดการใช้งาน
+Comment[uk]=Клавіша-модифікатор (напр., Shift або Control) змінила свій стан і тепер неактивна
+Comment[vi]=Một phím bổ trợ (như Shift hay Ctrl) đã thay đổi trạng thái và đã bị tắt
+Comment[wa]=Ene tape di candjmint (metans SHIFT ou CTRL) a candjî si-estat et n' est asteure pus en alaedje
+Comment[zh_CN]=修饰键(即 Shift 或 Ctrl)更改了其状态,现已非激活
+Comment[zh_TW]=輔助按鍵 (例, Shift 或 Control) 已改變其狀態且目前為非作用中
+default_sound=KDE_Click.wav
+default_presentation=0
+nopresentation=236
+
+[modifierkey-locked]
+Name=A modifier key has been locked
+Name[af]='n Verandering sleutel was gesluit
+Name[be]=Клавіша мадыфікацыі заблакаваная
+Name[bg]=Клавиш модификатор е заключен
+Name[bn]=একটি মডিফায়ার কী লক করা হয়েছে
+Name[bs]=Modifikatorska tipka je zaključana
+Name[ca]=S'ha bloquejat una tecla modificadora
+Name[cs]=Modifikační klávesa byla zamčena
+Name[csb]=Klawisza zjinaczi òstała zablokòwónô
+Name[da]=En ændringstast er blevet låst
+Name[de]=Eine Sondertaste wurde eingerastet
+Name[el]=Ένα πλήκτρο τροποποιητή κλειδώθηκε
+Name[eo]=Modifa klavo ŝlosiĝis
+Name[es]=Se ha bloqueado una tecla modificadora
+Name[et]=Muuteklahv on lukustatud
+Name[eu]=Tekla aldatzaile bat blokeatu da
+Name[fa]=کلید تغییردهنده قفل شده است
+Name[fi]=Muunnosnäppäin on lukittu
+Name[fr]=Une touche de modification a été verrouillée
+Name[fy]=In modifikaasjetoets is beskoattele
+Name[gl]=Unha tecla modificadora foi bloqueada
+Name[hr]=Tipka modifikatora je zaključana
+Name[hu]=Egy módosító billentyű zárolódott
+Name[is]=Breytilykli hefur verið læst
+Name[it]=Un tasto modificatore è stato bloccato
+Name[ja]=修飾キーがロックされました
+Name[kk]=Түрлендіру пернесі қосулы
+Name[km]=គ្រាប់ចុច​កែប្រែ​មួយ​ត្រូវ​បាន​ចាក់សោ
+Name[ko]=수정자 키가 잠김
+Name[lt]=Klavišas - modifikatorius buvo užrakintas
+Name[mk]=Некое копче за модификација е заклучено
+Name[nb]=En valgtast er blitt låst
+Name[nds]=En Sünnertast wöör fastsett
+Name[ne]=परिमार्जक कुञ्जीमा ताल्चा लागेको छ
+Name[nl]=Een modificatietoets is vergrendeld
+Name[nn]=Ein valtast er blitt låst
+Name[pl]=Klawisz modyfikujący został zablokowany
+Name[pt]=Uma tecla modificadora ficou bloqueada
+Name[pt_BR]=Uma tecla modificadora foi bloqueada
+Name[ro]=Un modificator de taste a fost blocat
+Name[ru]=Клавиша модификатора зафиксирована
+Name[se]=Válljenboallu lea lohkaduvvon
+Name[sk]=Modifikačný kláves je zamknutý
+Name[sl]=Spremenilna tipka je zaklenjena
+Name[sr]=Модификаторски тастер је закључан
+Name[sr@Latn]=Modifikatorski taster je zaključan
+Name[sv]=En väljartangent har låsts
+Name[tg]=Калиди ислоҳгар қулф карда шуд
+Name[th]=ปุ่มเปลี่ยนหน้าที่ค้างอยู่
+Name[uk]=Клавішу-модифікатор заблоковано
+Name[vi]=Một phím bổ trợ đã được khoá
+Name[wa]=Ene tape di candjmint a stî serêye
+Name[zh_CN]=修饰键现已锁定
+Name[zh_TW]=輔助按鍵已經鎖定
+Comment=A modifier key (e.g. Shift or Ctrl) has been locked and is now active for all of the following keypresses
+Comment[af]='n Verandering sleutel (bv. Shift of Control) is gesluit en is nou aktief vir al die volgende sleutel ponse
+Comment[be]=Клавіша мадыфікацыі (напр. Shift ці Ctrl) была заблакаваная і цяпер актыўная для ўсіх наступных націскаў іншых клавішаў
+Comment[bg]=Клавиш модификатор е заключен и е активен за всички последващи клавиши
+Comment[bn]=একটি মডিফায়ার কী (e.g. Shift বা Ctrl) লক করা হয়েছে এবং পরবর্তী সবকটি কী-র (key) জন্য সক্রিয় থাকবে
+Comment[bs]=Modifikatorska tipka (npr. Shift ili Ctrl) je zaključana i sada je aktivna za sve naredne tipke
+Comment[ca]=Una tecla modificadora (p.ex. Majús o Ctrl) s'ha bloquejat i ara està activa per a totes les pulsacions següents
+Comment[cs]=Modifikační klávesa (např. Shift nebo Control) byla zamčena a je nyní aktivní pro všechny následující stisky kláves
+Comment[csb]=Klawisz zjinaczi (np. Shift czë Control) òstôła zablokòwónô ë bãdze altiwòwónô przë nôslédnym wcësniãcô klawiszë
+Comment[da]=En ændringstast (f.eks., Shift eller Ctrl) er blevet låst og er nu aktiv for alle følgende tastetryk
+Comment[de]=Eine Sondertaste (z. B. Umschalt oder Strg) wurde eingerastet und bleibt für alle folgenden Tastendrücke aktiv
+Comment[el]=Ένα πλήκτρο τροποποιητή (π.χ. Shift ή Control) κλειδώθηκε και είναι τώρα ενεργό για τα επόμενα πατήματα πλήκτρων
+Comment[eo]=Modifa klavo (ekz. majuskliga klavo aŭ stirklavo) ŝlosiĝis kaj nun estas aktiva por sekvantaj klavpremoj
+Comment[es]=Se ha bloqueado una tecla modificadora (p. ej. Mayúsculas o Control) y ahora está activa para el resto de las operaciones con el teclado
+Comment[et]=Muuteklahv (nt. Shift või Ctrl) on lukustatud ja on nüüd aktiivne kõikide järgnevate klahvivajutuste jaoks
+Comment[eu]=Tekla aldatzaile bat (hau da, Shift edo Kontrol) blokeatu da eta orain aktiboa da hurrengo tekla zapaketa guztiendako
+Comment[fa]=یک کلید تغییردهنده )مثلاً، تبدیل یا مهار( قفل شده و اکنون برای همۀ فشارهای کلید زیر فعال می‌باشد
+Comment[fi]=Muunnosnäppäin (esim. Shift tai Ctrl) on lukittu ja on nyt aktiivinen kaikille seuraaville näppäinpainalluksille
+Comment[fr]=Une touche de modification (ex : Maj ou Ctrl) a été verrouillée et est maintenant active pour toutes les touches suivantes
+Comment[fy]=In modifikaasjetoets (sa as Shift of Control) is beskoattele en is no aktyf foar de neikommende toetsoanslaggen
+Comment[gl]=Unha tecla modificadora (ex. Alt ou Control) foi bloqueada e agora está activa para as seguintes combinacións
+Comment[hr]=Tipka modifikatora (npr. Shift ili Ctrl) zaključana je i sad je aktivna tijekom svih sljedećih pritisaka na tipke
+Comment[hu]=Egy módosító billentyű (pl. a Shift vagy a Ctrl) zárolódott, és ezután minden billentyűlenyomásnál aktív lesz
+Comment[is]=Breytilykli (Shift eða Ctrl) hefur verið læst og er nú virkur fyrir eftirfarandi lyklaborðsaðgerðir
+Comment[it]=Un tasto modificatore (es. Shift o Ctrl) è stato bloccato e adesso è attivo per le prossime immissioni
+Comment[ja]=修飾キー (Shift や Ctrl など) がロックされ、続くキー押下のすべてに対してアクティブになりました
+Comment[kk]=Түрлендіру пернесі (Shift я Control секілді) қосылып, енді келесі басылатын пернесінің әсерін түрлендіруге дайын
+Comment[km]= គ្រាប់ចុច​កែប្រែ​មួយ (ឧ. ប្តូរ ឬ បញ្ជា) ត្រូវ​បាន​ចាក់សោ ហើយ ឥឡូវ​វាសកម្ម​សម្រាប់​ការសង្កត់​គ្រាប់ចុច​ខាងក្រោម​ទាំងអស់​ ។
+Comment[ko]=Shift나 Control 키 같은 수정자 키의 상태가 바뀌었고 현재 모든 키 입력에 대해서 활성화됨
+Comment[lt]=Klavišas - modifikatorius (pvz., Lyg2(Shift) arba Vald(Ctrl)) buvo užrakintas ir dabar visiems būsimiems klavišų paspaudimams yra aktyvus
+Comment[mk]=Некое копче за модификација (пр. Shift или Ctrl) беше заклучено и сега е активно за сите наредни притиснати копчиња
+Comment[nb]=En valgtast (f.eks. «Shift» eller «Ctrl») er blitt låst og er nå tilgjengelig for alle de følgende tastetrykkene
+Comment[nds]=En Sünnertast (t.B. Ümschalt oder Strg) wöör fastsett un is nu aktiv för dat Drücken vun all nakamen Tasten
+Comment[ne]=परिमार्जक कुञ्जीमा (जस्तै: Shift वा Ctrl) ताल्चा लागेको छ र अहिले निम्न कुञ्जी थिच्नेहरू सबैका लागि सक्रिय छन्
+Comment[nl]=Een modificatietoets (zoals Shift of Control) is vergrendeld en is nu actief voor de volgende toetsaanslagen
+Comment[nn]=Ein valtast (t.d. «Shift» eller «Ctrl») er blitt låst og vert no bruka saman med alle følgjande tastetrykk
+Comment[pl]=Klawisz modyfikujący (np. Shift lub Ctrl) został zablokowany i będzie włączony przy następnych naciśnięciach klawiszy
+Comment[pt]=Uma tecla modificadora (p.ex., o Shift ou o Ctrl) ficou bloqueada e está agora activa para todas as sequências de teclas seguintes
+Comment[pt_BR]=Uma tecla modificadora (p.ex. Shift ou Ctrl) foi bloqueada e agora está ativa para todas as seqüências de teclas seguintes
+Comment[ro]=Un modificator de taste (cum ar fi Shift sau Ctrl) a fost blocat și este acum activ pentru următoarele apăsări de taste
+Comment[ru]=Клавиша модификатора (например, Shift или Ctrl) зафиксирована и активна при нажатии любых других клавиш
+Comment[sk]=Modifikačný kláves (napr. Shift alebo Ctrl) je zamknutý a je teraz aktívny pre všetky nasledujúce stlačenia kláves
+Comment[sl]=Spremenilna tipka (npr. Shift ali Ctrl) je zaklenjena in je sedaj omogočena za vse tipkanje v nadaljnje
+Comment[sr]=Модификаторски тастер (нпр. Shift или Control) је закључан и сада је активан за све наредне притиске тастера
+Comment[sr@Latn]=Modifikatorski taster (npr. Shift ili Control) je zaključan i sada je aktivan za sve naredne pritiske tastera
+Comment[sv]=En väljartangent (t.ex. Skift eller Ctrl) har låsts och är nu aktiv för alla följande tangentnertryckningar
+Comment[tg]=Калиди ислоҳгар (мисоли, Shift ё Ctrl) қулф карда буд лекин ҳозир ин фаъол аст барои ҳамаи пахшзаданиҳои оянда
+Comment[th]=ปุ่มสำหรับเปลี่ยนหน้าที่ (เช่น Shift หรือ Control) ค้างอยู่ และขณะนี้จะถูกใช้งาน สำหรับการกดคีย์อื่นๆ ต่อจากนี้ทั้งหมด
+Comment[uk]=Клавіша-модифікатор (напр., Shift або Control) була заблокована і тепер активна для всіх наступних натискань клавіш
+Comment[vi]=Một phím bổ trợ (như Shift hay Ctrl) đã được khoá và từ giờ bạn có thể dùng nó khi gõ bàn phím
+Comment[wa]=Ene tape di candjmint (metans SHIFT ou CTRL) a stî serêye et est asteure en alaedje po tos les tapes di tchôkeyes.
+Comment[zh_CN]=修饰键(即 Shift 或 Ctrl)已被锁定,现在将适用于后续按键
+Comment[zh_TW]=輔助按鍵 (例, Shift 或 Control) 已經鎖定且目前對所有下列按下按鍵的動作為作用中
+default_sound=KDE_Click.wav
+default_presentation=0
+nopresentation=236
+
+[lockkey-locked]
+Name=A lock key has been activated
+Name[af]='n Sluit sleutel was geaktiveer
+Name[be]=Клавіша блакіроўкі задзейнічаная
+Name[bg]=Заключващ клавиш бе активиран
+Name[bs]=Aktivirana je tipka za zaključavanje
+Name[ca]=S'ha activat una tecla de bloqueig
+Name[cs]=Klávesa zámku byla aktivována
+Name[csb]=Klawisza blokadë je aktiwòwónô
+Name[da]=En låsetast er blevet aktiveret
+Name[de]=Eine Feststelltaste wurde aktiviert
+Name[el]=Ένα πλήκτρο τροποποιητή ξεκλειδώθηκε
+Name[eo]=Ŝlosa klavo aktiviĝis
+Name[es]=Una tecla de bloqueo se ha activado
+Name[et]=Lukustusklahv on aktiveeritud
+Name[eu]=Tekla blokeaketa aktibatu da
+Name[fa]=یک کلید قفل فعال شده است
+Name[fi]=Lukitusnäppäin on aktivoitu
+Name[fr]=Une touche de verrouillage a été activée
+Name[fy]=In beskoatteltoets is aktivearre
+Name[gl]=Activou-se unha tecla de bloqueo
+Name[he]=מקש ננעל הופעל
+Name[hr]=Tipka zaključavanja je aktivirana
+Name[hu]=Egy zároló billentyű aktívvá vált
+Name[is]=Læsilykill hefur verið virkjaður
+Name[it]=Un tasto di blocco è stato attivato
+Name[ja]=ロックキーがアクティブになりました
+Name[ka]=დაბლოკვის ღილაკი გააქტივებულია
+Name[kk]=Қосқыш перне белсенді
+Name[km]=ការ​ចាក់សោ​គ្រាប់​ចុច​ត្រូវ​បាន​ធ្វើ​ឲ្យ​សកម្ម
+Name[ko]=잠금 키가 활성화됨
+Name[lt]=Užrakto klavišas buvo aktyvuotas
+Name[mk]=Некое копче за заклучување беше активирано
+Name[nb]=En valgtast er blitt skrudd på
+Name[nds]=En Faststelltast is nu aktiv
+Name[ne]=एउटा ताल्चा लगाएको कुञ्जी सक्रिय पारिएको छ
+Name[nl]=Een vergrendeltoets is geactiveerd
+Name[nn]=Ein låsetast er blitt slått på
+Name[pl]=Klawisz blokujący został włączony
+Name[pt]=Uma tecla de bloqueio ficou activa
+Name[pt_BR]=Uma tecla de bloqueio foi ativada
+Name[ro]=O tastă de blocare a fost activată
+Name[ru]=Активирована клавиша переключения режимов
+Name[se]=Lohkadanboallu lea aktiverejuvvon
+Name[sk]=Zamykací kláves je aktivny.
+Name[sl]=Zaklenilna tipka je omogočena
+Name[sr]=Тастер за закључавање је активиран
+Name[sr@Latn]=Taster za zaključavanje je aktiviran
+Name[sv]=En låstangent har aktiverats
+Name[tg]=Калиди қулф фаъол карда шуд
+Name[th]=ปุ่มล็อคเปิดใช้งาน
+Name[uk]=Клавішу блокування активовано
+Name[vi]=Một phím khoá đã được kích hoạt
+Name[wa]=Ene tape po serer a stî metowe en alaedje
+Name[zh_CN]=锁定键现已激活
+Name[zh_TW]=鎖定鍵已作用
+Comment=A lock key (e.g. Caps Lock or Num Lock) has changed its state and is now active
+Comment[af]='n Sluit sleutel (bv. Caps Lock of Num Lock) se toestand het verander en is nou aktief
+Comment[be]=Клавіша блакіроўкі (напр. Caps Lock ці Num Lock) змяніла свой стан і зрабілася актыўнай
+Comment[bg]=Заключващ клавиш (Caps Lock или Num Lock) си промени състоянието и е неактивен сега
+Comment[bs]=Tipka za zaključavanje (npr. Caps Lock ili Num Lock) je promijenila stanje i sada je aktivna
+Comment[ca]=Una tecla de bloqueig (p.ex. BloqMajús o BloqNum) ha canviat d'estat i ara està activa
+Comment[cs]=Klávesa zámku (např. Caps Lock nebo Num Lock) změnila svůj stav a je nyní aktivní
+Comment[csb]=Klawisza blokadë (np. Caps Lock czë Num Lock) zmieniłą stón ë nie je terô aktiwnô
+Comment[da]=En låsetast (f.eks., Caps Lock eller Num Lock) har ændret sin tilstand og er nu aktiv
+Comment[de]=Eine Feststelltaste (z. B. die Hochstelltaste oder Num-Lock) hat ihren Status geändert und ist nun aktiv
+Comment[el]=Ένα πλήκτρο κλειδώματος (π.χ. Caps Lock ή Num Lock) άλλαξε κατάσταση και είναι τώρα ανενεργό
+Comment[eo]=Ŝlosa klavo (ekz. majuskla baskulo aŭ Cifera baskulo) ŝanĝis sian staton kaj nun estas aktiva
+Comment[es]=Una tecla de bloqueo (p. ej., Bloq Mayús o Bloq Num) ha cambiado su estado y ahora está inactiva
+Comment[et]=Lukustusklahv (nt. Caps Lock või Num Lock) muutis oma seisundit ning on nüüd mitteaktiivne
+Comment[eu]=Tekla blokeatzaile bat (hau da, blok. maius. edo blok. zenb.) egoeraz aldatu da eta orain aktiboa da
+Comment[fa]=یک کلید قفل )مثلاً ، قفل تبدیل یا قفل اعداد( وضعیت خود را تغییر داده و اکنون غیرفعال می‌باشد
+Comment[fi]=Lukitusnäppäin (esim. CapsLock tai NumLock) on vaihtanut tilaansa ja on nyt aktiivinen
+Comment[fr]=L'état d'une touche de verrouillage (ex : Verr. Maj ou Verr. Num.) est modifié et elle est maintenant inactive
+Comment[fy]=De tastân fan in beskoatteltoets (sa as kaptaalskoattel of Nûm skoattel) is wizige en is no ynaktyf.
+Comment[gl]=Unha tecla de bloqueo (ex., Bloq Maius ou Bloq Num) mudou de estado e agora está activa
+Comment[he]=מקש ננעל (למשל Caps Lock או Num Lock) שינה את מצבו והוא כעת פעיל
+Comment[hr]=Tipka zaključavanja (npr. CapsLock ili NumLock) promijenila je svoje stanje i sad je aktivna
+Comment[hu]=Egy zároló billentyű (pl. a Caps Lock vagy a Num Lock) állapota aktívvá vált
+Comment[is]=Læsilykill (Caps Lock eða Num Lock) hefur breytt um stöðu og er nú virkur
+Comment[it]=Un tasto di blocco (es. Bloc Maiusc o Bloc Num) ha cambiato stato e adesso è inattivo
+Comment[ja]=ロックキー (Caps Lock や Num Lock など) の状態が変更され、アクティブになりました
+Comment[kk]=Қосқыш перне (Caps Lock я Num Lock) күйін өзгертіп, енді белсенді
+Comment[km]=គ្រាប់​ចុច​ចាក់សោ (ឧ. ប្តូរ​ជាប់ ឬ Num Lock) បាន​ផ្លាស់ប្តូរ​សភាព​របស់​វា ហើយ ឥឡូវ​នេះ​វាអសកម្ម
+Comment[ko]=Caps Lock이나 Num Lock 키 같은 잠금 키의 상태가 바뀌었고 현재 활성화됨
+Comment[lt]=Užrakto klavišo (pvz., Didž(Caps Lock) arba Sk(Num Lock)) būsena pakito ir jis dabar - aktyvus
+Comment[mk]=Некое копче за заклучување (пр. Caps Lock или Num Lock) си ја смени состојбата и сега е неактивно
+Comment[nb]=En låsetast (f.eks. «Caps Lock» eller «Num lock») har endret status og er nå skrudd på.
+Comment[nds]=En Faststelltast (t.B. Tallenrast oder Grootschrieventast) hett den Tostand ännert un is nu aktiv
+Comment[ne]=एउटा ताल्चा लगाउने कुञ्जीले (जस्तै: Caps Lock वा Num Lock) यसको स्थिति परिवर्तन गरेको छ र अहिले सक्रिय छ
+Comment[nl]=De status van een vergrendeltoets (zoals Caps Lock of Num Lock) is gewijzigd en is nu inactief
+Comment[nn]=Ein låsetast (t.d. «Caps Lock» eller «Num lock») har endra statusen og er no slått på
+Comment[pl]=Klawisz blokujący (np. Caps Lock lub Num Lock) zmienił stan i jest teraz wyłączony
+Comment[pt]=Uma tecla de bloqueio (p.ex., o Caps Lock ou o Num Lock) mudou o seu estado e ficou activa
+Comment[pt_BR]=Uma tecla de bloqueio (p.ex. Caps Lock ou Num Lock) mudou seu estado e agora está ativa
+Comment[ro]=O tastă de blocare (cur ar fi Caps Lock sau Num Lock) și-a schimbat starea și este acum activă
+Comment[ru]=Активирована клавиша переключения режимов (например, Caps Lock или Num Lock)
+Comment[sk]=Zamykací kláves (napr. Caps Lock alebo Num Lock) zmenil svoj stav a je teraz aktívny.
+Comment[sl]=Zaklenilna tipka (npr. Caps Lock ali Num Lock) je spremenila svoje stanje in je sedaj omogočena
+Comment[sr]=Тастер за закључавање (нпр. Caps Lock или Num Lock) је променио стање и сада је активан
+Comment[sr@Latn]=Taster za zaključavanje (npr. Caps Lock ili Num Lock) je promenio stanje i sada je aktivan
+Comment[sv]=En låstangent (t.ex. Caps Lock eller Num Lock) har ändrat tillstånd och är nu aktiv
+Comment[tg]=Калиди қулф (мисоли, Caps Lock ё Num Lock) вазъияти худ иваз кард ва ҳозир фаъол аст
+Comment[th]=มีการเปลี่ยนสถานะปุ่มล็อค (เช่น Caps Lock หรือ Num Lock) และขณะนี้เปิดการใช้งาน
+Comment[uk]=Клавіша блокування (напр., Caps Lock або Num Lock) змінила свій стан і тепер активна
+Comment[vi]=Một phím khoá (như Caps Lock hay Num Lock) đã thay đổi trạng thái và được kích hoạt
+Comment[wa]=Ene tape po serer (metans CAPS LOCK ou NUM LOCK) a candjî d' esta et est asteure en alaedje
+Comment[zh_CN]=锁定键(如 Caps Lock 或 Num Lock)更改了其状态,现已非激活
+Comment[zh_TW]=鎖定按鍵(例, 大寫鎖定或數字鎖定)已改變其狀態且目前為作用中
+default_sound=KDE_Click.wav
+default_presentation=0
+nopresentation=236
+
+[lockkey-unlocked]
+Name=A lock key has been deactivated
+Name[af]='n Sluit sleutel was gedeaktiveer
+Name[be]=Клавіша блакіроўкі зрабілася неактыўнай
+Name[bg]=Заключващ клавиш бе деактивиран
+Name[bs]=Tipka za zaključavanje je deaktivirana
+Name[ca]=S'ha desactivat una tecla de bloqueig
+Name[cs]=Klávesa zámku byla deaktivována
+Name[csb]=Klawisza blokadë nie je aktiwnô
+Name[da]=En låsetast er blevet deaktiveret
+Name[de]=Eine Feststelltaste wurde deaktiviert
+Name[el]=Ένα πλήκτρο κλειδώματος απενεργοποιήθηκε
+Name[eo]=Ŝlosa klavo malaktiviĝis
+Name[es]=Una tecla de bloqueo se ha desactivado
+Name[et]=Lukustusklahv on nüüd mitteaktiivne
+Name[eu]=Tekla blokeaketa desaktibatu da
+Name[fa]=کلید قفل غیرفعال شده است
+Name[fi]=Lukitusnäppäin on nyt deaktivoitu
+Name[fr]=Une touche de verrouillage a été désactivée
+Name[fy]=In beskoatteltoets is ûntaktivearre
+Name[gl]=Unha tecla de bloqueo foi desactivada
+Name[he]=מקש ננעל נכבה
+Name[hr]=Tipka zaključavanja je deaktivirana
+Name[hu]=Egy zároló billentyű inaktívvá vált
+Name[is]=Læsilykill hefur verið aftengdur
+Name[it]=Un tasto di blocco è stato disattivato
+Name[ja]=ロックキーが非アクティブになりました
+Name[ka]=დაბლოკვის ღილაკი ამორთულია
+Name[kk]=Қосқыш перне өшіруілі
+Name[km]=គ្រាប់ចុច​ចាក់សោ​ត្រូវ​បាន​ធ្វើ​ឲ្យ​អសកម្ម
+Name[ko]=잠금 키가 비활성화됨
+Name[lt]=Užrakto klavišas buvo išjungtas
+Name[mk]=Некое копче за заклучување беше активирано
+Name[nb]=En låsetast er blitt skrudd av
+Name[nds]=En Faststelltast is nu nich mehr aktiv
+Name[ne]=एउटा ताल्चा लगाउने कुञ्जी निस्क्रिय पारिएको छ
+Name[nl]=Een vergrendeltoets is gedeactiveerd
+Name[nn]=Ein låsetast er blitt slått av
+Name[pl]=Klawisz blokujący został wyłączony
+Name[pt]=Uma tecla de bloqueio ficou inactiva
+Name[pt_BR]=Uma tecla de bloqueio foi desativada
+Name[ro]=O tastă de blocare a fost deactivată
+Name[ru]=Деактивирована клавиша переключения режимов
+Name[se]=Lohkadanboallu ii leat šat aktiivalaš
+Name[sk]=Zamykací kláves je neaktívny.
+Name[sl]=Zaklenilna tipka je onemogočena
+Name[sr]=Тастер за закључавање је деактивиран
+Name[sr@Latn]=Taster za zaključavanje je deaktiviran
+Name[sv]=En låstangent har inaktiverats
+Name[tg]=Калиди қулф ғайри фаъол карда буд
+Name[th]=ปุ่มล็อคถูกปิด
+Name[uk]=Клавішу блокування деактивовано
+Name[vi]=Một phím khoá đã bị tắt
+Name[wa]=Ene tape po serer a stî dismetowe
+Name[zh_CN]=锁定键现已非激活
+Name[zh_TW]=鎖定鍵已取消作用
+Comment=A lock key (e.g. Caps Lock or Num Lock) has changed its state and is now inactive
+Comment[af]='n Sluit sleutel (bv. Caps Lock of Num Lock) se toestand het verander en is nou onaktief
+Comment[be]=Клавіша блакіроўкі (напр. Caps Lock ці Num Lock) змяніла свой стан і зрабілася неактыўнай
+Comment[bg]=Заключващ клавиш (Caps Lock или Num Lock) си промени състоянието и е неактивен сега
+Comment[bs]=Tipka za zaključavanje (npr. Caps Lock ili Num Lock) je promijenila stanje i sada je neaktivna
+Comment[ca]=Una tecla de bloqueig (p.ex. BloqMajús o BloqNum) ha canviat d'estat i ara està inactiva
+Comment[cs]=Klávesa zámku (např. Caps Lock nebo Num Lock) změnila svůj stav a je nyní aktivní
+Comment[csb]=Klawisza blokadë (np. Caps Lock czë Num Lock) zmieniła stón ë nie je terô aktiwnô
+Comment[da]=En låsetast (f.eks., Caps Lock eller Num Lock) har ændret sin tilstand og er nu inaktiv
+Comment[de]=Eine Feststelltaste (z. B. die Hochstelltaste oder Num-Lock) hat ihren Status geändert und ist nun inaktiv
+Comment[el]=Ένα πλήκτρο κλειδώματος (π.χ. Caps Lock ή Num Lock) άλλαξε κατάσταση και είναι τώρα ανενεργό
+Comment[eo]=baskula klavo (ekz. majuskla baskulo aŭ nombra baskulo) ŝanĝis staton, kaj jam ne estas aktiva
+Comment[es]=Una tecla de bloqueo (p. ej., Bloq Mayús o Bloq Num) ha cambiado su estado y ahora está inactiva
+Comment[et]=Lukustusklahv (nt. Caps Lock või Num Lock) muutis oma seisundit ning on nüüd mitteaktiivne
+Comment[eu]=Tekla blokeatzaile bat (hau da, blok. maius. edo blok. zenb.) egoeraz aldatu da eta orain ez da aktiboa
+Comment[fa]=یک کلید قفل )مثلاً، قفل تبدیل یا قفل اعداد( وضعیت خود را تغییر داده و اکنون غیرفعال می‌باشد
+Comment[fi]=Lukitusnäppäin (esim. CapsLock tai NumLock) on vaihtanut tilaansa ja ei ole enää aktiivinen
+Comment[fr]=L'état d'une touche de verrouillage (ex : Verr. Maj ou Verr. Num.) est modifié et elle est maintenant inactive
+Comment[fy]=De tastân fan in beskoatteltoets (sa as kaptaalskoattel of Nûm skoattel) is wizige en is no ynaktyf.
+Comment[gl]=Unha tecla de bloqueo (ex., Bloq Maius ou Bloq Num) mudou de estado e agora está inactiva
+Comment[he]=מקש ננעל (למשל Caps Lock או Num Lock) שינה את מצבו והוא כעת לא פעיל (כבוי)
+Comment[hr]=Tipka zaključavanja (npr. CapsLock ili NumLock) promijenila je svoje stanje i sad nije aktivna
+Comment[hu]=Egy zároló billentyű (pl. a Caps Lock vagy a Num Lock) állapota inaktívvá vált
+Comment[is]=Læsilykill (Caps Lock eða Num Lock) hefur breytt um stöðu og er nú óvirkur
+Comment[it]=Un tasto di blocco (es. Bloc Maiusc o Bloc Num) ha cambiato stato e adesso è inattivo
+Comment[ja]=ロックキー (Caps Lock や Num Lock など) の状態が変更され、非アクティブになりました
+Comment[kk]=Қосқыш перне (Caps Lock я Num Lock) күйін өзгертіп, енді белсенді емес
+Comment[km]=គ្រាប់​ចុច​ចាក់សោ (ឧ. ប្តូរ​ជាប់ ឬ Num Lock) បាន​ផ្លាស់ប្តូរ​សភាព​របស់​វា ហើយ ឥឡូវ​នេះ​វាអសកម្ម
+Comment[ko]=Caps Lock이나 Num Lock 키 같은 잠금 키의 상태가 바뀌었고 현재 비활성화됨
+Comment[lt]=Užrakto klavišo (pvz., Didž(Caps Lock) arba Sk(Num Lock)) būsena pakito ir jis dabar - neaktyvus
+Comment[mk]=Некое копче за заклучување (пр. Caps Lock или Num Lock) си ја смени состојбата и сега е неактивно
+Comment[nb]=En låsetast (f.eks. «Caps Lock» eller «Num lock») har endret status og er nå skrudd av.
+Comment[nds]=En Faststelltast (t.B. Tallenrast oder Grootschrieventast) hett den Tostand ännert un is nu inaktiv
+Comment[ne]=एउटा ताल्चा लगाउने कुञ्जीले (जस्तै: Caps Lock वा Num Lock) यसको स्थिति परिवर्तन गरेको छ र अहिले निस्क्रिय छ
+Comment[nl]=De status van een vergrendeltoets (zoals Caps Lock of Num Lock) is gewijzigd en is nu inactief
+Comment[nn]=Ein låsetast (t.d. «Caps Lock» eller «Num lock») har endra statusen og er no slått av
+Comment[pl]=Klawisz blokujący (np. Caps Lock lub Num Lock) zmienił stan i jest teraz wyłączony
+Comment[pt]=Uma tecla de bloqueio (p.ex., o Caps Lock ou o Num Lock) mudou o seu estado e ficou inactiva
+Comment[pt_BR]=Uma tecla de bloqueio (p.ex. Caps Lock ou Num Lock) mudou seu estado e agora está inativa
+Comment[ro]=O tastă de blocare (cur ar fi Caps Lock sau Num Lock) și-a schimbat starea și este acum inactivă
+Comment[ru]=Деактивирована клавиша переключения режимов (например, Caps Lock или Num Lock)
+Comment[sk]=Zamykací kláves (napr. Caps Lock alebo Num Lock) zmenil svoj stav a je teraz neaktívny
+Comment[sl]=Zaklenilna tipka (npr. Caps Lock ali Num Lock) je spremenila svoje stanje in je sedaj onemogočena
+Comment[sr]=Тастер за закључавање (нпр. Caps Lock или Num Lock) је променио стање и више није активан
+Comment[sr@Latn]=Taster za zaključavanje (npr. Caps Lock ili Num Lock) je promenio stanje i više nije aktivan
+Comment[sv]=En låstangent (t.ex. Caps Lock eller Num Lock) har ändrat tillstånd och är nu inaktiv
+Comment[tg]=Калиди қулф (мисоли, Caps Lock ё Num Lock) вазъияти худ иваз кард ва ҳозир ғайри фаъол аст
+Comment[th]=มีการเปลี่ยนสถานะปุ่มล็อค (เช่น Caps Lock หรือ Num Lock) และขณะนี้ปิดการใช้งาน
+Comment[uk]=Клавіша блокування (напр., Caps Lock або Num Lock) змінила свій стан і тепер неактивна
+Comment[vi]=Một phím khoá (như Caps Lock hay Num Lock) đã thay đổi trạng thái và đã bị tắt
+Comment[wa]=Ene tape po serer (metans CAPS LOCK ou NUM LOCK) a candjî d' esta et est asteure dismetowe
+Comment[zh_CN]=锁定键(如 Caps Lock 或 Num Lock)更改了其状态,现已非激活
+Comment[zh_TW]=鎖定按鍵(例, 大寫鎖定或數字鎖定)已改變其狀態且目前為非作用中
+default_sound=KDE_Click.wav
+default_presentation=0
+nopresentation=236
+
+[stickykeys]
+Name=Sticky keys has been enabled or disabled
+Name[af]=Sticky sleutels was geaktiveer of gedeaktiveer
+Name[be]=Ліпучыя клавішы былі ўключаны ці выключаны
+Name[bg]=Залепващите клавиши бяха включени или изключени
+Name[bs]=Ljepljive tipke su uključene ili isključene
+Name[ca]=S'han habilitat o deshabilitat les tecles apegaloses
+Name[cs]=Sticky klávesy byly povoleny nebo zakázány
+Name[csb]=Klawisze przëlepieniô òstałë włączoné abò wëłączoné
+Name[da]=Klæbrige taster er aktiveret eller deaktiveret
+Name[de]=Klebende Tasten wurden aktiviert oder deaktiviert
+Name[el]=Τα κολλημένα πλήκτρα ενεργοποιήθηκαν ή απενεργοποιήθηκαν
+Name[eo]=Fiksaj klavoj validiĝis aŭ malvalidiĝis
+Name[es]=Se han activado o desactivado las teclas pegajosas
+Name[et]=Kleepuvad klahvid on keelatud või lubatud
+Name[eu]=Tekla itsakorrak gaitu edo desgaitu dira
+Name[fa]=کلیدهای چسبناک، فعال یا غیرفعال شده‌اند
+Name[fi]=Tahmeat näppäimet on otettu käyttöön tai poistettu käytöstä
+Name[fr]=L'automaintien des touches a été activé ou désactivé
+Name[fy]=Plakkende toetsen binne aktivearre of deaktivearre
+Name[gl]=As teclas pegadias foron ou activadas ou desactivadas
+Name[he]=מקשים דביקים הופעלו או בוטלו
+Name[hr]=Ljepljive tipke su omogućene ili onemogućene
+Name[hu]=Ragadós billentyűk átkapcsolva
+Name[is]=Slökkt eða kveikt hefur verið á klístruðum lyklum
+Name[it]=La permanenza dei tasti è stata abilitata o disabilitata
+Name[ja]=スティッキーキーを有効または無効にしました
+Name[kk]=Жабысқақ пернелер рұксат етілген не етілмеген
+Name[km]=គ្រាប់ចុច​ស្អិត​ត្រូវ​បានអនុញ្ញាត ឬ មិន​អនុញ្ញាត
+Name[ko]=끈적이 키가 활성화되거나 비활성화됨
+Name[lt]=Lipnūs klavišai buvo įgalinti arba išjungti
+Name[mk]=„Лепливи копчиња“ е овозможено или оневозможено
+Name[nb]=Faste valgtaster er blitt skrudd av eller på
+Name[nds]=De Metood "Backige Tasten" wöör an- oder utschalt
+Name[ne]=टाँसिने कुञ्जीहरू सक्षम वा अक्षम पारिएको छ
+Name[nl]=Plakkende toetsen zijn geactiveerd of gedeactiveerd
+Name[nn]=Faste valtastar er blitt slått av eller på
+Name[pl]=Lepkie klawisze zostały włączone lub wyłączone
+Name[pt]=As teclas fixas ficaram activas ou inactivas
+Name[pt_BR]=Teclas de aderência foram habilitadas ou desabilitadas
+Name[ro]=Taste lipicioase (Sticky keys) au fost activate sau deactivate
+Name[ru]=Включены или отключены "залипающие" клавиши
+Name[sk]=Lepkavé klávesy zmenili svoj stav.
+Name[sl]=Lepljive tipke so spremenile stanje
+Name[sr]=Лепљиви тастери су укључени или искључени
+Name[sr@Latn]=Lepljivi tasteri su uključeni ili isključeni
+Name[sv]=Klistriga tangenter har aktiverats eller inaktiverats
+Name[tg]=Калидҳои часпак фаъол ё ғайрифаъол мебошад
+Name[th]=ปุ่มติดหนึบได้ถูกใช้งาน หรือ ถูกปิด
+Name[uk]=Липкі клавіші було увімкнено або вимкнено
+Name[vi]=Các phím dính đã được bật hoặc đã được tắt
+Name[wa]=Les aclapantès tapes ont stî metowes en alaedje ou dismetowes
+Name[zh_CN]=启用或禁用了粘滞键
+Name[zh_TW]=相黏鍵已啟用或停用
+Comment=Sticky keys has been enabled or disabled
+Comment[af]=Sticky sleutels was geaktiveer of gedeaktiveer
+Comment[be]=Ліпучыя клавішы былі ўключаны ці выключаны
+Comment[bg]=Залепващите клавиши бяха включени или изключени
+Comment[bs]=Ljepljive tipke su uključene ili isključene
+Comment[ca]=S'han habilitat o deshabilitat les tecles apegaloses
+Comment[cs]=Sticky klávesy byly povoleny nebo zakázány
+Comment[csb]=Klawisze przëlemieniô òstałë włączoné abò wëłączoné
+Comment[da]=Klæbrige taster er aktiveret eller deaktiveret
+Comment[de]=Die Funktion "Klebende Tasten" wurde aktiviert bzw. deaktiviert
+Comment[el]=Τα κολλημένα πλήκτρα ενεργοποιήθηκαν ή απενεργοποιήθηκαν
+Comment[eo]=Fiksaj klavoj estas aktivigitaj aŭ malaktivigitaj
+Comment[es]=Se han activado o desactivado las teclas pegajosas
+Comment[et]=Kleepuvad klahvid on keelatud või lubatud
+Comment[eu]=Tekla itsakorrak gaitu edo desgaitu dira
+Comment[fa]=کلیدهای چسبناک، فعال یا غیرفعال شده‌اند
+Comment[fi]=Tahmeat näppäimet on otettu käyttöön tai poistettu käytöstä
+Comment[fr]=L'automaintien des touches a été activé ou désactivé
+Comment[fy]=Plakkende toetsen binne aktivearre of deaktivearre
+Comment[gl]=As teclas pegadias foron ou activadas ou desactivadas
+Comment[he]=מקשים דביקים הופעלו או בוטלו
+Comment[hr]=Ljepljive tipke su omogućene ili onemogućene
+Comment[hu]=A ragadós billentyűk használatát ki- vagy bekapcsolták
+Comment[is]=Slökkt eða kveikt hefur verið á klístruðum lyklum
+Comment[it]=La permanenza dei tasti è stata abilitata o disabilitata
+Comment[ja]=スティッキーキーを有効または無効にしました
+Comment[kk]=Жабысқақ пернелер рұксат етілген не етілмеген
+Comment[km]=គ្រាប់ចុច​ស្អិត​ត្រូវ​បាន​អនុញ្ញាត ឬ មិន​អនុញ្ញាត
+Comment[ko]=끈적이 키가 활성화되거나 비활성화됨
+Comment[lt]=Lipnūs klavišai buvo įjungti arba išjungti
+Comment[mk]=„Лепливи копчиња“ е овозможено или оневозможено
+Comment[nb]=Faste valgtaster er blitt skrudd av eller på
+Comment[nds]=De Metood "Backige Tasten" wöör an- oder utschalt
+Comment[ne]=टाँसिने कुञ्जीहरू सक्षम वा अक्षम पारिएको छ
+Comment[nl]=Plakkende toetsen zijn geactiveerd of gedeactiveerd
+Comment[nn]=Faste valtaster er blitt slått av eller på
+Comment[pl]=Lepkie klawisze zostały włączone lub wyłączone
+Comment[pt]=As teclas fixas ficaram activas ou inactivas
+Comment[pt_BR]=Teclas de aderência foram habilitadas ou desabilitadas
+Comment[ro]=Taste lipicioase (Sticky keys) au fost activate sau deactivate
+Comment[ru]=Включены или отключены "залипающие" клавиши
+Comment[sk]=Lepkavé klávesy zmenili svoj stav.
+Comment[sl]=Lepljive tipke so spremenile stanje in so sedaj omogočene ali onemogočene
+Comment[sr]=Лепљиви тастери су укључени или искључени
+Comment[sr@Latn]=Lepljivi tasteri su uključeni ili isključeni
+Comment[sv]=Klistriga tangenter har aktiverats eller inaktiverats
+Comment[tg]=Калидҳои часпак фаъол ё ғайрифаъол мебошад
+Comment[th]=ปุ่มติดหนึบได้ถูกใช้งาน หรือ ถูกปิด
+Comment[uk]=Липкі клавіші було увімкнено або вимкнено
+Comment[vi]=Các phím dính đã được bật hoặc đã được tắt
+Comment[wa]=Les aclapantès tapes ont stî metowes en alaedje ou dismetowes
+Comment[zh_CN]=启用或禁用了粘滞键
+Comment[zh_TW]=相黏鍵已經被啟用或停用
+default_sound=KDE_Click.wav
+default_presentation=16
+nopresentation=236
+
+[slowkeys]
+Name=Slow keys has been enabled or disabled
+Name[af]=Stadige sleutels was geaktiveer of gedeaktiveer
+Name[be]=Марудныя клавішы былі ўключаны ці выключаны
+Name[bg]=Бавните клавиши бяха включени или изключени
+Name[bs]=Spore tipke su uključene ili isključene
+Name[ca]=S'han habilitat o deshabilitat les tecles lentes
+Name[cs]=Pomalé klávesy byly povoleny nebo zakázány
+Name[csb]=Pòwólné klawisze òstałë włączoné abò wëłączone
+Name[da]=Langsomme taster er aktiveret eller deaktiveret
+Name[de]=Langsame Tasten wurden aktiviert oder deaktiviert
+Name[el]=Τα αργά πλήκτρα ενεργοποιήθηκαν ή απενεργοποιήθηκαν
+Name[eo]=Malrapidklavoj validiĝis aŭ malvalidiĝis
+Name[es]=Se han activado o desactivado las teclas lentas
+Name[et]=Aeglased klahvid on keelatud või lubatud
+Name[eu]=Tekla motelak gaitu edo desgaitu dira
+Name[fa]=کلیدهای کند، فعال یا غیرفعال شده‌اند
+Name[fi]=Hitaat näppäimet on otettu käyttöön tai poistettu käytöstä
+Name[fr]=Les touches lentes ont été activées ou désactivées
+Name[fy]=Trage toetsen binne aktivearre of ûntaktivearre
+Name[gl]=As teclas lentas foron ou activadas ou desactivadas
+Name[he]=מקשים אטיים הופעלו או בוטלו
+Name[hr]=Spore tipke su omogućene ili onemogućene
+Name[hu]=A lassú billentyűk használata átkapcsolva
+Name[is]=Slökkt eða kveikt hefur verið á hægum lyklum
+Name[it]=Il rallentamento dei tasti è stato abilitato o disabilitato
+Name[ja]=スローキーを有効または無効にしました
+Name[kk]=Баяу пернелер рұксат етілген не етілмеген
+Name[km]=គ្រាប់ចុច​យឺត​ត្រូវ​បាន​អនុញ្ញាត ឬ មិន​អនុញ្ញាត
+Name[ko]=느린 키가 활성화되거나 비활성화됨
+Name[lt]=Lėti klavišai buvo įgalinti arba išjungti
+Name[mk]=„Спори копчиња“ е овозможено или оневозможено
+Name[nb]=Trege taster er blitt skrudd av eller på
+Name[nds]=De Metood "Langsam Tasten" wöör an- oder utschalt
+Name[ne]=ढिलो कुञ्जीहरू सक्षम वा अक्षम पारिएको छ
+Name[nl]=Langzame toetsten is geactiveerd of gedeactiveerd
+Name[nn]=Trege tastar er blitt slått av eller på
+Name[pl]=Powolne klawisze zostały włączone lub wyłączone
+Name[pt]=As teclas lentas ficaram activas ou inactivas
+Name[pt_BR]=Teclas lentas foram habilitadas ou desabilitadas
+Name[ro]=Taste lente (Slow keys) au fost activate sau deactivate
+Name[ru]=Включены или отключены замедленные клавиши
+Name[sk]=Pomalé klávesy zmenili svoj stav.
+Name[sl]=Počasne tipke so spremenile stanje
+Name[sr]=Спори тастери су укључени или искључени
+Name[sr@Latn]=Spori tasteri su uključeni ili isključeni
+Name[sv]=Långsamma tangenter har aktiverats eller inaktiverats
+Name[tg]=калиди сусткор фаъол ё ғайрифаъол мебошад
+Name[th]=ปุ่มชะลอได้ถูกใช้งาน หรือถูกปิด
+Name[uk]=Повільні клавіші було увімкнено або вимкнено
+Name[vi]=Các phím chậm đã được bật hoặc đã được tắt
+Name[wa]=Les londjinnès tapes ont stî metowes en alaedje ou dismetowes
+Name[zh_CN]=启用或禁用了筛选键
+Name[zh_TW]=延遲鍵已啟用或停用
+Comment=Slow keys has been enabled or disabled
+Comment[af]=Stadige sleutels was geaktiveer of gedeaktiveer
+Comment[be]=Марудныя клавішы былі ўключаны ці выключаны
+Comment[bg]=Бавните клавиши бяха включени или изключени
+Comment[bs]=Spore tipke su uključene ili isključene
+Comment[ca]=S'han habilitat o deshabilitat les tecles lentes
+Comment[cs]=Pomalé klávesy byly povoleny nebo zakázány
+Comment[csb]=Pòwólné klawisze òstałë włączoné abò wëłączone
+Comment[da]=Langsomme taster er aktiveret eller deaktiveret
+Comment[de]=Die Funktion "Langsame Tasten" wurde aktiviert bzw. deaktiviert
+Comment[el]=Τα αργά πλήκτρα ενεργοποιήθηκαν ή απενεργοποιήθηκαν
+Comment[eo]=Malrapidklavoj estas aktivigitaj aŭ malaktivigitaj
+Comment[es]=Se han activado o desactivado las teclas pegajosas
+Comment[et]=Aeglased klahvid on keelatud või lubatud
+Comment[eu]=Tekla motelak gaitu edo desgaitu dira
+Comment[fa]=کلیدهای چسبناک، فعال یا غیرفعال شده‌اند
+Comment[fi]=Hitaat näppäimet on otettu käyttöön tai poistettu käytöstä
+Comment[fr]=Les touches lentes ont été activées ou désactivées
+Comment[fy]=Trage toetsen binne aktivearre of ûntaktivearre
+Comment[gl]=As teclas lentas foron ou activadas ou desactivadas
+Comment[he]=מקשים אטיים הופעלו או בוטלו
+Comment[hr]=Spore tipke su omogućene ili onemogućene
+Comment[hu]=A lassú billentyűk használatát ki- vagy bekapcsolták
+Comment[is]=Slökkt eða kveikt hefur verið á hægum lyklum
+Comment[it]=Il rallentamento dei tasti è stato abilitato o disabilitato
+Comment[ja]=スローキーを有効または無効にしました
+Comment[kk]=Баяу пернелер рұксат етілген не етілмеген
+Comment[km]=គ្រាប់ចុច​យឺត​ត្រូវ​បាន​អនុញ្ញាត ឬ មិន​អនុញ្ញាត
+Comment[ko]=느린 키가 활성화되거나 비활성화됨
+Comment[lt]=Lėti klavišai buvo įgalinti arba išjungti
+Comment[mk]=„Спори копчиња“ е овозможено или оневозможено
+Comment[nb]=Trege taster er blitt skrudd av eller på
+Comment[nds]=De Metood "Langsam Tasten" wöör an- oder utschalt
+Comment[ne]=ढिलो कुञ्जीहरू सक्षम वा अक्षम पारिएको छ
+Comment[nl]=Langzame toetsten is geactiveerd of gedeactiveerd
+Comment[nn]=Trege tastar er blitt slått av eller på
+Comment[pl]=Powolne klawisze zostały włączone lub wyłączone
+Comment[pt]=As teclas lentas ficaram activas ou inactivas
+Comment[pt_BR]=Teclas lentas foram habilitadas ou desabilitadas
+Comment[ro]=Taste lente (Slow keys) au fost activate sau deactivate
+Comment[ru]=Включены или отключены замедленные клавиши
+Comment[sk]=Pomalé klávesy zmenili svoj stav.
+Comment[sl]=Počasne tipke so spremenile stanje in so sedaj omogočene ali onemogočene
+Comment[sr]=Спори тастери су укључени или искључени
+Comment[sr@Latn]=Spori tasteri su uključeni ili isključeni
+Comment[sv]=Långsamma tangenter har aktiverats eller inaktiverats
+Comment[tg]=Калиди сусткор фаъол ё ғайрифаъол мебошад
+Comment[th]=ปุ่มชะลอได้ถูกใช้งาน หรือ ถูกปิด
+Comment[uk]=Повільні клавіші було увімкнено або вимкнено
+Comment[vi]=Các phím chậm đã được bật hoặc đã được tắt
+Comment[wa]=Les londjinnès tapes ont stî metowes en alaedje ou dismetowes
+Comment[zh_CN]=启用或禁用了筛选键
+Comment[zh_TW]=延遲鍵已經被啟用或停用
+default_sound=KDE_Click.wav
+default_presentation=16
+nopresentation=236
+
+[bouncekeys]
+Name=Bounce keys has been enabled or disabled
+Name[be]="Рухомыя"клавішы ўключаны ці выключаны
+Name[bg]=Подскачащите клавиши бяха включени или изключени
+Name[bs]=Odbijanje tipki je uključeno ili isključeno
+Name[ca]=S'han habilitat o deshabilitat les tecles de repetició
+Name[cs]=Vícenásobné opakování kláves bylo povoleno nebo zakázáno
+Name[csb]=Òdbijające klawisze òstałë włączoné abò wëłączoné
+Name[da]=Elastiske taster er aktiveret eller deaktiveret
+Name[de]=Zurückschnellende Tasten wurden aktiviert oder deaktiviert
+Name[el]=Τα πλήκτρα αναπήδησης ενεργοποιήθηκαν ή απενεργοποιήθηκαν
+Name[eo]=Prokrastaj klavoj validiĝis aŭ malvalidiĝis
+Name[es]=Se han activado o desactivado las teclas de rebote
+Name[et]=Põrkavad klahvid on keelatud või lubatud
+Name[eu]=Errebotatze-teklak gaitu edo desgaitu dira
+Name[fa]=کلیدهای واگشت، فعال یا غیرفعال شده‌اند
+Name[fi]=Kimpoavat näppäimet on otettu käyttöön tai poistettu käytöstä
+Name[fr]=Les touches non répétées ont été activées ou désactivées
+Name[fy]=Stuiterjende toetsen binne aktivearre of ûntaktivearre
+Name[gl]=As teclas de rebote foron ou activadas ou desactivadas
+Name[he]=מקשים קפיציים הופעלו או בוטלו
+Name[hr]=Obijanje tipki je omogućeno ili onemogućeno
+Name[hu]=A visszaugró billentyűk átkapcsolva
+Name[is]=Slökkt eða kveikt hefur verið á skoppandi lyklum
+Name[it]=La pressione ravvicinata dei tasti è stata abilitata o disabilitata
+Name[ja]=バウンスキーを有効または無効にしました
+Name[kk]=Қалшылға қарсы пернелер рұксат етілген не етілмеген
+Name[km]=គ្រាប់ចុច​លោត​ត្រូវ​បាន​អនុញ្ញាត ឬ មិន​អនុញ្ញាត
+Name[ko]=튕김 키가 활성화되거나 비활성화됨
+Name[lt]=Tamprūs klavišai buvo įgalinti arba išjungti
+Name[mk]=„Скокачки копчиња“ е овозможено или оневозможено
+Name[nb]=Filtertaster er blitt skrudd av eller på
+Name[nds]=De Metood "Springen Tasten" wöör an- oder utschalt
+Name[ne]=कुञ्जीहरू सक्षम वा अक्षम पारिएको छ
+Name[nl]=Stuiterende toetsen is geactiveerd of gedeactiveerd
+Name[nn]=Filtertastar er blitt slått av eller på
+Name[pl]=Odbijające klawisze zostały włączone lub wyłączone
+Name[pt]=As teclas sonoras ficaram activas ou inactivas
+Name[pt_BR]=Teclas lentas foram habilitadas ou desabilitadas
+Name[ro]=Taste săltărețe (Bounce keys) au fost activate sau deactivate
+Name[ru]=Включены или отключены "прыгающие" клавиши
+Name[sk]=Bounce klávesy zmenili svoj stav.
+Name[sl]=Odskočne tipke so spremenile stanje
+Name[sr]=Одскачући тастери су укључени или искључени
+Name[sr@Latn]=Odskačući tasteri su uključeni ili isključeni
+Name[sv]=Studsande tangenter har aktiverats eller inaktiverats
+Name[tg]=Калидҳои бонус фаъол ё ғайрифаъол мебошанд
+Name[th]=ปุ่มสะท้อน ได้ถูกใช้งาน หรือถูกปิด
+Name[uk]=Пружні клавіші було увімкнено або вимкнено
+Name[vi]=Các phím nảy đã được bật hoặc đã được tắt
+Name[wa]=Les tapes di ridjiblaedje ont stî metowes en alaedje ou dismetowes
+Name[zh_CN]=启用或禁用了撞击键
+Name[zh_TW]=彈跳鍵已啟用或停用
+Comment=Bounce keys has been enabled or disabled
+Comment[af]=Hop sleutels was geaktiveer of gedeaktiveer
+Comment[be]="Рухомыя"клавішы ўключаны ці выключаны
+Comment[bg]=Подскачащите клавиши бяха включени или изключени
+Comment[bs]=Odbijanje tipki je uključeno ili isključeno
+Comment[ca]=S'han habilitat o deshabilitat les tecles de repetició
+Comment[cs]=Vícenásobné opakování kláves bylo povoleno nebo zakázáno
+Comment[csb]=Òdbijające klawisze òstałë wëłączoné abò włączoné
+Comment[da]=Elastiske taster er aktiveret eller deaktiveret
+Comment[de]=Zurückschnellende Tasten wurden aktiviert oder deaktiviert
+Comment[el]=Τα πλήκτρα αναπήδησης ενεργοποιήθηκαν ή απενεργοποιήθηκαν
+Comment[eo]=Prokrastaj klavoj estas aktivigitaj aŭ malaktivigitaj
+Comment[es]=Se han activado o desactivado las teclas de rebote
+Comment[et]=Põrkavad klahvid on keelatud või lubatud
+Comment[eu]=Errebotatze-teklak gaitu edo desgaitu dira
+Comment[fa]=کلیدهای واگشت، فعال یا غیرفعال شده‌اند
+Comment[fi]=Kimpoavat näppäimet on otettu käyttöön tai poistettu käytöstä
+Comment[fr]=Les touches non répétées ont été activées ou désactivées
+Comment[fy]=Stuiterjende toetsen binne aktivearre of ûntaktivearre
+Comment[gl]=As teclas de rebote foron ou activadas ou desactivadas
+Comment[he]=מקשים קפיציים הופעלו או בוטלו
+Comment[hr]=Obijanje tipki je omogućeno ili onemogućeno
+Comment[hu]=A visszaugró billentyűk használatát ki- vagy bekapcsolták
+Comment[is]=Slökkt eða kveikt hefur verið á skoppandi lyklum
+Comment[it]=La pressione ravvicinata dei tasti è stata abilitata o disabilitata
+Comment[ja]=バウンスキーを有効または無効にしました
+Comment[kk]=Қалшылға қарсы пернелер рұксат етілген не етілмеген
+Comment[km]=គ្រាប់ចុច​លោត​ត្រូវ​បាន​អនុញ្ញាត ឬ មិន​អនុញ្ញាត
+Comment[ko]=튕김 키가 활성화되거나 비활성화됨
+Comment[lt]=Tamprūs klavišai buvo įgalinti arba išjungti
+Comment[mk]=„Скокачки копчиња“ е овозможено или оневозможено
+Comment[nb]=Filtertaster er blitt skrudd av eller på
+Comment[nds]=De Metood "Springen Tasten" wöör an- oder utschalt
+Comment[ne]=उफ्रिने कुञ्जीहरू सक्षम वा अक्षम पारिएको छ
+Comment[nl]=Stuiterende toetsen is geactiveerd of gedeactiveerd
+Comment[nn]=Filtertastar er blitt slått av eller på
+Comment[pl]=Powolne klawisze zostały włączone lub wyłączone
+Comment[pt]=As teclas sonoras ficaram activas ou inactivas
+Comment[pt_BR]=Teclas lentas foram habilitadas ou desabilitadas
+Comment[ro]=Taste săltărețe (Bounce keys) au fost activate sau deactivate
+Comment[ru]=Включены или отключены "прыгающие" клавиши
+Comment[sk]=Bounce klávesy zmenili svoj stav.
+Comment[sl]=Odskočne tipke so spremenile stanje in so sedaj omogočene ali onemogočene
+Comment[sr]=Одскачући тастери су укључени или искључени
+Comment[sr@Latn]=Odskačući tasteri su uključeni ili isključeni
+Comment[sv]=Studsande tangenter har aktiverats eller inaktiverats
+Comment[tg]=Калидҳои бонус фаъол ё ғайрифаъоланд
+Comment[th]=ปุ่มสะท้อนได้ถูกใช้งาน หรือ ถูกปิด
+Comment[uk]=Пружні клавіші було увімкнено або вимкнено
+Comment[vi]=Các phím nảy đã được bật hoặc đã được tắt
+Comment[wa]=Les tapes di ridjiblaedje ont stî metowes en alaedje ou dismetowes
+Comment[zh_CN]=启用或禁用了撞击键
+Comment[zh_TW]=彈跳鍵已經被啟用或停用
+default_sound=KDE_Click.wav
+default_presentation=16
+nopresentation=236
+
+[mousekeys]
+Name=Mouse keys has been enabled or disabled
+Name[af]=Muis sleutels was geaktiveer of gedeaktiveer
+Name[be]=Кнопкі мышы былі ўключаны ці выключаны
+Name[bg]=Клавишите за мишката бяха включени или изключени
+Name[bs]=Tipke miša su uključene ili isključene
+Name[ca]=S'han habilitat o deshabilitat les tecles de ratolí
+Name[cs]=Klávesy myši byly povoleny nebo zakázány
+Name[csb]=Klawisze mëszë òstałë włączoné abò wëłączoné
+Name[da]=Musetaster er aktiveret eller deaktiveret
+Name[de]=Maustasten wurden aktiviert oder deaktiviert
+Name[el]=Τα πλήκτρα ποντικιού ενεργοποιήθηκαν ή απενεργοποιήθηκαν
+Name[eo]=Musklavoj validiĝis aŭ malvalidiĝis
+Name[es]=Se han activado o desactivado las teclas de ratón
+Name[et]=Hiire klahvid on keelatud või lubatud
+Name[eu]=Saguaren teklak gaitu edo desgaitu egin dira
+Name[fa]=کلیدهای موشی، فعال یا غیرفعال شده‌اند
+Name[fi]=Hiiren näppäimet on otettu käyttöön tai poistettu käytöstä
+Name[fr]=Les touches gérant la souris ont été activées ou désactivées
+Name[fy]=Mûstoetsen binne aktivearre of ûntaktivearre
+Name[gl]=As teclas de rato foron ou activadas ou desactivadas
+Name[he]=מקשי העכבר בוטלו או הופעלו
+Name[hr]=Mišolike tipke su omogućene ili onemogućene
+Name[hu]=Az egérmozgató billentyűk átkapcsolva
+Name[is]=Slökkt eða kveikt hefur verið á músarlyklum
+Name[it]=Il mouse da tastiera è stato abilitato o disabilitato
+Name[ja]=マウスキーを有効または無効にしました
+Name[kk]=Тышқанды жылжытатын пернелер рұксат етілген не етілмеген
+Name[km]=គ្រាប់​ចុច​កណ្តុរ​ត្រូវ​បាន​អនុញ្ញាត ឬ មិន​អនុញ្ញាត
+Name[ko]=마우스 키가 활성화되거나 비활성화됨
+Name[lt]=Pelės klavišai buvo įgalinti arba išjungti
+Name[mk]=„Копчиња на глушецот“ е овозможено или оневозможено
+Name[nb]=Musetaster er blitt skrudd av eller på
+Name[nds]=De Metood "Muustasten" wöör an- oder utschalt
+Name[ne]=माउस कुञ्जीहरू सक्षम वा अक्षम पारिएको छ
+Name[nl]=Muistoetsen is geactiveerd of gedeactiveerd
+Name[nn]=Musetastar er blitt slått av eller på
+Name[pa]=ਮਾਊਸ ਸਵਿੱਚਾਂ ਨੂੰ ਯੋਗ ਜਾਂ ਅਯੋਗ ਕੀਤਾ ਗਿਆ ਹੈ
+Name[pl]=Klawisze myszy zostały włączone lub wyłączone
+Name[pt]=O rato por teclado ficou activo ou inactivo
+Name[pt_BR]=Teclas do mouse foram habilitadas ou desabilitadas
+Name[ro]=Taste de maus au fost activate sau deactivate
+Name[ru]=Нажаты или отжаты клавиши мыши
+Name[sk]=Mouse klávesy zmenili svoj stav.
+Name[sl]=Miškine tipke so spremenile stanje
+Name[sr]=Тастери за миш су укључени или искључени
+Name[sr@Latn]=Tasteri za miš su uključeni ili isključeni
+Name[sv]=Mustangenter har aktiverats eller inaktiverats
+Name[tg]=Тугмачаҳои мушуак фаъол ё ғайрифаъол мебошанд
+Name[th]=ปุ่มแทนเมาส์ได้ถูกใช้งาน หรือ ถูกปิด
+Name[uk]=Клавіші мишки було увімкнено або вимкнено
+Name[vi]=Các phím chuột đã được bật hoặc đã được tắt
+Name[wa]=Les tapes di sori ont stî metowes en alaedje ou dismetowes
+Name[zh_CN]=启用或禁用了鼠标键
+Name[zh_TW]=滑鼠按鍵已啟用或停用
+Comment=Mouse keys has been enabled or disabled
+Comment[af]=Muis sleutels was geaktiveer of gedeaktiveer
+Comment[be]=Кнопкі мышы былі ўключаны ці выключаны
+Comment[bg]=Клавишите за мишката бяха включени или изключени
+Comment[bs]=Tipke miša su uključene ili isključene
+Comment[ca]=S'han habilitat o deshabilitat les tecles de ratolí
+Comment[cs]=Klávesy myši byly povoleny nebo zakázány
+Comment[csb]=Klawisze mëszë òstałë włączoné abò wëłączoné
+Comment[da]=Musetaster er aktiveret eller deaktiveret
+Comment[de]=Die Funktion "Maustasten" wurde aktiviert oder deaktiviert
+Comment[el]=Τα πλήκτρα ποντικιού ενεργοποιήθηκαν ή απενεργοποιήθηκαν
+Comment[eo]=Musklavoj validiĝis aŭ malvalidiĝis
+Comment[es]==Se han activado o desactivado las teclas de ratón
+Comment[et]=Hiire klahvid on keelatud või lubatud
+Comment[eu]=Saguaren teklak gaitu edo desgaitu egin dira
+Comment[fa]=کلیدهای موشی، فعال یا غیرفعال شده‌اند
+Comment[fi]=Hiiren näppäimet on otettu käyttöön tai poistettu käytöstä
+Comment[fr]=Les touches gérant la souris ont été activées ou désactivées
+Comment[fy]=Mûstoetsen binne aktivearre of ûntaktivearre
+Comment[gl]=As teclas de rato foron ou activadas ou desactivadas
+Comment[he]=מקשי העכבר בוטלו או הופעלו
+Comment[hr]=Mišolike tipke su omogućene ili onemogućene
+Comment[hu]=Az egérmozgató billentyűk használatát ki- vagy bekapcsolták
+Comment[is]=Slökkt eða kveikt hefur verið á músarlyklum
+Comment[it]=Il mouse da tastiera è stato abilitato o disabilitato
+Comment[ja]=マウスキーを有効または無効にしました
+Comment[kk]=Тышқанды жылжытатын пернелер рұксат етілген не етілмеген
+Comment[km]=គ្រាប់ចុច​កណ្តុរ​ត្រូវ​បាន​អនុញ្ញាត ឬ មិន​អនុញ្ញាត
+Comment[ko]=마우스 키가 활성화되거나 비활성화됨
+Comment[lt]=Pelės mygtukai buvo įgalinti arba išjungti
+Comment[mk]=„Копчиња на глушецот“ е овозможено или оневозможено
+Comment[nb]=Musetaster er blitt skrudd av eller på
+Comment[nds]=De Metood "Muustasten" wöör an- oder utschalt
+Comment[ne]=माउस कुञ्जीहरू सक्षम वा अक्षम पारिएको छ
+Comment[nl]=Muistoetsen is geactiveerd of gedeactiveerd
+Comment[nn]=Musetastar er blitt slått av eller på
+Comment[pl]=Klawisze myszy zostały włączone lub wyłączone
+Comment[pt]=O rato por teclado ficou activo ou inactivo
+Comment[pt_BR]=Teclas do mouse foram habilitadas ou desabilitadas
+Comment[ro]=Taste de maus au fost activate sau deactivate
+Comment[ru]=Нажаты или отжаты клавиши мыши
+Comment[sk]=Mouse klávesy zmenili svoj stav.
+Comment[sl]=Miškine tipke so spremenile stanje in so sedaj omogočene ali onemogočene
+Comment[sr]=Тастери за миш су укључени или искључени
+Comment[sr@Latn]=Tasteri za miš su uključeni ili isključeni
+Comment[sv]=Mustangenter har aktiverats eller inaktiverats
+Comment[tg]=Тугмачаҳои мушуак фаъол ё ғайрифаъол мебошанд
+Comment[th]=ปุ่มแทนเมาส์ได้ถูกใช้งาน หรือ ถูกปิด
+Comment[uk]=Клавіші мишки було увімкнено або вимкнено
+Comment[vi]=Các phím chuột đã được bật hoặc đã được tắt
+Comment[wa]=Les tapes di sori ont stî metowes en alaedje ou dismetowes
+Comment[zh_CN]=启用或禁用了鼠标键
+Comment[zh_TW]=滑鼠按鍵已經被啟用或停用
+default_sound=KDE_Click.wav
+default_presentation=16
+nopresentation=236
diff --git a/kcontrol/access/kaccess.cpp b/kcontrol/access/kaccess.cpp
new file mode 100644
index 000000000..5956697b9
--- /dev/null
+++ b/kcontrol/access/kaccess.cpp
@@ -0,0 +1,896 @@
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <qtimer.h>
+#include <qpainter.h>
+#include <qvbox.h>
+#include <qlayout.h>
+#include <qlabel.h>
+
+#include <kdialogbase.h>
+#include <kmessagebox.h>
+#include <kcombobox.h>
+#include <kiconloader.h>
+#include <kdebug.h>
+#include <kaudioplayer.h>
+#include <knotifyclient.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <netwm.h>
+#include <kshortcut.h>
+#include <kkeynative.h>
+#include <kwin.h>
+
+#include <X11/XKBlib.h>
+#define XK_MISCELLANY
+#define XK_XKB_KEYS
+#include <X11/keysymdef.h>
+
+
+#include "kaccess.moc"
+
+struct ModifierKey {
+ const unsigned int mask;
+ const KeySym keysym;
+ const char *name;
+ const char *lockedText;
+ const char *latchedText;
+ const char *unlatchedText;
+};
+
+static ModifierKey modifierKeys[] = {
+ { ShiftMask, 0, "Shift",
+ I18N_NOOP("The Shift key has been locked and is now active for all of the following keypresses."),
+ I18N_NOOP("The Shift key is now active."),
+ I18N_NOOP("The Shift key is now inactive.") },
+ { ControlMask, 0, "Control",
+ I18N_NOOP("The Ctrl key has been locked and is now active for all of the following keypresses."),
+ I18N_NOOP("The Ctrl key is now active."),
+ I18N_NOOP("The Ctrl key is now inactive.") },
+ { 0, XK_Alt_L, "Alt",
+ I18N_NOOP("The Alt key has been locked and is now active for all of the following keypresses."),
+ I18N_NOOP("The Alt key is now active."),
+ I18N_NOOP("The Alt key is now inactive.") },
+ { 0, 0, "Win",
+ I18N_NOOP("The Win key has been locked and is now active for all of the following keypresses."),
+ I18N_NOOP("The Win key is now active."),
+ I18N_NOOP("The Win key is now inactive.") },
+ { 0, XK_Meta_L, "Meta",
+ I18N_NOOP("The Meta key has been locked and is now active for all of the following keypresses."),
+ I18N_NOOP("The Meta key is now active."),
+ I18N_NOOP("The Meta key is now inactive.") },
+ { 0, XK_Super_L, "Super",
+ I18N_NOOP("The Super key has been locked and is now active for all of the following keypresses."),
+ I18N_NOOP("The Super key is now active."),
+ I18N_NOOP("The Super key is now inactive.") },
+ { 0, XK_Hyper_L, "Hyper",
+ I18N_NOOP("The Hyper key has been locked and is now active for all of the following keypresses."),
+ I18N_NOOP("The Hyper key is now active."),
+ I18N_NOOP("The Hyper key is now inactive.") },
+ { 0, 0, "Alt Graph",
+ I18N_NOOP("The Alt Gr key has been locked and is now active for all of the following keypresses."),
+ I18N_NOOP("The Alt Gr key is now active."),
+ I18N_NOOP("The Alt Gr key is now inactive.") },
+ { 0, XK_Num_Lock, "Num Lock",
+ I18N_NOOP("The Num Lock key has been activated."),
+ "",
+ I18N_NOOP("The Num Lock key is now inactive.") },
+ { LockMask, 0, "Caps Lock",
+ I18N_NOOP("The Caps Lock key has been activated."),
+ "",
+ I18N_NOOP("The Caps Lock key is now inactive.") },
+ { 0, XK_Scroll_Lock, "Scroll Lock",
+ I18N_NOOP("The Scroll Lock key has been activated."),
+ "",
+ I18N_NOOP("The Scroll Lock key is now inactive.") },
+ { 0, 0, "", "", "", "" }
+};
+
+
+/********************************************************************/
+
+
+KAccessApp::KAccessApp(bool allowStyles, bool GUIenabled)
+ : KUniqueApplication(allowStyles, GUIenabled), _artsBellBlocked(false),
+ overlay(0), wm(0, KWinModule::INFO_DESKTOP)
+{
+ _activeWindow = wm.activeWindow();
+ connect(&wm, SIGNAL(activeWindowChanged(WId)), this, SLOT(activeWindowChanged(WId)));
+
+ artsBellTimer = new QTimer( this );
+ connect( artsBellTimer, SIGNAL( timeout() ), SLOT( slotArtsBellTimeout() ));
+
+ features = 0;
+ requestedFeatures = 0;
+ dialog = 0;
+
+ initMasks();
+ XkbStateRec state_return;
+ XkbGetState (qt_xdisplay(), XkbUseCoreKbd, &state_return);
+ unsigned char latched = XkbStateMods (&state_return);
+ unsigned char locked = XkbModLocks (&state_return);
+ state = ((int)locked)<<8 | latched;
+}
+
+int KAccessApp::newInstance()
+{
+ KGlobal::config()->reparseConfiguration();
+ readSettings();
+ return 0;
+}
+
+void KAccessApp::readSettings()
+{
+ KConfig *config = KGlobal::config();
+
+ // bell ---------------------------------------------------------------
+
+ config->setGroup("Bell");
+ _systemBell = config->readBoolEntry("SystemBell", true);
+ _artsBell = config->readBoolEntry("ArtsBell", false);
+ _artsBellFile = config->readPathEntry("ArtsBellFile");
+ _visibleBell = config->readBoolEntry("VisibleBell", false);
+ _visibleBellInvert = config->readBoolEntry("VisibleBellInvert", false);
+ QColor def(Qt::red);
+ _visibleBellColor = config->readColorEntry("VisibleBellColor", &def);
+ _visibleBellPause = config->readNumEntry("VisibleBellPause", 500);
+
+ // select bell events if we need them
+ int state = (_artsBell || _visibleBell) ? XkbBellNotifyMask : 0;
+ XkbSelectEvents(qt_xdisplay(), XkbUseCoreKbd, XkbBellNotifyMask, state);
+
+ // deactivate system bell if not needed
+ if (!_systemBell)
+ XkbChangeEnabledControls(qt_xdisplay(), XkbUseCoreKbd, XkbAudibleBellMask, 0);
+ else
+ XkbChangeEnabledControls(qt_xdisplay(), XkbUseCoreKbd, XkbAudibleBellMask, XkbAudibleBellMask);
+
+ // keyboard -------------------------------------------------------------
+
+ config->setGroup("Keyboard");
+
+ // get keyboard state
+ XkbDescPtr xkb = XkbGetMap(qt_xdisplay(), 0, XkbUseCoreKbd);
+ if (!xkb)
+ return;
+ if (XkbGetControls(qt_xdisplay(), XkbAllControlsMask, xkb) != Success)
+ return;
+
+ // sticky keys
+ if (config->readBoolEntry("StickyKeys", false))
+ {
+ if (config->readBoolEntry("StickyKeysLatch", true))
+ xkb->ctrls->ax_options |= XkbAX_LatchToLockMask;
+ else
+ xkb->ctrls->ax_options &= ~XkbAX_LatchToLockMask;
+ if (config->readBoolEntry("StickyKeysAutoOff", false))
+ xkb->ctrls->ax_options |= XkbAX_TwoKeysMask;
+ else
+ xkb->ctrls->ax_options &= ~XkbAX_TwoKeysMask;
+ if (config->readBoolEntry("StickyKeysBeep", false))
+ xkb->ctrls->ax_options |= XkbAX_StickyKeysFBMask;
+ else
+ xkb->ctrls->ax_options &= ~XkbAX_StickyKeysFBMask;
+ xkb->ctrls->enabled_ctrls |= XkbStickyKeysMask;
+ }
+ else
+ xkb->ctrls->enabled_ctrls &= ~XkbStickyKeysMask;
+
+ // toggle keys
+ if (config->readBoolEntry("ToggleKeysBeep", false))
+ xkb->ctrls->ax_options |= XkbAX_IndicatorFBMask;
+ else
+ xkb->ctrls->ax_options &= ~XkbAX_IndicatorFBMask;
+
+ // slow keys
+ if (config->readBoolEntry("SlowKeys", false)) {
+ if (config->readBoolEntry("SlowKeysPressBeep", false))
+ xkb->ctrls->ax_options |= XkbAX_SKPressFBMask;
+ else
+ xkb->ctrls->ax_options &= ~XkbAX_SKPressFBMask;
+ if (config->readBoolEntry("SlowKeysAcceptBeep", false))
+ xkb->ctrls->ax_options |= XkbAX_SKAcceptFBMask;
+ else
+ xkb->ctrls->ax_options &= ~XkbAX_SKAcceptFBMask;
+ if (config->readBoolEntry("SlowKeysRejectBeep", false))
+ xkb->ctrls->ax_options |= XkbAX_SKRejectFBMask;
+ else
+ xkb->ctrls->ax_options &= ~XkbAX_SKRejectFBMask;
+ xkb->ctrls->enabled_ctrls |= XkbSlowKeysMask;
+ }
+ else
+ xkb->ctrls->enabled_ctrls &= ~XkbSlowKeysMask;
+ xkb->ctrls->slow_keys_delay = config->readNumEntry("SlowKeysDelay", 500);
+
+ // bounce keys
+ if (config->readBoolEntry("BounceKeys", false)) {
+ if (config->readBoolEntry("BounceKeysRejectBeep", false))
+ xkb->ctrls->ax_options |= XkbAX_BKRejectFBMask;
+ else
+ xkb->ctrls->ax_options &= ~XkbAX_BKRejectFBMask;
+ xkb->ctrls->enabled_ctrls |= XkbBounceKeysMask;
+ }
+ else
+ xkb->ctrls->enabled_ctrls &= ~XkbBounceKeysMask;
+ xkb->ctrls->debounce_delay = config->readNumEntry("BounceKeysDelay", 500);
+
+ // gestures for enabling the other features
+ _gestures = config->readBoolEntry("Gestures", true);
+ if (_gestures)
+ xkb->ctrls->enabled_ctrls |= XkbAccessXKeysMask;
+ else
+ xkb->ctrls->enabled_ctrls &= ~XkbAccessXKeysMask;
+
+ // timeout
+ if (config->readBoolEntry("AccessXTimeout", false))
+ {
+ xkb->ctrls->ax_timeout = config->readNumEntry("AccessXTimeoutDelay", 30)*60;
+ xkb->ctrls->axt_opts_mask = 0;
+ xkb->ctrls->axt_opts_values = 0;
+ xkb->ctrls->axt_ctrls_mask = XkbStickyKeysMask | XkbSlowKeysMask;
+ xkb->ctrls->axt_ctrls_values = 0;
+ xkb->ctrls->enabled_ctrls |= XkbAccessXTimeoutMask;
+ }
+ else
+ xkb->ctrls->enabled_ctrls &= ~XkbAccessXTimeoutMask;
+
+ // gestures for enabling the other features
+ if (_gestures && config->readBoolEntry("AccessXBeep", true))
+ xkb->ctrls->ax_options |= XkbAX_FeatureFBMask | XkbAX_SlowWarnFBMask;
+ else
+ xkb->ctrls->ax_options &= ~(XkbAX_FeatureFBMask | XkbAX_SlowWarnFBMask);
+
+ _gestureConfirmation = config->readBoolEntry("GestureConfirmation", true);
+
+ _kNotifyModifiers = config->readBoolEntry("kNotifyModifiers", false);
+ _kNotifyAccessX = config->readBoolEntry("kNotifyAccessX", false);
+
+ // mouse-by-keyboard ----------------------------------------------
+
+ config->setGroup("Mouse");
+
+ if (config->readBoolEntry("MouseKeys", false))
+ {
+ xkb->ctrls->mk_delay = config->readNumEntry("MKDelay", 160);
+
+ // Default for initial velocity: 200 pixels/sec
+ int interval = config->readNumEntry("MKInterval", 5);
+ xkb->ctrls->mk_interval = interval;
+
+ // Default time to reach maximum speed: 5000 msec
+ xkb->ctrls->mk_time_to_max = config->readNumEntry("MKTimeToMax",
+ (5000+interval/2)/interval);
+
+ // Default maximum speed: 1000 pixels/sec
+ // (The old default maximum speed from KDE <= 3.4
+ // (100000 pixels/sec) was way too fast)
+ xkb->ctrls->mk_max_speed = config->readNumEntry("MKMaxSpeed", interval);
+
+ xkb->ctrls->mk_curve = config->readNumEntry("MKCurve", 0);
+ xkb->ctrls->mk_dflt_btn = config->readNumEntry("MKDefaultButton", 0);
+
+ xkb->ctrls->enabled_ctrls |= XkbMouseKeysMask;
+ }
+ else
+ xkb->ctrls->enabled_ctrls &= ~XkbMouseKeysMask;
+
+ features = xkb->ctrls->enabled_ctrls & (XkbSlowKeysMask | XkbBounceKeysMask | XkbStickyKeysMask | XkbMouseKeysMask);
+ if (dialog == 0)
+ requestedFeatures = features;
+ // set state
+ XkbSetControls(qt_xdisplay(), XkbControlsEnabledMask | XkbMouseKeysAccelMask | XkbStickyKeysMask | XkbSlowKeysMask | XkbBounceKeysMask | XkbAccessXKeysMask | XkbAccessXTimeoutMask, xkb);
+
+ // select AccessX events
+ XkbSelectEvents(qt_xdisplay(), XkbUseCoreKbd, XkbAllEventsMask, XkbAllEventsMask);
+
+ if (!_artsBell && !_visibleBell && !_gestureConfirmation
+ && !_kNotifyModifiers && !_kNotifyAccessX) {
+
+ // We will exit, but the features need to stay configured
+ uint ctrls = XkbStickyKeysMask | XkbSlowKeysMask | XkbBounceKeysMask | XkbMouseKeysMask | XkbAudibleBellMask | XkbControlsNotifyMask;
+ uint values = xkb->ctrls->enabled_ctrls & ctrls;
+ XkbSetAutoResetControls(qt_xdisplay(), ctrls, &ctrls, &values);
+ exit(0);
+ } else {
+ // reset them after program exit
+ uint ctrls = XkbStickyKeysMask | XkbSlowKeysMask | XkbBounceKeysMask | XkbMouseKeysMask | XkbAudibleBellMask | XkbControlsNotifyMask;
+ uint values = XkbAudibleBellMask;
+ XkbSetAutoResetControls(qt_xdisplay(), ctrls, &ctrls, &values);
+ }
+
+ delete overlay;
+ overlay = 0;
+}
+
+static int maskToBit (int mask) {
+ for (int i = 0; i < 8; i++)
+ if (mask & (1 << i))
+ return i;
+ return -1;
+}
+
+void KAccessApp::initMasks() {
+ for (int i = 0; i < 8; i++)
+ keys [i] = -1;
+ state = 0;
+
+ for (int i = 0; strcmp (modifierKeys[i].name, "") != 0; i++) {
+ int mask = modifierKeys[i].mask;
+ if (mask == 0)
+ if (modifierKeys[i].keysym != 0)
+ mask = XkbKeysymToModifiers (qt_xdisplay(), modifierKeys[i].keysym);
+ else if (!strcmp(modifierKeys[i].name, "Win"))
+ mask = KKeyNative::modX(KKey::WIN);
+ else
+ mask = XkbKeysymToModifiers (qt_xdisplay(), XK_Mode_switch)
+ | XkbKeysymToModifiers (qt_xdisplay(), XK_ISO_Level3_Shift)
+ | XkbKeysymToModifiers (qt_xdisplay(), XK_ISO_Level3_Latch)
+ | XkbKeysymToModifiers (qt_xdisplay(), XK_ISO_Level3_Lock);
+
+ int bit = maskToBit (mask);
+ if (bit != -1 && keys[bit] == -1)
+ keys[bit] = i;
+ }
+}
+
+
+bool KAccessApp::x11EventFilter(XEvent *event)
+{
+ // handle XKB events
+ if (event->type == xkb_opcode)
+ {
+ XkbAnyEvent *ev = (XkbAnyEvent*) event;
+
+ switch (ev->xkb_type) {
+ case XkbStateNotify:
+ xkbStateNotify();
+ break;
+ case XkbBellNotify:
+ xkbBellNotify((XkbBellNotifyEvent*)event);
+ break;
+ case XkbControlsNotify:
+ xkbControlsNotify((XkbControlsNotifyEvent*)event);
+ break;
+ }
+ return true;
+ }
+
+ // process other events as usual
+ return KApplication::x11EventFilter(event);
+}
+
+
+void VisualBell::paintEvent(QPaintEvent *event)
+{
+ QWidget::paintEvent(event);
+ QTimer::singleShot(_pause, this, SLOT(hide()));
+}
+
+
+void KAccessApp::activeWindowChanged(WId wid)
+{
+ _activeWindow = wid;
+}
+
+
+void KAccessApp::xkbStateNotify () {
+ XkbStateRec state_return;
+ XkbGetState (qt_xdisplay(), XkbUseCoreKbd, &state_return);
+ unsigned char latched = XkbStateMods (&state_return);
+ unsigned char locked = XkbModLocks (&state_return);
+ int mods = ((int)locked)<<8 | latched;
+
+ if (state != mods) {
+ if (_kNotifyModifiers)
+ for (int i = 0; i < 8; i++) {
+ if (keys[i] != -1) {
+ if ( (!*modifierKeys[keys[i]].latchedText)
+ && ( (((mods >> i) & 0x101) != 0) != (((state >> i) & 0x101) != 0) ))
+ {
+ if ((mods >> i) & 1) {
+ KNotifyClient::event (0, "lockkey-locked", i18n(modifierKeys[keys[i]].lockedText));
+ }
+ else {
+ KNotifyClient::event (0, "lockkey-unlocked", i18n(modifierKeys[keys[i]].unlatchedText));
+ }
+ }
+ else if ((*modifierKeys[keys[i]].latchedText)
+ && ( ((mods >> i) & 0x101) != ((state >> i) & 0x101) ))
+ {
+ if ((mods >> i) & 0x100) {
+ KNotifyClient::event (0, "modifierkey-locked", i18n(modifierKeys[keys[i]].lockedText));
+ }
+ else if ((mods >> i) & 1) {
+ KNotifyClient::event (0, "modifierkey-latched", i18n(modifierKeys[keys[i]].latchedText));
+ }
+ else {
+ KNotifyClient::event (0, "modifierkey-unlatched", i18n(modifierKeys[keys[i]].unlatchedText));
+ }
+ }
+ }
+ }
+ state = mods;
+ }
+}
+
+void KAccessApp::xkbBellNotify(XkbBellNotifyEvent *event)
+{
+ // bail out if we should not really ring
+ if (event->event_only)
+ return;
+
+ // flash the visible bell
+ if (_visibleBell)
+ {
+ // create overlay widget
+ if (!overlay)
+ overlay = new VisualBell(_visibleBellPause);
+
+ WId id = _activeWindow;
+
+ NETRect frame, window;
+ NETWinInfo net(qt_xdisplay(), id, desktop()->winId(), 0);
+
+ net.kdeGeometry(frame, window);
+
+ overlay->setGeometry(window.pos.x, window.pos.y, window.size.width, window.size.height);
+
+ if (_visibleBellInvert)
+ {
+ QPixmap screen = QPixmap::grabWindow(id, 0, 0, window.size.width, window.size.height);
+ QPixmap invert(window.size.width, window.size.height);
+ QPainter p(&invert);
+ p.setRasterOp(QPainter::NotCopyROP);
+ p.drawPixmap(0, 0, screen);
+ overlay->setBackgroundPixmap(invert);
+ }
+ else
+ overlay->setBackgroundColor(_visibleBellColor);
+
+ // flash the overlay widget
+ overlay->raise();
+ overlay->show();
+ flushX();
+ }
+
+ // ask artsd to ring a nice bell
+ if (_artsBell && !_artsBellBlocked ) {
+ KAudioPlayer::play(_artsBellFile);
+ _artsBellBlocked = true;
+ artsBellTimer->start( 300, true );
+ }
+}
+
+QString mouseKeysShortcut (Display *display) {
+ // Calculate the keycode
+ KeySym sym = XK_MouseKeys_Enable;
+ KeyCode code = XKeysymToKeycode(display, sym);
+ if (code == 0) {
+ sym = XK_Pointer_EnableKeys;
+ code = XKeysymToKeycode(display, sym);
+ if (code == 0)
+ return ""; // No shortcut available?
+ }
+
+ // Calculate the modifiers by searching the keysym in the X keyboard mapping
+ XkbDescPtr xkbdesc = XkbGetMap(display, XkbKeyTypesMask | XkbKeySymsMask, XkbUseCoreKbd);
+
+ if (!xkbdesc)
+ return ""; // Failed to obtain the mapping from server
+
+ bool found = false;
+ unsigned char modifiers = 0;
+ int groups = XkbKeyNumGroups(xkbdesc, code);
+ for (int grp = 0; grp < groups && !found; grp++)
+ {
+ int levels = XkbKeyGroupWidth(xkbdesc, code, grp);
+ for (int level = 0; level < levels && !found; level++)
+ {
+ if (sym == XkbKeySymEntry(xkbdesc, code, level, grp))
+ {
+ // keysym found => determine modifiers
+ int typeIdx = xkbdesc->map->key_sym_map[code].kt_index[grp];
+ XkbKeyTypePtr type = &(xkbdesc->map->types[typeIdx]);
+ for (int i = 0; i < type->map_count && !found; i++)
+ {
+ if (type->map[i].active && (type->map[i].level == level))
+ {
+ modifiers = type->map[i].mods.mask;
+ found = true;
+ }
+ }
+ }
+ }
+ }
+ XkbFreeClientMap (xkbdesc, 0, true);
+
+ if (!found)
+ return ""; // Somehow the keycode -> keysym mapping is flawed
+
+ XEvent ev;
+ ev.xkey.display = display;
+ ev.xkey.keycode = code;
+ ev.xkey.state = 0;
+ KKey key = KKey(KKeyNative(&ev));
+ QString keyname = key.toString();
+
+ unsigned int AltMask = KKeyNative::modX(KKey::ALT);
+ unsigned int WinMask = KKeyNative::modX(KKey::WIN);
+ unsigned int NumMask = KKeyNative::modXNumLock();
+ unsigned int ScrollMask= KKeyNative::modXScrollLock();
+
+ unsigned int MetaMask = XkbKeysymToModifiers (display, XK_Meta_L);
+ unsigned int SuperMask = XkbKeysymToModifiers (display, XK_Super_L);
+ unsigned int HyperMask = XkbKeysymToModifiers (display, XK_Hyper_L);
+ unsigned int AltGrMask = XkbKeysymToModifiers (display, XK_Mode_switch)
+ | XkbKeysymToModifiers (display, XK_ISO_Level3_Shift)
+ | XkbKeysymToModifiers (display, XK_ISO_Level3_Latch)
+ | XkbKeysymToModifiers (display, XK_ISO_Level3_Lock);
+
+ unsigned int mods = ShiftMask | ControlMask | AltMask | WinMask
+ | LockMask | NumMask | ScrollMask;
+
+ AltGrMask &= ~mods;
+ MetaMask &= ~(mods | AltGrMask);
+ SuperMask &= ~(mods | AltGrMask | MetaMask);
+ HyperMask &= ~(mods | AltGrMask | MetaMask | SuperMask);
+
+ if ((modifiers & AltGrMask) != 0)
+ keyname = i18n("AltGraph") + "+" + keyname;
+ if ((modifiers & HyperMask) != 0)
+ keyname = i18n("Hyper") + "+" + keyname;
+ if ((modifiers & SuperMask) != 0)
+ keyname = i18n("Super") + "+" + keyname;
+ if ((modifiers & WinMask) != 0)
+ keyname = i18n("Meta") + "+" + keyname;
+ if ((modifiers & WinMask) != 0)
+ keyname = KKey::modFlagLabel(KKey::WIN) + "+" + keyname;
+ if ((modifiers & AltMask) != 0)
+ keyname = KKey::modFlagLabel(KKey::ALT) + "+" + keyname;
+ if ((modifiers & ControlMask) != 0)
+ keyname = KKey::modFlagLabel(KKey::CTRL) + "+" + keyname;
+ if ((modifiers & ShiftMask) != 0)
+ keyname = KKey::modFlagLabel(KKey::SHIFT) + "+" + keyname;
+
+ return keyname;
+}
+
+void KAccessApp::createDialogContents() {
+ if (dialog == 0) {
+ dialog = new KDialogBase(
+ i18n("Warning"),
+ KDialogBase::Yes | KDialogBase::No,
+ KDialogBase::Yes, KDialogBase::Close,
+ 0, "AccessXWarning", true, true,
+ KStdGuiItem::cont(), KStdGuiItem::cancel());
+
+ QVBox *topcontents = new QVBox (dialog);
+ topcontents->setSpacing(KDialog::spacingHint()*2);
+ topcontents->setMargin(KDialog::marginHint());
+
+ QWidget *contents = new QWidget(topcontents);
+ QHBoxLayout * lay = new QHBoxLayout(contents);
+ lay->setSpacing(KDialog::spacingHint());
+
+ QLabel *label1 = new QLabel( contents);
+ QPixmap pixmap = KApplication::kApplication()->iconLoader()->loadIcon("messagebox_warning", KIcon::NoGroup, KIcon::SizeMedium, KIcon::DefaultState, 0, true);
+ if (pixmap.isNull())
+ pixmap = QMessageBox::standardIcon(QMessageBox::Warning);
+ label1->setPixmap(pixmap);
+
+ lay->addWidget( label1, 0, Qt::AlignCenter );
+ lay->addSpacing(KDialog::spacingHint());
+
+ QVBoxLayout * vlay = new QVBoxLayout(lay);
+
+ featuresLabel = new QLabel( "", contents );
+ featuresLabel->setAlignment( WordBreak|AlignVCenter );
+ vlay->addWidget( featuresLabel );
+ vlay->addStretch();
+
+ QHBoxLayout * hlay = new QHBoxLayout(vlay);
+
+ QLabel *showModeLabel = new QLabel( i18n("&When a gesture was used:"), contents );
+ hlay->addWidget( showModeLabel );
+
+ showModeCombobox = new KComboBox (contents);
+ hlay->addWidget( showModeCombobox );
+ showModeLabel->setBuddy(showModeCombobox);
+ showModeCombobox->insertItem ( i18n("Change Settings Without Asking"), 0);
+ showModeCombobox->insertItem ( i18n("Show This Confirmation Dialog"), 1);
+ showModeCombobox->insertItem ( i18n("Deactivate All AccessX Features & Gestures"), 2);
+ showModeCombobox->setCurrentItem (1);
+
+ dialog->setMainWidget(topcontents);
+ dialog->enableButtonSeparator(false);
+
+ connect (dialog, SIGNAL(yesClicked()), this, SLOT(yesClicked()));
+ connect (dialog, SIGNAL(noClicked()), this, SLOT(noClicked()));
+ connect (dialog, SIGNAL(closeClicked()), this, SLOT(dialogClosed()));
+ }
+}
+
+void KAccessApp::xkbControlsNotify(XkbControlsNotifyEvent *event)
+{
+ unsigned int newFeatures = event->enabled_ctrls & (XkbSlowKeysMask | XkbBounceKeysMask | XkbStickyKeysMask | XkbMouseKeysMask);
+
+ if (newFeatures != features) {
+ unsigned int enabled = newFeatures & ~features;
+ unsigned int disabled = features & ~newFeatures;
+
+ if (!_gestureConfirmation) {
+ requestedFeatures = enabled | (requestedFeatures & ~disabled);
+ notifyChanges();
+ features = newFeatures;
+ }
+ else {
+ // set the AccessX features back to what they were. We will
+ // apply the changes later if the user allows us to do that.
+ readSettings();
+
+ requestedFeatures = enabled | (requestedFeatures & ~disabled);
+
+ enabled = requestedFeatures & ~features;
+ disabled = features & ~requestedFeatures;
+
+ QStringList enabledFeatures;
+ QStringList disabledFeatures;
+
+ if (enabled & XkbStickyKeysMask)
+ enabledFeatures << i18n("Sticky keys");
+ else if (disabled & XkbStickyKeysMask)
+ disabledFeatures << i18n("Sticky keys");
+
+ if (enabled & XkbSlowKeysMask)
+ enabledFeatures << i18n("Slow keys");
+ else if (disabled & XkbSlowKeysMask)
+ disabledFeatures << i18n("Slow keys");
+
+ if (enabled & XkbBounceKeysMask)
+ enabledFeatures << i18n("Bounce keys");
+ else if (disabled & XkbBounceKeysMask)
+ disabledFeatures << i18n("Bounce keys");
+
+ if (enabled & XkbMouseKeysMask)
+ enabledFeatures << i18n("Mouse keys");
+ else if (disabled & XkbMouseKeysMask)
+ disabledFeatures << i18n("Mouse keys");
+
+ QString question;
+ switch (enabledFeatures.count()) {
+ case 0: switch (disabledFeatures.count()) {
+ case 1: question = i18n("Do you really want to deactivate \"%1\"?")
+ .arg(disabledFeatures[0]);
+ break;
+ case 2: question = i18n("Do you really want to deactivate \"%1\" and \"%2\"?")
+ .arg(disabledFeatures[0]).arg(disabledFeatures[1]);
+ break;
+ case 3: question = i18n("Do you really want to deactivate \"%1\", \"%2\" and \"%3\"?")
+ .arg(disabledFeatures[0]).arg(disabledFeatures[1])
+ .arg(disabledFeatures[2]);
+ break;
+ case 4: question = i18n("Do you really want to deactivate \"%1\", \"%2\", \"%3\" and \"%4\"?")
+ .arg(disabledFeatures[0]).arg(disabledFeatures[1])
+ .arg(disabledFeatures[2]).arg(disabledFeatures[3]);
+ break;
+ }
+ break;
+ case 1: switch (disabledFeatures.count()) {
+ case 0: question = i18n("Do you really want to activate \"%1\"?")
+ .arg(enabledFeatures[0]);
+ break;
+ case 1: question = i18n("Do you really want to activate \"%1\" and to deactivate \"%2\"?")
+ .arg(enabledFeatures[0]).arg(disabledFeatures[0]);
+ break;
+ case 2: question = i18n("Do you really want to activate \"%1\" and to deactivate \"%2\" and \"%3\"?")
+ .arg(enabledFeatures[0]).arg(disabledFeatures[0])
+ .arg(disabledFeatures[1]);
+ break;
+ case 3: question = i18n("Do you really want to activate \"%1\" and to deactivate \"%2\", \"%3\" and \"%4\"?")
+ .arg(enabledFeatures[0]).arg(disabledFeatures[0])
+ .arg(disabledFeatures[1]).arg(disabledFeatures[2]);
+ break;
+ }
+ break;
+ case 2: switch (disabledFeatures.count()) {
+ case 0: question = i18n("Do you really want to activate \"%1\" and \"%2\"?")
+ .arg(enabledFeatures[0]).arg(enabledFeatures[1]);
+ break;
+ case 1: question = i18n("Do you really want to activate \"%1\" and \"%2\" and to deactivate \"%3\"?")
+ .arg(enabledFeatures[0]).arg(enabledFeatures[1])
+ .arg(disabledFeatures[0]);
+ break;
+ case 2: question = i18n("Do you really want to activate \"%1\", and \"%2\" and to deactivate \"%3\" and \"%4\"?")
+ .arg(enabledFeatures[0]).arg(enabledFeatures[1])
+ .arg(enabledFeatures[0]).arg(disabledFeatures[1]);
+ break;
+ }
+ break;
+ case 3: switch (disabledFeatures.count()) {
+ case 0: question = i18n("Do you really want to activate \"%1\", \"%2\" and \"%3\"?")
+ .arg(enabledFeatures[0]).arg(enabledFeatures[1])
+ .arg(enabledFeatures[2]);
+ break;
+ case 1: question = i18n("Do you really want to activate \"%1\", \"%2\" and \"%3\" and to deactivate \"%4\"?")
+ .arg(enabledFeatures[0]).arg(enabledFeatures[1])
+ .arg(enabledFeatures[2]).arg(disabledFeatures[0]);
+ break;
+ }
+ break;
+ case 4: question = i18n("Do you really want to activate \"%1\", \"%2\", \"%3\" and \"%4\"?")
+ .arg(enabledFeatures[0]).arg(enabledFeatures[1])
+ .arg(enabledFeatures[2]).arg(enabledFeatures[3]);
+ break;
+ }
+ QString explanation;
+ if (enabledFeatures.count()+disabledFeatures.count() == 1) {
+ explanation = i18n("An application has requested to change this setting.");
+
+ if (_gestures) {
+ if ((enabled | disabled) == XkbSlowKeysMask)
+ explanation = i18n("You held down the Shift key for 8 seconds or an application has requested to change this setting.");
+ else if ((enabled | disabled) == XkbStickyKeysMask)
+ explanation = i18n("You pressed the Shift key 5 consecutive times or an application has requested to change this setting.");
+ else if ((enabled | disabled) == XkbMouseKeysMask) {
+ QString shortcut = mouseKeysShortcut(qt_xdisplay());
+ if (!shortcut.isEmpty() && !shortcut.isNull())
+ explanation = i18n("You pressed %1 or an application has requested to change this setting.").arg(shortcut);
+ }
+ }
+ }
+ else {
+ if (_gestures)
+ explanation = i18n("An application has requested to change these settings, or you used a combination of several keyboard gestures.");
+ else
+ explanation = i18n("An application has requested to change these settings.");
+ }
+
+ createDialogContents();
+ featuresLabel->setText ( question+"\n\n"+explanation
+ +" "+i18n("These AccessX settings are needed for some users with motion impairments and can be configured in the KDE Control Center. You can also turn them on and off with standardized keyboard gestures.\n\nIf you do not need them, you can select \"Deactivate all AccessX features and gestures\".") );
+
+ KWin::setState( dialog->winId(), NET::KeepAbove );
+ kapp->updateUserTimestamp();
+ dialog->show();
+ }
+ }
+}
+
+void KAccessApp::notifyChanges() {
+ if (!_kNotifyAccessX)
+ return;
+
+ unsigned int enabled = requestedFeatures & ~features;
+ unsigned int disabled = features & ~requestedFeatures;
+
+ if (enabled & XkbSlowKeysMask)
+ KNotifyClient::event (0, "slowkeys", i18n("Slow keys has been enabled. From now on, you need to press each key for a certain length of time before it is accepted."));
+ else if (disabled & XkbSlowKeysMask)
+ KNotifyClient::event (0, "slowkeys", i18n("Slow keys has been disabled."));
+
+ if (enabled & XkbBounceKeysMask)
+ KNotifyClient::event (0, "bouncekeys", i18n("Bounce keys has been enabled. From now on, each key will be blocked for a certain length of time after it is used."));
+ else if (disabled & XkbBounceKeysMask)
+ KNotifyClient::event (0, "bouncekeys", i18n("Bounce keys has been disabled."));
+
+ if (enabled & XkbStickyKeysMask)
+ KNotifyClient::event (0, "stickykeys", i18n("Sticky keys has been enabled. From now on, modifier keys will stay latched after you have released them."));
+ else if (disabled & XkbStickyKeysMask)
+ KNotifyClient::event (0, "stickykeys", i18n("Sticky keys has been disabled."));
+
+ if (enabled & XkbMouseKeysMask)
+ KNotifyClient::event (0, "mousekeys", i18n("Mouse keys has been enabled. From now on, you can use the number pad of your keyboard in order to control the mouse."));
+ else if (disabled & XkbMouseKeysMask)
+ KNotifyClient::event (0, "mousekeys", i18n("Mouse keys has been disabled."));
+}
+
+void KAccessApp::applyChanges() {
+ notifyChanges();
+ unsigned int enabled = requestedFeatures & ~features;
+ unsigned int disabled = features & ~requestedFeatures;
+
+ KConfig *config = KGlobal::config();
+ config->setGroup("Keyboard");
+
+ if (enabled & XkbSlowKeysMask)
+ config->writeEntry("SlowKeys", true);
+ else if (disabled & XkbSlowKeysMask)
+ config->writeEntry("SlowKeys", false);
+
+ if (enabled & XkbBounceKeysMask)
+ config->writeEntry("BounceKeys", true);
+ else if (disabled & XkbBounceKeysMask)
+ config->writeEntry("BounceKeys", false);
+
+ if (enabled & XkbStickyKeysMask)
+ config->writeEntry("StickyKeys", true);
+ else if (disabled & XkbStickyKeysMask)
+ config->writeEntry("StickyKeys", false);
+
+ config->setGroup("Mouse");
+
+ if (enabled & XkbMouseKeysMask)
+ config->writeEntry("MouseKeys", true);
+ else if (disabled & XkbMouseKeysMask)
+ config->writeEntry("MouseKeys", false);
+
+ config->sync();
+}
+
+void KAccessApp::yesClicked() {
+ if (dialog != 0)
+ dialog->deleteLater();
+ dialog = 0;
+
+ KConfig *config = KGlobal::config();
+ config->setGroup("Keyboard");
+ switch (showModeCombobox->currentItem()) {
+ case 0:
+ config->writeEntry("Gestures", true);
+ config->writeEntry("GestureConfirmation", false);
+ break;
+ default:
+ config->writeEntry("Gestures", true);
+ config->writeEntry("GestureConfirmation", true);
+ break;
+ case 2:
+ requestedFeatures = 0;
+ config->writeEntry("Gestures", false);
+ config->writeEntry("GestureConfirmation", false);
+ }
+ config->sync();
+
+ if (features != requestedFeatures) {
+ notifyChanges();
+ applyChanges();
+ }
+ readSettings();
+}
+
+void KAccessApp::noClicked() {
+ if (dialog != 0)
+ dialog->deleteLater();
+ dialog = 0;
+ requestedFeatures = features;
+
+ KConfig *config = KGlobal::config();
+ config->setGroup("Keyboard");
+ switch (showModeCombobox->currentItem()) {
+ case 0:
+ config->writeEntry("Gestures", true);
+ config->writeEntry("GestureConfirmation", false);
+ break;
+ default:
+ config->writeEntry("Gestures", true);
+ config->writeEntry("GestureConfirmation", true);
+ break;
+ case 2:
+ requestedFeatures = 0;
+ config->writeEntry("Gestures", false);
+ config->writeEntry("GestureConfirmation", true);
+ }
+ config->sync();
+
+ if (features != requestedFeatures)
+ applyChanges();
+ readSettings();
+}
+
+void KAccessApp::dialogClosed() {
+ if (dialog != 0)
+ dialog->deleteLater();
+ dialog = 0;
+
+ requestedFeatures = features;
+}
+
+void KAccessApp::slotArtsBellTimeout()
+{
+ _artsBellBlocked = false;
+}
+
+void KAccessApp::setXkbOpcode(int opcode)
+{
+ xkb_opcode = opcode;
+}
diff --git a/kcontrol/access/kaccess.desktop b/kcontrol/access/kaccess.desktop
new file mode 100644
index 000000000..6fbd7f668
--- /dev/null
+++ b/kcontrol/access/kaccess.desktop
@@ -0,0 +1,78 @@
+[Desktop Entry]
+Type=Service
+Name=KDE Accessibility Tool
+Name[af]=KDE toeganklikheid program
+Name[ar]=أداة KDE لتسهيل الوصول
+Name[az]=KDE Yetişmə Qabiliyyəti Vasitəsi
+Name[be]=Інструмент даступнасці KDE
+Name[bg]=Равностоен достъп
+Name[bn]=কে.ডি.ই. সহায়ক প্রযুক্তি টুল
+Name[br]=Ostilh haezadusted KDE
+Name[bs]=KDE alat za pristupačnost
+Name[ca]=Eina d'accessibilitat KDE
+Name[cs]=Nástroj pro zpřístupnění prostředí KDE
+Name[csb]=Pòmòce przistãpù KDE
+Name[cy]=Erfyn Hygyrchedd KDE
+Name[da]=KDE Tilgængelighedsværktøj
+Name[de]=KDE-Zugangshilfe
+Name[el]=Εργαλείο προσιτότητας του KDE
+Name[eo]=KDE-ilo por Alirebleco
+Name[es]=Herramienta de accesibilidad de KDE
+Name[et]=KDE hõlbustusvahend
+Name[eu]=KDEren erabilerraztasun tresna
+Name[fa]=ابزار دستیابی‌پذیری KDE
+Name[fi]=KDE:n helppokäyttötoiminnot
+Name[fr]=Outil d'accessibilité de KDE
+Name[fy]=KDE Tagonklikens
+Name[ga]=Uirlis Inrochtaineachta KDE
+Name[gl]=Ferramenta de Acesibilidade de KDE
+Name[he]=כלי הנגישות של KDE
+Name[hi]=केडीई एक्सेसिबिलिटी औजार
+Name[hr]=KDE pristupačnost
+Name[hu]=KDE kezelési segédeszköz
+Name[is]=KDE aðgengistól
+Name[it]=Strumento per l'accessibilità di KDE
+Name[ja]=KDE アクセシビリティ支援ツール
+Name[ka]=KDE-ს სპეცეციალური შესაძლებლობების ხელსაწყოები
+Name[kk]=KDE арнайы мүмкіндіктер құралы
+Name[km]=ឧបករណ៍​មធ្យោបាយងាយស្រួល KDE
+Name[ko]=KDE 접근성 도구
+Name[lt]=KDE prieinamumo įrankis
+Name[lv]=KDE pieejamības rīks
+Name[mk]=Алатка за пристапливост во KDE
+Name[ms]=Alat Keaksesan KDE
+Name[mt]=Għodda KDE għall-aċċessibbiltà
+Name[nb]=Tilgjengelighetsverktøy for KDE
+Name[nds]=KDE-Warktüüch för Behinnerte
+Name[ne]=KDE पहुँचयोग्य उपकरण
+Name[nl]=KDE Toegankelijkheid
+Name[nn]=Tilgjengeverktøy for KDE
+Name[pa]=KDE ਸਹਾਇਕ ਸੰਦ
+Name[pl]=Ułatwienia dostępu KDE
+Name[pt]=Ferramenta de Acessibilidade do KDE
+Name[pt_BR]=Ferramenta de Acessibilidade do KDE
+Name[ro]=Utilitar de accesibilitate pentru KDE
+Name[ru]=Специальные возможности
+Name[rw]=Igikoresho cy'Ukugerwaho cya KDE
+Name[se]=KDE reaidu álkkibut geavaheami várás
+Name[sk]=KDE sprístupnenie
+Name[sl]=Orodje za dostopnost KDE
+Name[sr]=KDE алатка за приступачност
+Name[sr@Latn]=KDE alatka za pristupačnost
+Name[sv]=Handikappverktyg för KDE
+Name[ta]=KDE அணுகும் கருவி
+Name[tg]=Барномаи Тавонёбии KDE
+Name[th]=เครื่องมือปรับแต่งการช่วยใารใช้ของงาน KDE
+Name[tr]=KDE Erişilebilirlik Aracı
+Name[tt]=KDE'neñ Qulaylıq Qoralı
+Name[uk]=Утиліта керування доступності KDE
+Name[uz]=KDE qulaylik vositasi
+Name[uz@cyrillic]=KDE қулайлик воситаси
+Name[vi]=Công cụ hỗ trợ người tàn tật cho KDE
+Name[wa]=Usteye d' accessibilité KDE
+Name[zh_CN]=KDE 辅助工具
+Name[zh_TW]=KDE 無障礙工具
+Exec=kaccess
+X-DCOP-ServiceType=None
+X-KDE-ParentApp=kcontrol
+DocPath=kcontrol/kcmaccess/index.html
diff --git a/kcontrol/access/kaccess.h b/kcontrol/access/kaccess.h
new file mode 100644
index 000000000..d75d0bdb6
--- /dev/null
+++ b/kcontrol/access/kaccess.h
@@ -0,0 +1,114 @@
+#ifndef __K_ACCESS_H__
+#define __K_ACCESS_H__
+
+
+#include <qwidget.h>
+#include <qcolor.h>
+
+
+#include <kuniqueapplication.h>
+#include <kwinmodule.h>
+
+
+#include <X11/Xlib.h>
+#define explicit int_explicit // avoid compiler name clash in XKBlib.h
+#include <X11/XKBlib.h>
+#undef explicit
+
+class KDialogBase;
+class QLabel;
+class KComboBox;
+
+class KAccessApp : public KUniqueApplication
+{
+ Q_OBJECT
+
+public:
+
+ KAccessApp(bool allowStyles=true, bool GUIenabled=true);
+
+ bool x11EventFilter(XEvent *event);
+
+ int newInstance();
+
+ void setXkbOpcode(int opcode);
+
+protected:
+
+ void readSettings();
+
+ void xkbStateNotify();
+ void xkbBellNotify(XkbBellNotifyEvent *event);
+ void xkbControlsNotify(XkbControlsNotifyEvent *event);
+
+
+private slots:
+
+ void activeWindowChanged(WId wid);
+ void slotArtsBellTimeout();
+ void notifyChanges();
+ void applyChanges();
+ void yesClicked();
+ void noClicked();
+ void dialogClosed();
+
+private:
+ void createDialogContents();
+ void initMasks();
+
+ int xkb_opcode;
+ unsigned int features;
+ unsigned int requestedFeatures;
+
+ bool _systemBell, _artsBell, _visibleBell, _visibleBellInvert;
+ bool _artsBellBlocked;
+ QString _artsBellFile;
+ QColor _visibleBellColor;
+ int _visibleBellPause;
+
+ bool _gestures, _gestureConfirmation;
+ bool _kNotifyModifiers, _kNotifyAccessX;
+
+ QWidget *overlay;
+
+ QTimer *artsBellTimer;
+
+ KWinModule wm;
+
+ WId _activeWindow;
+
+ KDialogBase *dialog;
+ QLabel *featuresLabel;
+ KComboBox *showModeCombobox;
+
+ int keys[8];
+ int state;
+};
+
+
+class VisualBell : public QWidget
+{
+ Q_OBJECT
+
+public:
+
+ VisualBell(int pause)
+ : QWidget(0, 0, WX11BypassWM), _pause(pause)
+ {};
+
+
+protected:
+
+ void paintEvent(QPaintEvent *);
+
+
+private:
+
+ int _pause;
+
+};
+
+
+
+
+#endif
diff --git a/kcontrol/access/kcmaccess.cpp b/kcontrol/access/kcmaccess.cpp
new file mode 100644
index 000000000..661748e1d
--- /dev/null
+++ b/kcontrol/access/kcmaccess.cpp
@@ -0,0 +1,805 @@
+/**
+ * kcmaccess.cpp
+ *
+ * Copyright (c) 2000 Matthias H�zer-Klpfel
+ *
+ */
+
+
+#include <stdlib.h>
+#include <math.h>
+
+#include <dcopref.h>
+
+#include <qtabwidget.h>
+#include <qlayout.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qlineedit.h>
+#include <qradiobutton.h>
+#include <qwhatsthis.h>
+#include <qslider.h>
+#include <qspinbox.h>
+
+
+#include <kcombobox.h>
+#include <kstandarddirs.h>
+#include <kcolorbutton.h>
+#include <kfiledialog.h>
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kshortcut.h>
+#include <kkeynative.h>
+#include <knotifydialog.h>
+
+#include <X11/Xlib.h>
+#include <X11/XKBlib.h>
+#define XK_MISCELLANY
+#define XK_XKB_KEYS
+#include <X11/keysymdef.h>
+
+#include "kcmaccess.moc"
+
+
+ExtendedIntNumInput::ExtendedIntNumInput
+ (QWidget* parent, const char* name)
+ : KIntNumInput(parent, name)
+{
+}
+
+ExtendedIntNumInput::~ExtendedIntNumInput () {
+}
+
+void ExtendedIntNumInput::setRange(int min, int max, int step, bool slider) {
+ KIntNumInput::setRange (min,max,step, slider);
+
+ if (slider) {
+ disconnect(m_slider, SIGNAL(valueChanged(int)),
+ m_spin, SLOT(setValue(int)));
+ disconnect(m_spin, SIGNAL(valueChanged(int)),
+ this, SLOT(spinValueChanged(int)));
+
+ this->min = min;
+ this->max = max;
+ sliderMax = (int)floor (0.5
+ + 2*(log(max)-log(min)) / (log(max)-log(max-1)));
+ m_slider->setRange(0, sliderMax);
+ m_slider->setSteps(step, sliderMax/10);
+ m_slider->setTickInterval(sliderMax/10);
+
+ double alpha = sliderMax / (log(max) - log(min));
+ double logVal = alpha * (log(value())-log(min));
+ m_slider->setValue ((int)floor (0.5 + logVal));
+
+ connect(m_slider, SIGNAL(valueChanged(int)),
+ this, SLOT(slotSliderValueChanged(int)));
+ connect(m_spin, SIGNAL(valueChanged(int)),
+ this, SLOT(slotSpinValueChanged(int)));
+ }
+}
+
+// Basically the slider values are logarithmic whereas
+// spinbox values are linear.
+
+void ExtendedIntNumInput::slotSpinValueChanged(int val)
+{
+
+ if(m_slider) {
+ double alpha = sliderMax / (log(max) - log(min));
+ double logVal = alpha * (log(val)-log(min));
+ m_slider->setValue ((int)floor (0.5 + logVal));
+ }
+
+ emit valueChanged(val);
+}
+
+void ExtendedIntNumInput::slotSliderValueChanged(int val)
+{
+ double alpha = sliderMax / (log(max) - log(min));
+ double linearVal = exp (val/alpha + log(min));
+ m_spin->setValue ((int)floor(0.5 + linearVal));
+}
+
+static bool needToRunKAccessDaemon( KConfig *config )
+{
+ // We always start the KAccess Daemon, if it is not needed,
+ // it will terminate itself after configuring the AccessX
+ // features.
+ return true;
+}
+
+QString mouseKeysShortcut (Display *display) {
+ // Calculate the keycode
+ KeySym sym = XK_MouseKeys_Enable;
+ KeyCode code = XKeysymToKeycode(display, sym);
+ if (code == 0) {
+ sym = XK_Pointer_EnableKeys;
+ code = XKeysymToKeycode(display, sym);
+ if (code == 0)
+ return ""; // No shortcut available?
+ }
+
+ // Calculate the modifiers by searching the keysym in the X keyboard mapping
+ XkbDescPtr xkbdesc = XkbGetMap(display, XkbKeyTypesMask | XkbKeySymsMask, XkbUseCoreKbd);
+ if (!xkbdesc)
+ return ""; // Failed to obtain the mapping from server
+
+ bool found = false;
+ unsigned char modifiers = 0;
+ int groups = XkbKeyNumGroups(xkbdesc, code);
+ for (int grp = 0; grp < groups && !found; grp++)
+ {
+ int levels = XkbKeyGroupWidth(xkbdesc, code, grp);
+ for (int level = 0; level < levels && !found; level++)
+ {
+ if (sym == XkbKeySymEntry(xkbdesc, code, level, grp))
+ {
+ // keysym found => determine modifiers
+ int typeIdx = xkbdesc->map->key_sym_map[code].kt_index[grp];
+ XkbKeyTypePtr type = &(xkbdesc->map->types[typeIdx]);
+ for (int i = 0; i < type->map_count && !found; i++)
+ {
+ if (type->map[i].active && (type->map[i].level == level))
+ {
+ modifiers = type->map[i].mods.mask;
+ found = true;
+ }
+ }
+ }
+ }
+ }
+ XkbFreeClientMap (xkbdesc, 0, true);
+
+ if (!found)
+ return ""; // Somehow the keycode -> keysym mapping is flawed
+
+ XEvent ev;
+ ev.xkey.display = display;
+ ev.xkey.keycode = code;
+ ev.xkey.state = 0;
+ KKey key = KKey(KKeyNative(&ev));
+ QString keyname = key.toString();
+
+ unsigned int AltMask = KKeyNative::modX(KKey::ALT);
+ unsigned int WinMask = KKeyNative::modX(KKey::WIN);
+ unsigned int NumMask = KKeyNative::modXNumLock();
+ unsigned int ScrollMask= KKeyNative::modXScrollLock();
+
+ unsigned int MetaMask = XkbKeysymToModifiers (display, XK_Meta_L);
+ unsigned int SuperMask = XkbKeysymToModifiers (display, XK_Super_L);
+ unsigned int HyperMask = XkbKeysymToModifiers (display, XK_Hyper_L);
+ unsigned int AltGrMask = XkbKeysymToModifiers (display, XK_Mode_switch)
+ | XkbKeysymToModifiers (display, XK_ISO_Level3_Shift)
+ | XkbKeysymToModifiers (display, XK_ISO_Level3_Latch)
+ | XkbKeysymToModifiers (display, XK_ISO_Level3_Lock);
+
+ unsigned int mods = ShiftMask | ControlMask | AltMask | WinMask
+ | LockMask | NumMask | ScrollMask;
+
+ AltGrMask &= ~mods;
+ MetaMask &= ~(mods | AltGrMask);
+ SuperMask &= ~(mods | AltGrMask | MetaMask);
+ HyperMask &= ~(mods | AltGrMask | MetaMask | SuperMask);
+
+ if ((modifiers & AltGrMask) != 0)
+ keyname = i18n("AltGraph") + "+" + keyname;
+ if ((modifiers & HyperMask) != 0)
+ keyname = i18n("Hyper") + "+" + keyname;
+ if ((modifiers & SuperMask) != 0)
+ keyname = i18n("Super") + "+" + keyname;
+ if ((modifiers & WinMask) != 0)
+ keyname = KKey::modFlagLabel(KKey::WIN) + "+" + keyname;
+ if ((modifiers & AltMask) != 0)
+ keyname = KKey::modFlagLabel(KKey::ALT) + "+" + keyname;
+ if ((modifiers & ControlMask) != 0)
+ keyname = KKey::modFlagLabel(KKey::CTRL) + "+" + keyname;
+ if ((modifiers & ShiftMask) != 0)
+ keyname = KKey::modFlagLabel(KKey::SHIFT) + "+" + keyname;
+
+ QString result;
+ if ((modifiers & ScrollMask) != 0)
+ if ((modifiers & LockMask) != 0)
+ if ((modifiers & NumMask) != 0)
+ result = i18n("Press %1 while NumLock, CapsLock and ScrollLock are active");
+ else
+ result = i18n("Press %1 while CapsLock and ScrollLock are active");
+ else if ((modifiers & NumMask) != 0)
+ result = i18n("Press %1 while NumLock and ScrollLock are active");
+ else
+ result = i18n("Press %1 while ScrollLock is active");
+ else if ((modifiers & LockMask) != 0)
+ if ((modifiers & NumMask) != 0)
+ result = i18n("Press %1 while NumLock and CapsLock are active");
+ else
+ result = i18n("Press %1 while CapsLock is active");
+ else if ((modifiers & NumMask) != 0)
+ result = i18n("Press %1 while NumLock is active");
+ else
+ result = i18n("Press %1");
+
+ return result.arg(keyname);
+}
+
+KAccessConfig::KAccessConfig(QWidget *parent, const char *)
+ : KCModule(parent, "kcmaccess")
+{
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kaccess"), I18N_NOOP("KDE Accessibility Tool"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2000, Matthias Hoelzer-Kluepfel"));
+
+ about->addAuthor("Matthias Hoelzer-Kluepfel", I18N_NOOP("Author") , "hoelzer@kde.org");
+
+ setAboutData( about );
+
+ QVBoxLayout *main = new QVBoxLayout(this, 0, KDialogBase::spacingHint());
+ QTabWidget *tab = new QTabWidget(this);
+ main->addWidget(tab);
+
+ // bell settings ---------------------------------------
+ QWidget *bell = new QWidget(this);
+
+ QVBoxLayout *vbox = new QVBoxLayout(bell, KDialogBase::marginHint(),
+ KDialogBase::spacingHint());
+
+ QGroupBox *grp = new QGroupBox(i18n("Audible Bell"), bell);
+ grp->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(grp);
+
+ QVBoxLayout *vvbox = new QVBoxLayout(grp->layout(),
+ KDialogBase::spacingHint());
+
+ systemBell = new QCheckBox(i18n("Use &system bell"), grp);
+ vvbox->addWidget(systemBell);
+ customBell = new QCheckBox(i18n("Us&e customized bell"), grp);
+ vvbox->addWidget(customBell);
+ QWhatsThis::add( systemBell, i18n("If this option is checked, the default system bell will be used. See the"
+ " \"System Bell\" control module for how to customize the system bell."
+ " Normally, this is just a \"beep\".") );
+ QWhatsThis::add( customBell, i18n("Check this option if you want to use a customized bell, playing"
+ " a sound file. If you do this, you will probably want to turn off the system bell.<p> Please note"
+ " that on slow machines this may cause a \"lag\" between the event causing the bell and the sound being played.") );
+
+ QHBoxLayout *hbox = new QHBoxLayout(vvbox, KDialogBase::spacingHint());
+ hbox->addSpacing(24);
+ soundEdit = new QLineEdit(grp);
+ soundLabel = new QLabel(soundEdit, i18n("Sound &to play:"), grp);
+ hbox->addWidget(soundLabel);
+ hbox->addWidget(soundEdit);
+ soundButton = new QPushButton(i18n("Browse..."), grp);
+ hbox->addWidget(soundButton);
+ QString wtstr = i18n("If the option \"Use customized bell\" is enabled, you can choose a sound file here."
+ " Click \"Browse...\" to choose a sound file using the file dialog.");
+ QWhatsThis::add( soundEdit, wtstr );
+ QWhatsThis::add( soundLabel, wtstr );
+ QWhatsThis::add( soundButton, wtstr );
+
+ connect(soundButton, SIGNAL(clicked()), this, SLOT(selectSound()));
+
+ connect(customBell, SIGNAL(clicked()), this, SLOT(checkAccess()));
+
+ connect(systemBell, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(customBell, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(soundEdit, SIGNAL(textChanged(const QString&)), this, SLOT(configChanged()));
+
+ // -----------------------------------------------------
+
+ // visible bell ----------------------------------------
+ grp = new QGroupBox(i18n("Visible Bell"), bell);
+ grp->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(grp);
+
+ vvbox = new QVBoxLayout(grp->layout(), KDialog::spacingHint());
+
+ visibleBell = new QCheckBox(i18n("&Use visible bell"), grp);
+ vvbox->addWidget(visibleBell);
+ QWhatsThis::add( visibleBell, i18n("This option will turn on the \"visible bell\", i.e. a visible"
+ " notification shown every time that normally just a bell would occur. This is especially useful"
+ " for deaf people.") );
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ invertScreen = new QRadioButton(i18n("I&nvert screen"), grp);
+ hbox->addWidget(invertScreen);
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ QWhatsThis::add( invertScreen, i18n("All screen colors will be inverted for the amount of time specified below.") );
+ hbox->addSpacing(24);
+ flashScreen = new QRadioButton(i18n("F&lash screen"), grp);
+ hbox->addWidget(flashScreen);
+ QWhatsThis::add( flashScreen, i18n("The screen will turn to a custom color for the amount of time specified below.") );
+ hbox->addSpacing(12);
+ colorButton = new KColorButton(grp);
+ colorButton->setFixedWidth(colorButton->sizeHint().height()*2);
+ hbox->addWidget(colorButton);
+ hbox->addStretch();
+ QWhatsThis::add( colorButton, i18n("Click here to choose the color used for the \"flash screen\" visible bell.") );
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+
+ durationSlider = new ExtendedIntNumInput(grp);
+ durationSlider->setRange(100, 2000, 100);
+ durationSlider->setLabel(i18n("Duration:"));
+ durationSlider->setSuffix(i18n(" msec"));
+ hbox->addWidget(durationSlider);
+ QWhatsThis::add( durationSlider, i18n("Here you can customize the duration of the \"visible bell\" effect being shown.") );
+
+ connect(invertScreen, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(flashScreen, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(visibleBell, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(visibleBell, SIGNAL(clicked()), this, SLOT(checkAccess()));
+ connect(colorButton, SIGNAL(clicked()), this, SLOT(changeFlashScreenColor()));
+
+ connect(invertScreen, SIGNAL(clicked()), this, SLOT(invertClicked()));
+ connect(flashScreen, SIGNAL(clicked()), this, SLOT(flashClicked()));
+
+ connect(durationSlider, SIGNAL(valueChanged(int)), this, SLOT(configChanged()));
+
+ vbox->addStretch();
+
+ // -----------------------------------------------------
+
+ tab->addTab(bell, i18n("&Bell"));
+
+
+ // modifier key settings -------------------------------
+ QWidget *modifiers = new QWidget(this);
+
+ vbox = new QVBoxLayout(modifiers, KDialog::marginHint(), KDialog::spacingHint());
+
+ grp = new QGroupBox(i18n("S&ticky Keys"), modifiers);
+ grp->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(grp);
+
+ vvbox = new QVBoxLayout(grp->layout(), KDialog::spacingHint());
+
+ stickyKeys = new QCheckBox(i18n("Use &sticky keys"), grp);
+ vvbox->addWidget(stickyKeys);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ stickyKeysLock = new QCheckBox(i18n("&Lock sticky keys"), grp);
+ hbox->addWidget(stickyKeysLock);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ stickyKeysAutoOff = new QCheckBox(i18n("Turn sticky keys off when two keys are pressed simultaneously"), grp);
+ hbox->addWidget(stickyKeysAutoOff);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ stickyKeysBeep = new QCheckBox(i18n("Use system bell whenever a modifier gets latched, locked or unlocked"), grp);
+ hbox->addWidget(stickyKeysBeep);
+
+ grp = new QGroupBox(i18n("Locking Keys"), modifiers);
+ grp->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(grp);
+
+ vvbox = new QVBoxLayout(grp->layout(), KDialog::spacingHint());
+
+ toggleKeysBeep = new QCheckBox(i18n("Use system bell whenever a locking key gets activated or deactivated"), grp);
+ vvbox->addWidget(toggleKeysBeep);
+
+ kNotifyModifiers = new QCheckBox(i18n("Use KDE's system notification mechanism whenever a modifier or locking key changes its state"), grp);
+ vvbox->addWidget(kNotifyModifiers);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addStretch(1);
+ kNotifyModifiersButton = new QPushButton(i18n("Configure System Notification..."), grp);
+ kNotifyModifiersButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ hbox->addWidget(kNotifyModifiersButton);
+
+ connect(stickyKeys, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(stickyKeysLock, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(stickyKeysAutoOff, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(stickyKeys, SIGNAL(clicked()), this, SLOT(checkAccess()));
+
+ connect(stickyKeysBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(toggleKeysBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(kNotifyModifiers, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(kNotifyModifiers, SIGNAL(clicked()), this, SLOT(checkAccess()));
+ connect(kNotifyModifiersButton, SIGNAL(clicked()), this, SLOT(configureKNotify()));
+
+ vbox->addStretch();
+
+ tab->addTab(modifiers, i18n("&Modifier Keys"));
+
+ // key filter settings ---------------------------------
+ QWidget *filters = new QWidget(this);
+
+ vbox = new QVBoxLayout(filters, KDialog::marginHint(), KDialog::spacingHint());
+
+ grp = new QGroupBox(i18n("Slo&w Keys"), filters);
+ grp->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(grp);
+
+ vvbox = new QVBoxLayout(grp->layout(), KDialog::spacingHint());
+
+ slowKeys = new QCheckBox(i18n("&Use slow keys"), grp);
+ vvbox->addWidget(slowKeys);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ slowKeysDelay = new ExtendedIntNumInput(grp);
+ slowKeysDelay->setSuffix(i18n(" msec"));
+ slowKeysDelay->setRange(50, 10000, 100);
+ slowKeysDelay->setLabel(i18n("Acceptance dela&y:"));
+ hbox->addWidget(slowKeysDelay);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ slowKeysPressBeep = new QCheckBox(i18n("&Use system bell whenever a key is pressed"), grp);
+ hbox->addWidget(slowKeysPressBeep);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ slowKeysAcceptBeep = new QCheckBox(i18n("&Use system bell whenever a key is accepted"), grp);
+ hbox->addWidget(slowKeysAcceptBeep);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ slowKeysRejectBeep = new QCheckBox(i18n("&Use system bell whenever a key is rejected"), grp);
+ hbox->addWidget(slowKeysRejectBeep);
+
+ grp = new QGroupBox(i18n("Bounce Keys"), filters);
+ grp->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(grp);
+
+ vvbox = new QVBoxLayout(grp->layout(), KDialog::spacingHint());
+
+ bounceKeys = new QCheckBox(i18n("Use bou&nce keys"), grp);
+ vvbox->addWidget(bounceKeys);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ bounceKeysDelay = new ExtendedIntNumInput(grp);
+ bounceKeysDelay->setSuffix(i18n(" msec"));
+ bounceKeysDelay->setRange(100, 5000, 100);
+ bounceKeysDelay->setLabel(i18n("D&ebounce time:"));
+ hbox->addWidget(bounceKeysDelay);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ bounceKeysRejectBeep = new QCheckBox(i18n("Use the system bell whenever a key is rejected"), grp);
+ hbox->addWidget(bounceKeysRejectBeep);
+
+ connect(slowKeysDelay, SIGNAL(valueChanged(int)), this, SLOT(configChanged()));
+ connect(slowKeys, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(slowKeys, SIGNAL(clicked()), this, SLOT(checkAccess()));
+
+ connect(slowKeysPressBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(slowKeysAcceptBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(slowKeysRejectBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
+
+ connect(bounceKeysDelay, SIGNAL(valueChanged(int)), this, SLOT(configChanged()));
+ connect(bounceKeys, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(bounceKeysRejectBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(bounceKeys, SIGNAL(clicked()), this, SLOT(checkAccess()));
+
+ vbox->addStretch();
+
+ tab->addTab(filters, i18n("&Keyboard Filters"));
+
+ // gestures --------------------------------------------
+ QWidget *features = new QWidget(this);
+
+ vbox = new QVBoxLayout(features, KDialog::marginHint(), KDialog::spacingHint());
+
+ grp = new QGroupBox(i18n("Activation Gestures"), features);
+ grp->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(grp);
+
+ vvbox = new QVBoxLayout(grp->layout(), KDialog::spacingHint());
+
+ gestures = new QCheckBox(i18n("Use gestures for activating sticky keys and slow keys"), grp);
+ vvbox->addWidget(gestures);
+ QString shortcut = mouseKeysShortcut(this->x11Display());
+ if (shortcut.isEmpty())
+ QWhatsThis::add (gestures, i18n("Here you can activate keyboard gestures that turn on the following features: \n"
+ "Sticky keys: Press Shift key 5 consecutive times\n"
+ "Slow keys: Hold down Shift for 8 seconds"));
+ else
+ QWhatsThis::add (gestures, i18n("Here you can activate keyboard gestures that turn on the following features: \n"
+ "Mouse Keys: %1\n"
+ "Sticky keys: Press Shift key 5 consecutive times\n"
+ "Slow keys: Hold down Shift for 8 seconds").arg(shortcut));
+
+ timeout = new QCheckBox(i18n("Turn sticky keys and slow keys off after a certain period of inactivity"), grp);
+ vvbox->addWidget(timeout);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addSpacing(24);
+ timeoutDelay = new KIntNumInput(grp);
+ timeoutDelay->setSuffix(i18n(" min"));
+ timeoutDelay->setRange(1, 30, 4);
+ timeoutDelay->setLabel(i18n("Timeout:"));
+ hbox->addWidget(timeoutDelay);
+
+ grp = new QGroupBox(i18n("Notification"), features);
+ grp->setColumnLayout( 0, Qt::Horizontal );
+ vbox->addWidget(grp);
+
+ vvbox = new QVBoxLayout(grp->layout(), KDialog::spacingHint());
+
+ accessxBeep = new QCheckBox(i18n("Use the system bell whenever a gesture is used to turn an accessibility feature on or off"), grp);
+ vvbox->addWidget(accessxBeep);
+
+ gestureConfirmation = new QCheckBox(i18n("Show a confirmation dialog whenever a keyboard accessibility feature is turned on or off"), grp);
+ vvbox->addWidget(gestureConfirmation);
+ QWhatsThis::add (gestureConfirmation, i18n("If this option is checked, KDE will show a confirmation dialog whenever a keyboard accessibility feature is turned on or off.\nBe sure you know what you are doing if you uncheck it, as the keyboard accessibility settings will then always be applied without confirmation.") );
+
+ kNotifyAccessX = new QCheckBox(i18n("Use KDE's system notification mechanism whenever a keyboard accessibility feature is turned on or off"), grp);
+ vvbox->addWidget(kNotifyAccessX);
+
+ hbox = new QHBoxLayout(vvbox, KDialog::spacingHint());
+ hbox->addStretch(1);
+ kNotifyAccessXButton = new QPushButton(i18n("Configure System Notification..."), grp);
+ kNotifyAccessXButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ hbox->addWidget(kNotifyAccessXButton);
+
+ connect(gestures, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(timeout, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(timeout, SIGNAL(clicked()), this, SLOT(checkAccess()));
+ connect(timeoutDelay, SIGNAL(valueChanged(int)), this, SLOT(configChanged()));
+ connect(accessxBeep, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(gestureConfirmation, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(kNotifyAccessX, SIGNAL(clicked()), this, SLOT(configChanged()));
+ connect(kNotifyAccessX, SIGNAL(clicked()), this, SLOT(checkAccess()));
+ connect(kNotifyAccessXButton, SIGNAL(clicked()), this, SLOT(configureKNotify()));
+
+ vbox->addStretch();
+
+ tab->addTab(features, i18n("Activation Gestures"));
+
+ load();
+}
+
+
+KAccessConfig::~KAccessConfig()
+{
+}
+
+void KAccessConfig::configureKNotify()
+{
+ KAboutData about(I18N_NOOP("kaccess"),
+ I18N_NOOP("KDE Accessibility Tool"),
+ 0);
+ KNotifyDialog::configure (this, 0, &about);
+}
+
+void KAccessConfig::changeFlashScreenColor()
+{
+ invertScreen->setChecked(false);
+ flashScreen->setChecked(true);
+ configChanged();
+}
+
+void KAccessConfig::selectSound()
+{
+ QStringList list = KGlobal::dirs()->findDirs("sound", "");
+ QString start;
+ if (list.count()>0)
+ start = list[0];
+ // TODO: Why only wav's? How can I find out what artsd supports?
+ QString fname = KFileDialog::getOpenFileName(start, i18n("*.wav|WAV Files"));
+ if (!fname.isEmpty())
+ soundEdit->setText(fname);
+}
+
+
+void KAccessConfig::configChanged()
+{
+ emit changed(true);
+}
+
+
+void KAccessConfig::load()
+{
+ load( false );
+}
+
+void KAccessConfig::load( bool useDefaults )
+{
+ KConfig *config = new KConfig("kaccessrc", true, false);
+
+ config->setGroup("Bell");
+ config->setReadDefaults( useDefaults );
+
+ systemBell->setChecked(config->readBoolEntry("SystemBell", true));
+ customBell->setChecked(config->readBoolEntry("ArtsBell", false));
+ soundEdit->setText(config->readPathEntry("ArtsBellFile"));
+
+ visibleBell->setChecked(config->readBoolEntry("VisibleBell", false));
+ invertScreen->setChecked(config->readBoolEntry("VisibleBellInvert", true));
+ flashScreen->setChecked(!invertScreen->isChecked());
+ QColor def(Qt::red);
+ colorButton->setColor(config->readColorEntry("VisibleBellColor", &def));
+
+ durationSlider->setValue(config->readNumEntry("VisibleBellPause", 500));
+
+
+ config->setGroup("Keyboard");
+
+ stickyKeys->setChecked(config->readBoolEntry("StickyKeys", false));
+ stickyKeysLock->setChecked(config->readBoolEntry("StickyKeysLatch", true));
+ stickyKeysAutoOff->setChecked(config->readBoolEntry("StickyKeysAutoOff", false));
+ stickyKeysBeep->setChecked(config->readBoolEntry("StickyKeysBeep", true));
+ toggleKeysBeep->setChecked(config->readBoolEntry("ToggleKeysBeep", false));
+ kNotifyModifiers->setChecked(config->readBoolEntry("kNotifyModifiers", false));
+
+ slowKeys->setChecked(config->readBoolEntry("SlowKeys", false));
+ slowKeysDelay->setValue(config->readNumEntry("SlowKeysDelay", 500));
+ slowKeysPressBeep->setChecked(config->readBoolEntry("SlowKeysPressBeep", true));
+ slowKeysAcceptBeep->setChecked(config->readBoolEntry("SlowKeysAcceptBeep", true));
+ slowKeysRejectBeep->setChecked(config->readBoolEntry("SlowKeysRejectBeep", true));
+
+ bounceKeys->setChecked(config->readBoolEntry("BounceKeys", false));
+ bounceKeysDelay->setValue(config->readNumEntry("BounceKeysDelay", 500));
+ bounceKeysRejectBeep->setChecked(config->readBoolEntry("BounceKeysRejectBeep", true));
+
+ gestures->setChecked(config->readBoolEntry("Gestures", true));
+ timeout->setChecked(config->readBoolEntry("AccessXTimeout", false));
+ timeoutDelay->setValue(config->readNumEntry("AccessXTimeoutDelay", 30));
+
+ accessxBeep->setChecked(config->readBoolEntry("AccessXBeep", true));
+ gestureConfirmation->setChecked(config->readBoolEntry("GestureConfirmation", false));
+ kNotifyAccessX->setChecked(config->readBoolEntry("kNotifyAccessX", false));
+
+ delete config;
+
+ checkAccess();
+
+ emit changed(useDefaults);
+}
+
+
+void KAccessConfig::save()
+{
+ KConfig *config= new KConfig("kaccessrc", false);
+
+ config->setGroup("Bell");
+
+ config->writeEntry("SystemBell", systemBell->isChecked());
+ config->writeEntry("ArtsBell", customBell->isChecked());
+ config->writePathEntry("ArtsBellFile", soundEdit->text());
+
+ config->writeEntry("VisibleBell", visibleBell->isChecked());
+ config->writeEntry("VisibleBellInvert", invertScreen->isChecked());
+ config->writeEntry("VisibleBellColor", colorButton->color());
+
+ config->writeEntry("VisibleBellPause", durationSlider->value());
+
+
+ config->setGroup("Keyboard");
+
+ config->writeEntry("StickyKeys", stickyKeys->isChecked());
+ config->writeEntry("StickyKeysLatch", stickyKeysLock->isChecked());
+ config->writeEntry("StickyKeysAutoOff", stickyKeysAutoOff->isChecked());
+ config->writeEntry("StickyKeysBeep", stickyKeysBeep->isChecked());
+ config->writeEntry("ToggleKeysBeep", toggleKeysBeep->isChecked());
+ config->writeEntry("kNotifyModifiers", kNotifyModifiers->isChecked());
+
+ config->writeEntry("SlowKeys", slowKeys->isChecked());
+ config->writeEntry("SlowKeysDelay", slowKeysDelay->value());
+ config->writeEntry("SlowKeysPressBeep", slowKeysPressBeep->isChecked());
+ config->writeEntry("SlowKeysAcceptBeep", slowKeysAcceptBeep->isChecked());
+ config->writeEntry("SlowKeysRejectBeep", slowKeysRejectBeep->isChecked());
+
+
+ config->writeEntry("BounceKeys", bounceKeys->isChecked());
+ config->writeEntry("BounceKeysDelay", bounceKeysDelay->value());
+ config->writeEntry("BounceKeysRejectBeep", bounceKeysRejectBeep->isChecked());
+
+ config->writeEntry("Gestures", gestures->isChecked());
+ config->writeEntry("AccessXTimeout", timeout->isChecked());
+ config->writeEntry("AccessXTimeoutDelay", timeoutDelay->value());
+
+ config->writeEntry("AccessXBeep", accessxBeep->isChecked());
+ config->writeEntry("GestureConfirmation", gestureConfirmation->isChecked());
+ config->writeEntry("kNotifyAccessX", kNotifyAccessX->isChecked());
+
+
+ config->sync();
+
+ if (systemBell->isChecked() ||
+ customBell->isChecked() ||
+ visibleBell->isChecked())
+ {
+ KConfig cfg("kdeglobals", false, false);
+ cfg.setGroup("General");
+ cfg.writeEntry("UseSystemBell", true);
+ cfg.sync();
+ }
+
+ // make kaccess reread the configuration
+ // When turning things off, it needs to be done by kaccess,
+ // so don't actually kill it *shrug*.
+ if ( true /*needToRunKAccessDaemon( config )*/ )
+ kapp->startServiceByDesktopName("kaccess");
+
+ else // don't need it -> kill it
+ {
+ DCOPRef kaccess( "kaccess", "qt/kaccess" );
+ kaccess.send( "quit" );
+ }
+
+ delete config;
+
+ emit changed(false);
+}
+
+
+void KAccessConfig::defaults()
+{
+ load( true );
+}
+
+
+void KAccessConfig::invertClicked()
+{
+ flashScreen->setChecked(false);
+}
+
+
+void KAccessConfig::flashClicked()
+{
+ invertScreen->setChecked(false);
+}
+
+
+void KAccessConfig::checkAccess()
+{
+ bool custom = customBell->isChecked();
+ soundEdit->setEnabled(custom);
+ soundButton->setEnabled(custom);
+ soundLabel->setEnabled(custom);
+
+ bool visible = visibleBell->isChecked();
+ invertScreen->setEnabled(visible);
+ flashScreen->setEnabled(visible);
+ colorButton->setEnabled(visible);
+ durationSlider->setEnabled(visible);
+
+ bool sticky = stickyKeys->isChecked();
+ stickyKeysLock->setEnabled(sticky);
+ stickyKeysAutoOff->setEnabled(sticky);
+ stickyKeysBeep->setEnabled(sticky);
+
+ bool slow = slowKeys->isChecked();
+ slowKeysDelay->setEnabled(slow);
+ slowKeysPressBeep->setEnabled(slow);
+ slowKeysAcceptBeep->setEnabled(slow);
+ slowKeysRejectBeep->setEnabled(slow);
+
+ bool bounce = bounceKeys->isChecked();
+ bounceKeysDelay->setEnabled(bounce);
+ bounceKeysRejectBeep->setEnabled(bounce);
+
+ bool useTimeout = timeout->isChecked();
+ timeoutDelay->setEnabled(useTimeout);
+}
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_access(QWidget *parent, const char *name)
+ {
+ return new KAccessConfig(parent, name);
+ }
+
+ /* This one gets called by kcminit
+
+ */
+ KDE_EXPORT void init_access()
+ {
+ KConfig *config = new KConfig("kaccessrc", true, false);
+ bool run = needToRunKAccessDaemon( config );
+
+ delete config;
+ if (run)
+ kapp->startServiceByDesktopName("kaccess");
+ }
+}
+
+
diff --git a/kcontrol/access/kcmaccess.desktop b/kcontrol/access/kcmaccess.desktop
new file mode 100644
index 000000000..7980cadec
--- /dev/null
+++ b/kcontrol/access/kcmaccess.desktop
@@ -0,0 +1,240 @@
+[Desktop Entry]
+Icon=access
+Type=Application
+Exec=kcmshell kcmaccess
+DocPath=kcontrol/kcmaccess/index.html
+
+
+X-KDE-Library=access
+X-KDE-Init=access
+X-KDE-ParentApp=kcontrol
+
+Name=Accessibility
+Name[af]=Toeganklikheid
+Name[ar]=تسهيل الوصول
+Name[az]=Yetişmə Qabiliyyəti
+Name[be]=Даступнасць
+Name[bg]=Равностоен достъп
+Name[bn]=সহায়ক প্রযুক্তি
+Name[br]=Haezadusted
+Name[bs]=Pristupačnost
+Name[ca]=Accessibilitat
+Name[cs]=Zpřístupnění
+Name[csb]=Pòmòce przistãpù
+Name[cy]=Hygyrchedd
+Name[da]=Tilgængelighed
+Name[de]=Zugangshilfen
+Name[el]=Προσιτότητα
+Name[eo]=Alirebleco
+Name[es]=Accesibilidad
+Name[et]=Hõlbustus
+Name[eu]=Erabilerraztasuna
+Name[fa]=دستیابی‌پذیری
+Name[fi]=Helppokäyttötoiminnot
+Name[fr]=Accessibilité
+Name[fy]=Tagonklikens
+Name[ga]=Inrochtaineacht
+Name[gl]=Accesibilidade
+Name[he]=נגישות
+Name[hi]=पहुँच
+Name[hr]=Pristupačnost
+Name[hu]=Kezelési segítség
+Name[id]=Aksesibiliti
+Name[is]=Aðgengi
+Name[it]=Accessibilità
+Name[ja]=アクセシビリティ
+Name[ka]=სპეციალური შესაძლბლობები
+Name[kk]=Арнайы мүмкіндіктер
+Name[km]=ភាព​អាច​ចូល​ដំណើរការ​បាន
+Name[ko]=내게 필요한 설정
+Name[lo]=ຄວາມສາມາດໃນການໃຊ້ງານ
+Name[lt]=Prieinamumas
+Name[lv]=Pieejamība
+Name[mk]=Пристапливост
+Name[mn]=Хэрэглэх тохь
+Name[ms]=Kebolehcapaian
+Name[mt]=Aċċessibiltà
+Name[nb]=Tilgjengelighet
+Name[nds]=Behinnertenhülp
+Name[ne]=पहुँचता
+Name[nl]=Toegankelijkheid
+Name[nn]=Tilgjenge
+Name[nso]=Botsenelo
+Name[oc]=Accessibilitat
+Name[pa]=ਸਹੂਲਤਾਂ
+Name[pl]=Dostępność
+Name[pt]=Acessibilidade
+Name[pt_BR]=Acessibilidade
+Name[ro]=Accesibilitate
+Name[ru]=Специальные возможности
+Name[rw]=Ukugerwaho
+Name[se]=Álkkibut geavaheapmi
+Name[sk]=Prístupnosť
+Name[sl]=Dostopnost
+Name[sr]=Приступачност
+Name[sr@Latn]=Pristupačnost
+Name[ss]=Kutfolakala kalula
+Name[sv]=Handikappstöd
+Name[ta]=அணுகல்
+Name[te]=అందుబాటు
+Name[tg]=Имконпазирӣ
+Name[th]=ตัวช่วยในการใช้งาน
+Name[tr]=Erişilebilirlik
+Name[tt]=Qulaylıq
+Name[uk]=Доступність
+Name[uz]=Qulayliklar
+Name[uz@cyrillic]=Қулайликлар
+Name[ven]=Dzheneaho
+Name[vi]=Hỗ trợ người tàn tật
+Name[wa]=Accessibilité
+Name[xh]=Unikezelo
+Name[zh_CN]=辅助
+Name[zh_TW]=無障礙輔助
+Name[zu]=Ukungena
+
+Comment=Improve accessibility for disabled persons
+Comment[af]=Verbeter toeganklikheid vir gestremde persone
+Comment[ar]=تسهيل الاستخدام لذوي الاحتياجات الخاصة
+Comment[az]=Yetişmə qabiliyyəti zəyif olanların həyatını asanlaşdırar
+Comment[be]=Павялічвае даступнасць для людзей з фізічнымі адхіленнямі
+Comment[bg]=Настройване на достъпа за хора с увреждания
+Comment[bn]=অসমর্থ ব্যবহারকারীদের সহায়তা করার প্রযুক্তি
+Comment[bs]=Bolja pristupačnost za osobe sa nedostacima
+Comment[ca]=Accessibilitat millorada per a persones discapacitades
+Comment[cs]=Zlepšení přístupnosti pro osoby s postižením
+Comment[csb]=Pòprôwionô przistãpnosc dlô niefùlsprôwnëch lëdzi
+Comment[cy]=Gwella hygyrchedd i bobl anabl
+Comment[da]=Forbedr tilgængelighed for handicappede personer
+Comment[de]=Verbesserte Benutzbarkeit für behinderte Menschen
+Comment[el]=Βελτίωση της προσιτότητας για άτομα με ειδικές ανάγκες
+Comment[eo]=Plibonigita alirebleco por handikapitoj
+Comment[es]=Mejorar accesibilidad para discapacitados
+Comment[et]=Puuetega inimestele mõeldud seaded
+Comment[eu]=Erabilerraztasuna hobetzen du pertsona elbarrientzat
+Comment[fa]=بهبود دستیابی‌پذیری برای اشخاص ناتوان
+Comment[fi]=Käyttöä helpottavia asetuksia
+Comment[fr]=Accessibilité améliorée pour les personnes handicapées
+Comment[fy]=Ferbeterde tagonklikens foar brûkers mei in handikap
+Comment[ga]=Feabhsaigh an inrochtaineacht do dhaoine míchumasaithe
+Comment[gl]=Acesibilidade mellorada para persoas con discapacidades
+Comment[he]=שיפור הנגישות עבור אנשים עם מגבלות
+Comment[hi]=विकलांग व्यक्तियों के लिए पहुँच बेहतर बनाए
+Comment[hr]=Unaprijedite pristupačnost osobama s invaliditetom
+Comment[hu]=A számítógép kezelését segítő eszközök fogyatékosoknak
+Comment[is]=Endurbætt aðgengi fyrir þá sem þurfa
+Comment[it]=Accessibilità migliorata per le persone disabili
+Comment[ja]=障害のある方達のためのアクセス改善
+Comment[ka]=ფიზიკური ნაკლოვანებბის მქონი ხალხისთვის სპეციალური შესაძლბლობები
+Comment[kk]=Мүмкіншіліктері шектеулі адамдарға көмек
+Comment[km]=បង្កើន​មធ្យោបាយ​ងាយស្រួល​សម្រាប់​មនុស្ស​ពិការ
+Comment[ko]=장애인들을 위하여 접근성을 향상시킵니다
+Comment[lo]=ປັບຄ່າຄວາມສາມາດໃນການໃຊ້ງານສຳຫລັບຜູ້ທີ່ມີຄວາມສາມາດ
+Comment[lt]=Pagerintas prieinamumas neįgaliems asmenims
+Comment[lv]=Uzlabo pieejamību cilvekiem ar īpašām vajadzībām
+Comment[mk]=Ја подобрува пристапливоста за хендикепирани лица
+Comment[mn]=Гэмтэлтэй хүнд зориулан сайжруулсан хэрэглээ
+Comment[ms]=Tingkatkan keaksesan bagi orang kurang upaya
+Comment[mt]=Aċċessibbiltà aħjar għal persuni b'diżabilità
+Comment[nb]=Forbedret tilgjengelighet for funksjonshemmede
+Comment[nds]=Verbetert den Togang för Behinnerte
+Comment[ne]=अक्षम व्यक्तिका लागि पहुँच क्षमता सुधार गर्नुहोस्
+Comment[nl]=Verbeterde toegankelijkheid voor gebruikers met een handicap
+Comment[nn]=Forbetra tilgjenge for funksjonshemma personar
+Comment[nso]=Kaonafatsa botsenelo bja batho bao basa kgonego go itirela
+Comment[pa]=ਅਪੰਗ ਵਿਅਕਤੀ ਲਈ ਸੁਧਾਰੀ ਸਹਾਇਤਾ
+Comment[pl]=Poprawiona dostępność dla osób niepełnosprawnych
+Comment[pt]=Acessibilidade melhorada para pessoas com necessidades especiais
+Comment[pt_BR]=Melhora a acessibilidade para pessoas com deficiência
+Comment[ro]=Îmbunătățește accesibilitate KDE pentru persoanele cu handicap
+Comment[ru]=Специальные возможности для людей с физическими недостатками
+Comment[rw]=Kongera ukugerwaho kw'abantu bahagaritswe
+Comment[se]=Álkkibut geavaheapmi doaimmahehttejuvvon olbmuide
+Comment[sk]=Zlepšenie prístupnosti pre postihnutých používateľov
+Comment[sl]=Izboljšana dostopnost za prizadete osebe
+Comment[sr]=Унапређује приступачност за хендикепиране особе
+Comment[sr@Latn]=Unapređuje pristupačnost za hendikepirane osobe
+Comment[ss]=Phucula kufinyelela kwebantfu labachwalile
+Comment[sv]=Förbättrad tillgänglighet för handikappade personer
+Comment[ta]=பார்க்க முடியாதவர்களுக்கு அணுகலை அதிகப்படுத்தவும்
+Comment[tg]=Имкониятҳои махсус барои одамони нуқсони ҷисмонӣ
+Comment[th]=ทำให้ความสามารถในการใช้งาน สำหรับผู้พิการดีขึ้น
+Comment[tr]=Görme sorunu olanlar için erişilebilirlik seçenekleri
+Comment[tt]=Ğäriplär öçen uñaylıqlar
+Comment[uk]=Підвищення зручності для інвалідів
+Comment[uz]=Nogiron kishilar uchun qulayliklar
+Comment[uz@cyrillic]=Ногирон кишилар учун қулайликлар
+Comment[ven]=Khwinifhadzani madzhenele uitela vhathu vha zwihole
+Comment[vi]=Hỗ trợ người tàn tật
+Comment[wa]=Amidrêye l' accessibilité po les mesplotchès djins
+Comment[xh]=Phucula unikekezeleko lwabantu abakhubazekileyo
+Comment[zh_CN]=方便残疾人使用的辅助功能
+Comment[zh_TW]=方便傷殘人士使用
+Comment[zu]=Ukwenza ukungena kwabantu abakhubazekile kube lula
+
+Keywords=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad
+Keywords[af]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num bordjie
+Keywords[az]=yetişmə,yetişmə qabiliyyəti,kar,əlil,çən,eşidilə bilən çən,görünür çən,Klaviatura,düymələr,yapışqan düymələr,hoppanan düymələr,yavaş düymələr,siçan yönləndirməsi,num pad
+Keywords[be]=доступ,даступнасць,званок,гукавы сігнал,бачны сігнал,клавіятура,клавішы,"ліпучыя" клавішы,"рухомыя" клавішы,марудныя клавішы,навігацыя мышшу,лічбавая клавіятура,access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad
+Keywords[bg]=достъп, увреждания, равностоен, равноправен, зрителни, зрителен, без зрение, access, accessibility, deaf, impaired, bell, audible bell, visible bell, Keyboard, keys, sticky keys, bounce keys, slow keys, mouse navigation, num pad
+Keywords[ca]=accés,accessibilitat,sord,disminuït,timbre,timbre audible,timbre visible,Teclat,tecles,tecles apegaloses,tecles de repetició,tecles lentes,navegació del ratolí,teclat numèric
+Keywords[cs]=Zpřístupnění,Hluchý,Slepý,Postižený,Zvonek,Slyšitelný zvonek,Viditelný zvonek,Klávesnice,Pomalé klávesy,Navigace myši,Num pad
+Keywords[csb]=przistãp,przistãpnosc,głëchy,zwónk,słëszalny zwónk widzalny zwónk,klawiatura,klawisze,przëklejone klawisze,odbijanié klawiszów,pòwólné klawisze,nawigacëjô mëszą,numericznô klawiatura
+Keywords[cy]=mynediad,hygyrchedd,byddar,cloch,cloch clywadwy,cloch gweladwy,bysellfwrdd,allweddell,bysell,bysell gludog,bysell sponcio,bysell araf,llywio llygoden,pad rhif
+Keywords[da]=adgang,tilgængelighed,døv,handicappet,klokke,hørbar klokke,synlig klokke,Tastatur,taster,klæbrige taster,bounce-taster,langsomme taster,musenavigering,numerisk tastatur
+Keywords[de]=Behinderung,Maussteuerung,Signale,Tastatur,Tasten,Taubheit,Verlangsamte Tasten,Zahlenblock,Zugang,Zugangshilfen
+Keywords[el]=πρόσβαση,προσιτότητα,κωφός,impaired,κουδούνι,ακουστή ειδοποίηση,ορατή ειδοποίηση,Πληκτρολόγιο,πλήκτρα,κολλημένα πλήκτρα,πλήκτρα αναπήδησης,αργά πλήκτρα,πλοήγηση ποντικιού,αριθμητικό πληκτρολόγιο
+Keywords[eo]=aliro,handikapito,malhelpito,pepo,videbla pepo,klavaro,klavoj,klavfikso, musnavigado,nombroklavaro
+Keywords[es]=acceso,accesibilidad,sordo,disminuido,timbre,timbre audible,timbre visible,Teclado,teclas,teclas pegajosas,teclas de golpe,teclas lentas,navegación del ratón,teclado numérico
+Keywords[et]=juurdepääs,kurt,puue,puudega,signaal,kuuldav signaal,visuaalne signaal,klaviatuur,klahvid,kleepuvad klahvid,põrkavad klahvid,aeglased klahvid,hiire liigutamine,numbriklaviatuur
+Keywords[eu]=sarrera,erabilerraztasuna,gorra,elbarria,ezkila,ezkila entzungarria, ezkila ikusgarria,Teklatua,teklak,tekla itsaskorrak, bounce teklak,tekla geldoak,sagu bidezko arakaketa,tekla numerikoak
+Keywords[fa]=دستیابی، دستیابی‌پذیری، ناشنوا، معلول، زنگ، زنگ شنیدنی، زنگ مرئی، صفحه کلید، کلیدها، کلیدهای چسبناک، کلیدهای واگشت، کلیدهای کند، ناوش موشی، صفحه اعداد
+Keywords[fi]=käytettävyys,esteettömyys,kuuro,vammautunut,virheilmoitus,virheääni,näkyvä virheilmoitus,näppäimistö,näppäimet,alas jäävät näppäimet,toistavat näppäimet,hitaat näppäimet,hiirinavigointi,numeronäppäimistö
+Keywords[fr]=accès,accessibilité,surdité,sourd,cloche,son,cloche visuelle,cloche sonore,clavier,touches,souris,touches lentes,touches rémanentes,cloche auditive,touches répétées,répétition des touches,auto-maintien des touches,maintien des touches,navigation à la souris,pointeur de souris,émulation du clavier,clavier numérique
+Keywords[fy]=tagong,tagonklikens,dôf,handikap,beheind,bel,sinjalearing,sichtbermeldingen,Kaaiboerd,kaaien,kleef kaaien,kaaioanslag,Mûsnavigaasje,num pad,numeryske klavier
+Keywords[ga]=rochtain,inrochtaineacht,bodhar,clog,clog inchloiste,clog infheicthe,Méarchlár,eochracha,eochracha greamaitheacha,eochracha preabtha,eochracha go mall,nascleanúint luiche,eochaircheap uimhriúil
+Keywords[gl]=aceso,acesibilidade,impar,campá,badalada audíbel,badalada visíbel,teclado,teclas,teclas pegadias,teclas de repetición,teclas lentas,navegación do rato,teclado numérico
+Keywords[he]=גישה,נגישות,חירשים,לקויים,פעמון,פעמון נשמע,פעמון חזותי,לוח,מקשים ,מקלדת ,מקשים,מקשים דביקים,מקשים מוקפצים,מקשים אטיים,ניווט עכבר,מקשי מספרים, access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad
+Keywords[hi]=एक्सेस, पहुँच,बघिर,दुर्बल,घंटी,सुनने योग्य घंटी,दिखने योग्य घंटी,कुंजीपट,कुंजियाँ, चिपकी (स्टिकी) कुंजी,बाउंस कुंजी,धीमी कुंजी,माउस नेविगेशन,न्यूम पैड
+Keywords[hr]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad,pristup,pristupačnost,gluh,gluhoća,oštećenje,zvono,zvuk zvona,vidljivo zvono,tipkovnica,tipke,odbijanje tipki,spore tipke,navigacija mišem,numeričke tipke
+Keywords[hu]=hozzáférés,segédeszközök,süket,fogyatékos,csengő,hallható csengetés,látható csengetés,billentyűzet,billentyűk,ragadós billentyűk,visszaugró billentyűk,lassú billentyűk,egérkezelés,numerikus billentyűzet
+Keywords[is]=aðgangur,aðgengi,heyrnarlaus,fatlaður,píp,bjalla,sjáanleg bjalla,lyklaborð,takkar,músarnotkun,talnaborð
+Keywords[it]=accesso,accessibilità,non udenti,portatori di handicap,campanella,campanella udibile,campanella visibile,tastiera,tasti,permanenza dei tasti,pressione ravvicinata dei tasti,rallentamento dei tasti,navigazione mouse,tastierino numerico
+Keywords[ja]=アクセス,アクセシビリティ,聾唖,障害,ベル,音声ベル,視覚ベル,キーボート,キー,スティッキーキー,バウンスキー,スローキー,マウス補助,数字パッド
+Keywords[km]=ចូល​ដំណើរការ,មធ្យោបាយ​ងាយស្រួល,ថ្លង់,ពិការ,កណ្ដឹង,កណ្ដឹង​ឭ,កណ្ដឹង​មើល​ឃើញ,ក្ដារចុច,គ្រាប់ចុច,គ្រាប់ចុច​ស្អិត,គ្រាប់ចុច​លោត,គ្រាប់ចុច​យឺត,ការ​រុករក​កណ្ដុរ,បន្ទះ​លេខ
+Keywords[lt]=prieinamumas,kurčias,kurčnebylys,neįgalus,skambutis,girdimas,matomas skambutis,klaviatūra,mygtukai,prisegti mygtukai,lėti mygtukai,navigacija su pele
+Keywords[lv]=pieeja,pieejamība,kurls,vājināts,zvans,dzirdams zvans,redzams zvans,Tastatūra,taustiņi,salīmētie taustiņi,elastīgie taustiņi,lēnie taustiņi,peles navigācija,num pads
+Keywords[mk]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad,пристап,пристапност,глув,хендикепиран,ѕвонче,звучно ѕвонче,визуелно ѕвонче,Тастатура,копчиња,лепливи копчиња,отскочни копчиња,бавни копчиња,навигација со глушецот,тастатура со бројки
+Keywords[mn]=Гар,Гэмтэл,Дүлий,Сигнал,Товчилуур,Тооны хэсэг,Хандалт,Хулганы жолоодлого,Хэрэглэх тохь, Удаашруулсан товчилуур
+Keywords[mt]=access,accessibility,aċċessibbiltà,deaf,trux,truxa,torox,impaired,ħadikappat,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad
+Keywords[nb]=tilgang,tilgjengelighet,døv,handikappet,lyd,signal,bjelle,synlig signal,tastatur,taster,faste valgtaster,trege taster,filtertaster,musnavigering,numerisk tastatur
+Keywords[nds]=Togang,accessibility,doof,Behinnerte,Pingel,höörbore Pingel,Ogenpingel,Tastatuur,Tasten,backige Tasten,springen Tasten,langsam Tasten,Muusnavigatschoon,Tallenblock
+Keywords[ne]=पहुँच, पहुँचयोग्यता, डिफ, बिग्रेको, बेल, सुन्न सकिने बेल, हेर्न सकिने बेल, कुञ्जीपाटी, कुञ्जीहरू, टाँसिने कुञ्जीहरू, उफ्रिने कुञ्जीहरू, ढिलो कुञ्जीहरू, माउस नेभिगेसन, नम प्याड
+Keywords[nl]=toegang,toegankelijkheid,doof,handicap,gehandicapt,bel,signalering,zichtbare meldingen,Keyboard,toetsenbord,keys,toetsen,vastgeplakte toetsen,toetsenaanslag,muisnavigatie,num pad,numerieke klavier
+Keywords[nn]=tilgang,tilgjenge,døv,handikappa,lyd,signal,bjelle,synleg signal,tastatur,tastar,faste modifikasjonstastar,trege tastar,filtertastar,musnavigering,numerisk tastatur
+Keywords[nso]=tsenelo,botsenelo,sefofu,kelekantswe,bell,bell yeo e kwagalago, bell yeo e bonagalago,Keyboard,ditobetswa,ditobetswa tseo di tiilego,ditobetswa tsago pampa,ditobetswa tsago nanya,navigation ya legotlo,num pad
+Keywords[pa]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,ਕੀ-ਬੋਰਡ,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad
+Keywords[pl]=dostęp,dostępność,głuchy,upośledzony,dzwonek,słyszalny dzwonek widzialny dzwonek,klawiatura,klawisze,klejące klawisze,odbijanie klawiszy,powolne klawisze,nawigacja myszą,klawiatura numeryczna
+Keywords[pt]=acesso,acessibilidade,surdo,deficiente,campainha,campainha audível,campainha visível,teclado,teclas,teclas 'sticky',teclas 'bounce',teclas lentas,navegação com o rato,num pad
+Keywords[pt_BR]=acesso,acessibilidade,surdo,deficiente,campainha,audível,campainha visível, teclado,teclas,teclas persistentes,teclas repetidas,teclas lentas,navegação do mouse,teclado numérico
+Keywords[ro]=acces,accesibilitate,surd,handicap,difuzor,audibil,sunet vizibil,tastatură,taste,taste comutator,taste fără repetiție,taste lente,navigare mouse,tastatura numerică
+Keywords[ru]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad,залипающие клавиши,специальные возможности,клавиши
+Keywords[rw]=kugera,ukugerwaho,ikitumva,cyononekaye,inzogera,inzogera yumvikana,inzogera igaragara,mwandikisho,buto,buto zifashe,buto zidunda,iyega ry'imbeba,agacemibare
+Keywords[se]=álkkibut,bealljeheapmi,doaimmahehttejuvvon,jietna,signála,oaidnus signála,boallobeavdi,boalut,giddes boalut,sáhpannavigašuvdna,numerálaš boallobeavdi
+Keywords[sk]=prístup,prístupnosť,hluchý,postihnutý,zvonček,hlasný zvonček,viditeľný zvonček, klávesnica,klávesy,lepivé klávesy,odrážané klávesy,pomalé klávesy,navigácia myšou,číslice
+Keywords[sl]=dostop,dostopnost,gluh,gluhota,prizadetost,zvonec,vidni zvonec,zvonček,tipkovnica,tipke,lepljive tipke,počasne tipke,navigacija miške,numerična tipkovnica,invalidnost,invalid
+Keywords[sr]=приступ,приступачност,глув,хендикепиран,звоно,звучно звоно,визуелно звоно,тастатура,тастери,лепљиви тастери,спори тастери,померање миша,нумеричка тастатура
+Keywords[sr@Latn]=pristup,pristupačnost,gluv,hendikepiran,zvono,zvučno zvono,vizuelno zvono,tastatura,tasteri,lepljivi tasteri,spori tasteri,pomeranje miša,numerička tastatura
+Keywords[sv]=tillgång,tillgänglighet,döv,handikappad,signal,ljudsignal,visuell signal,Tangentbord,tangenter,klistriga tangenter,studsande tangenter,långsamma tangenter,musnavigering,numeriskt tangentbord
+Keywords[ta]=அணுகல்,அணுகும் முறை,காது கேளாத,ஆற்றல் குறைந்த,மணியோசை,காதால் கேட்கும் அளவிற்கு மணியோசை,தெரியும் மணியோசை,விசைபலகை,விசைகள்,ஒட்டும் விசைகள்,மீளும் தன்மையுடைய விசைகள்,மெதுவான விசைகள்,சுட்டிநாவிகேஷன்,எண்ணிக்கை அட்டை
+Keywords[th]=การเข้าถึง,ความง่ายในการใช้งาน,หูหนวก,บกพร่อง,ออด, ออดใช้ฟัง,ออดใช้ดู,แป้นพิมพ์,ปุ่ม,ปุ่มติดหนึบ,ปุ่มสะท้อน, ปุ่มชะลอ,นำทางโดยเมาส์,แผงปุ่มตัวเลข
+Keywords[tr]=erişim,erişilebilirlik,sağır,özürlü,zil,duyulabilir zil,görünür zil,Klavye,tuşlar,yapışkan tuşlar,zıplayan tuşlar,yavaş tuşlar,fare yönlendirmesi,num pad
+Keywords[uk]=доступ,доступність,глухий,каліка,дзвінок,аудіодзвінок,відеодзвінок,клавіатура,клавіші,липкі клавіші,пружні клавіші,повільні клавіші,навігація миші,цифрова клавіатура
+Keywords[ven]=dzhena,dzheneaho,dzingandevhe,bele,bele i pfalaho,bele i vhonalaho,khiibodo,khii,khii i nambatelaho,khii i fhufhaho,khii i lengaho,lwendo lwa mausu,num pad
+Keywords[vi]=truy cập,hỗ trợ người tàn tật,điếc,bị thương,chuông,chuông kêu,chuông rung,bàn phím,phím,phím dính,phím nảy,phím chậm,di chuyển chuột,bàn phím số
+Keywords[wa]=accès,accessibilité,sourd,mesplotche,cloke,clotche,veyåve,taprece,tapes,aclapantès tapes,tapes di ridjiblaedje,londjinnès tapes,naiviaedje al sori,num pad,xhilete,etindåve xhilete,veyåve xhilete
+Keywords[xh]=nikezela,unikezelo,ayiva,yonakalisiwe,intsimbi,intsimbi evakalayo, intsimbi ebonakalayo,ibhodi yezitshixo,izitshixo,isithixo esincangathi, izitshixo ezilungisiweyo,izitshixo ezinengxolo,izitshixo ezicothayo,indlela yokubeka i mouse endaweni,inkatha ye num
+Keywords[zh_CN]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad,辅助功能,聋,键盘,粘滞键,撞击键,筛选键,鼠标导航,可视铃声,小键盘
+Keywords[zh_TW]=access,accessibility,deaf,impaired,bell,audible bell,visible bell,Keyboard,keys,sticky keys,bounce keys,slow keys,mouse navigation,num pad,使用,聾,鈴聲,聽得見的鈴,看得見的鈴,鍵盤,按鍵,滑鼠導向,數字鍵
+Keywords[zu]=ngena,ukungena,okuthuli,kukhubazekile,insimbi,insimbiezwakalayo, insimbi ebonakalayo,okhiye,okhiye abanamathelayo,okhiyeababhampayo,okhiye abahamba kancane,ukuzula kwe-mouse,num pad
+
+Categories=Qt;KDE;X-KDE-settings-accessibility;
diff --git a/kcontrol/access/kcmaccess.h b/kcontrol/access/kcmaccess.h
new file mode 100644
index 000000000..c40152324
--- /dev/null
+++ b/kcontrol/access/kcmaccess.h
@@ -0,0 +1,111 @@
+/**
+ * kcmaccess.h
+ *
+ * Copyright (c) 2000 Matthias H�zer-Klpfel <hoelzer@kde.org>
+ *
+ */
+
+#ifndef __kcmaccess_h__
+#define __kcmaccess_h__
+
+
+#include <kcmodule.h>
+#include <knuminput.h>
+
+
+class QCheckBox;
+class QComboBox;
+class QLabel;
+class QLineEdit;
+class QPushButton;
+class QRadioButton;
+class KColorButton;
+class QSlider;
+class KNumInput;
+class KAboutData;
+
+class ExtendedIntNumInput : public KIntNumInput
+{
+ Q_OBJECT
+
+ public:
+ /**
+ * Constructs an input control for integer values
+ * with base 10 and initial value 0.
+ */
+ ExtendedIntNumInput(QWidget *parent=0, const char *name=0);
+
+ /**
+ * Destructor
+ */
+ virtual ~ExtendedIntNumInput();
+
+ /**
+ * @param min minimum value
+ * @param max maximum value
+ * @param step step size for the QSlider
+ * @param slider whether the slider is created or not
+ */
+ void setRange(int min, int max, int step=1, bool slider=true);
+
+ private slots:
+ void slotSpinValueChanged(int);
+ void slotSliderValueChanged(int);
+
+ private:
+ int min, max;
+ int sliderMax;
+};
+
+class KAccessConfig : public KCModule
+{
+ Q_OBJECT
+
+public:
+
+ KAccessConfig(QWidget *parent = 0L, const char *name = 0L);
+ virtual ~KAccessConfig();
+
+ void load();
+ void load(bool useDefaults);
+ void save();
+ void defaults();
+
+protected slots:
+
+ void configChanged();
+ void checkAccess();
+ void invertClicked();
+ void flashClicked();
+ void selectSound();
+ void changeFlashScreenColor();
+ void configureKNotify();
+
+private:
+
+ QCheckBox *systemBell, *customBell, *visibleBell;
+ QRadioButton *invertScreen, *flashScreen;
+ QLabel *soundLabel, *colorLabel;
+ QLineEdit *soundEdit;
+ QPushButton *soundButton;
+ KColorButton *colorButton;
+ ExtendedIntNumInput *durationSlider;
+
+ QCheckBox *stickyKeys, *stickyKeysLock, *stickyKeysAutoOff;
+ QCheckBox *stickyKeysBeep, *toggleKeysBeep, *kNotifyModifiers;
+ QPushButton *kNotifyModifiersButton;
+
+ QCheckBox *slowKeys, *bounceKeys;
+ ExtendedIntNumInput *slowKeysDelay, *bounceKeysDelay;
+ QCheckBox *slowKeysPressBeep, *slowKeysAcceptBeep;
+ QCheckBox *slowKeysRejectBeep, *bounceKeysRejectBeep;
+
+ QCheckBox *gestures, *gestureConfirmation;
+ QCheckBox *timeout;
+ KIntNumInput *timeoutDelay;
+ QCheckBox *accessxBeep, *kNotifyAccessX;
+ QPushButton *kNotifyAccessXButton;
+};
+
+
+#endif
diff --git a/kcontrol/access/main.cpp b/kcontrol/access/main.cpp
new file mode 100644
index 000000000..a2dd0d5c7
--- /dev/null
+++ b/kcontrol/access/main.cpp
@@ -0,0 +1,49 @@
+
+#include "kaccess.h"
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <kdebug.h>
+
+extern "C" KDE_EXPORT int kdemain(int argc, char * argv[] )
+{
+ KAboutData about(I18N_NOOP("kaccess"), I18N_NOOP("KDE Accessibility Tool"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2000, Matthias Hoelzer-Kluepfel"));
+
+ about.addAuthor("Matthias Hoelzer-Kluepfel", I18N_NOOP("Author") , "hoelzer@kde.org");
+
+ KCmdLineArgs::init( argc, argv, &about );
+
+ if (!KAccessApp::start())
+ return 0;
+
+ // verify the Xlib has matching XKB extension
+ int major = XkbMajorVersion;
+ int minor = XkbMinorVersion;
+ if (!XkbLibraryVersion(&major, &minor))
+ {
+ kdError() << "Xlib XKB extension does not match" << endl;
+ return 1;
+ }
+ kdDebug() << "Xlib XKB extension major=" << major << " minor=" << minor << endl;
+
+ // we need an application object for qt_xdisplay()
+ KAccessApp app;
+
+ // verify the X server has matching XKB extension
+ // if yes, the XKB extension is initialized
+ int opcode_rtrn;
+ int error_rtrn;
+ int xkb_opcode;
+ if (!XkbQueryExtension(qt_xdisplay(), &opcode_rtrn, &xkb_opcode, &error_rtrn,
+ &major, &minor))
+ {
+ kdError() << "X server has not matching XKB extension" << endl;
+ return 1;
+ }
+ kdDebug() << "X server XKB extension major=" << major << " minor=" << minor << endl;
+
+ app.setXkbOpcode(xkb_opcode);
+ app.disableSessionManagement();
+ return app.exec();
+}