diff options
Diffstat (limited to 'kmilo/delli8k')
-rw-r--r-- | kmilo/delli8k/Makefile.am | 36 | ||||
-rw-r--r-- | kmilo/delli8k/README | 98 | ||||
-rw-r--r-- | kmilo/delli8k/delli8k.cpp | 256 | ||||
-rw-r--r-- | kmilo/delli8k/delli8k.h | 89 | ||||
-rw-r--r-- | kmilo/delli8k/i8k.h | 46 | ||||
-rw-r--r-- | kmilo/delli8k/kmilo_delli8k.desktop | 96 |
6 files changed, 621 insertions, 0 deletions
diff --git a/kmilo/delli8k/Makefile.am b/kmilo/delli8k/Makefile.am new file mode 100644 index 0000000..8b495c2 --- /dev/null +++ b/kmilo/delli8k/Makefile.am @@ -0,0 +1,36 @@ +# This file is part of the KDE project +# Copyright (C) 2003 George Staikos <staikos@kde.org> +# Copyright (C) 2004 Barry O'Donovan <barry.odonovan@kdemail.net> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. + +# You should have received a copy of the GNU Library General Public License +# along with this library; see the file COPYING.LIB. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +INCLUDES=-I$(srcdir)/../kmilod $(all_includes) + +kde_module_LTLIBRARIES = kmilo_delli8k.la + +kmilo_delli8k_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) +kmilo_delli8k_la_LIBADD = ../kmilod/libkmilo.la $(LIB_KIO) +kmilo_delli8k_la_SOURCES = delli8k.cpp +METASOURCES = AUTO + +noinst_HEADERS = delli8k.h + +services_DATA = kmilo_delli8k.desktop +servicesdir = $(kde_servicesdir)/kmilo + +messages: + $(XGETTEXT) $(kmilo_delli8k_la_SOURCES) -o $(podir)/kmilo_delli8k.pot + diff --git a/kmilo/delli8k/README b/kmilo/delli8k/README new file mode 100644 index 0000000..80ae5b0 --- /dev/null +++ b/kmilo/delli8k/README @@ -0,0 +1,98 @@ +Dell Laptop Buttons Plug-in for KMilo + +Barry O'Donovan mail@barryodonovan.com, November 2004 +http://www.barryodonovan.com/ + +KMilo is a service for kded, the KDE daemon. KMilo is new to KDE 3.2. +It allows plug-ins which interact with the special buttons found on +some keyboards and laptops. + +This plug-in reads the /proc/i8k file that is created by the i8k kernel +module. If this file does not exist then the plug-in will not load. + +The code in this module is heavily based on: + - the Asus Laptop plug-in for KMilo by Chris Howells (howells@kde.org) + - the Thinkpad plug-in by Jonathan Riddell (jr@jriddell.org) + +Also, for the Dell specific implementations, code was taken from the +i8kutils package of Massimo Dal Zotto <dz@debian.org> which can be +downloaded from http://www.debian.org/~dz/i8k/ + +LICENSE: + + delli8k - KMilo plug-in for special volume keys of Dell laptops + Copyright (C) 2004 Barry O'Donovan <barry.odonovan@kdemail.net> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +COMPATIBILITY: + +This plug-in should work on any Linux distribution that has the i8k module +loaded or compiled into the kernel. Compatibility is really dependant on +the i8kutils package of Massimo Dal Zotto <dz@debian.org> which can be +downloaded from http://www.debian.org/~dz/i8k/. Currently (20041122), this +should support: + + Inspiron 1100 (BIOS A06), one fan, no buttons + Inspiron 2650 (BIOS A05) + Inspiron 3700 (BIOS A15), no fan speed + Inspiron 3800 (BIOS A14), no fan speed + Inspiron 4000 (BIOS A10), no fan speed + Inspiron 4100 + Inspiron 4150 + Inspiron 5100 (BIOS A06), one fan, no buttons + Inspiron 5150 (BIOS A24), one fan, no buttons + Inspiron 8000 (BIOS A17) + Inspiron 8100 (BIOS A04) + Inspiron 8200 (BIOS A06) + Latitude C400 (BIOS A01) + Latitude C510 (BIOS A07) + Latitude C600 (BIOS A17) + Latitude C610 + Latitude C800 (BIOS A17) + Latitude C810 (BIOS A12) + Latitude C840 (BIOS A10) + Latitude CPiA (BIOS A14), no fan speed + Latitude CPx J750GT (BIOS A13), no fan speed + Latitude D600 (BIOS A05) + Latitude D800 (BIOS A00) + Latitude X200 (BIOS A07) + +That driver seems *NOT WORKING* on the following models: + + Inspiron 2500 (BIOS A10) + Inspiron 3200 + Inspiron 3500 + Inspiron 5000e (BIOS A06) + Inspiron 5150 (BIOS A23) + Inspiron 7000 + Inspiron 7500 + Latitude CPx H450GT + Latitude LS H500ST + +HISTORY: + +22 November 2004 - Initial release + +TODO: + +KCM Module + - set volume step size + - set dcop mixer device + - allow use of special keys + (this may require the user to set up key codes under X) + + diff --git a/kmilo/delli8k/delli8k.cpp b/kmilo/delli8k/delli8k.cpp new file mode 100644 index 0000000..74c0d60 --- /dev/null +++ b/kmilo/delli8k/delli8k.cpp @@ -0,0 +1,256 @@ +/* + This file is part of the KDE project + + Copyright (c) 2004 Barry O'Donovan (barry.odonovan@kdemail.net) + + The code in this module is heavily based on: + - the Asus Laptop plug-in for KMilo + Copyright (c) 2004 Chris Howells (howells@kde.org) + - the Thinkpad plug-in + Copyright (c) 2004 Jonathan Riddell (jr@jriddell.org) + - the i8k kernel module and utilities (http://www.debian.org/~dz/i8k/) + Copyright (c) 2001-2003 Massimo Dal Zotto <dz@debian.org> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include <kgenericfactory.h> + +#include "kmilointerface.h" + +#include <fcntl.h> +#include <sys/ioctl.h> + +#include "i8k.h" + +/* For compatibilty with i8k kernel driver 1.1 */ +#define I8K_VOL_MUTE_1_1 3 + +#include "delli8k.h" + +namespace KMilo +{ + +DellI8kMonitor::DellI8kMonitor( QObject* parent, const char* name, const QStringList& args ) + : Monitor( parent, name, args ) +{ +} + +DellI8kMonitor::~DellI8kMonitor() +{ +} + +bool DellI8kMonitor::init() +{ + kdDebug() << "KMilo: loading Dell I8k KMilo plugin" << endl; + + // Ensure the Dell I8k kernel module is installed/loaded + if( ( m_fd = open( I8K_PROC, O_RDONLY ) ) < 0 ) + { + kdDebug() << "KMilo: DellI8kMonitor: unable to open i8k proc file: " << I8K_PROC + << " in init()" << endl; + return false; + } + else + { + kmixClient = new DCOPRef( "kmix", "Mixer0" ); + kmixWindow = new DCOPRef( "kmix", "kmix-mainwindow#1" ); + retrieveVolume(); + retrieveMute(); + } + + return true; +} + +Monitor::DisplayType DellI8kMonitor::poll() +{ + Monitor::DisplayType pollResult = None; + + if( ( m_status = fn_status( m_fd ) ) < 0 ) + { + kdDebug() << "KMilo: DellI8kMonitor: unable to read fn status in poll()" << endl; + return pollResult; + } + else + { + switch( m_status ) + { + case I8K_VOL_UP: + pollResult = Volume; + retrieveVolume(); + setVolume( m_volume + DELLI8K_VOLUME_STEPSIZE ); + m_progress = m_volume; + break; + case I8K_VOL_DOWN: + pollResult = Volume; + retrieveVolume(); + setVolume( m_volume - DELLI8K_VOLUME_STEPSIZE ); + m_progress = m_volume; + break; + case I8K_VOL_MUTE: + case I8K_VOL_MUTE_1_1: + pollResult = None; + retrieveMute(); + setMute( !m_mute ); + if( m_mute ) + _interface->displayText( i18n( "Mute On" ) ); + else + _interface->displayText( i18n( "Mute Off" ) ); + break; + case 0: + break; + default: + kdDebug() << "KMile: DellI8kMonitor: invalid button status: " << m_status + << " in poll()" << endl; + break; + } + } + + return pollResult; +} + +int DellI8kMonitor::progress() const +{ + return m_progress; +} + +bool DellI8kMonitor::retrieveVolume() +{ + bool kmix_error = false; + + DCOPReply reply = kmixClient->call( "masterVolume"); + + if( reply.isValid() ) + { + m_volume = reply; + } + else + { + kmix_error = true; + } + + if (kmix_error) + { + // maybe the error occurred because kmix wasn't running + if( kapp->startServiceByDesktopName( "kmix" ) == 0 ) // trying to start kmix + { + // trying again + reply = kmixClient->call( "masterVolume"); + if( reply.isValid() ) + { + m_volume = reply; + kmix_error = false; + kmixWindow->send( "hide" ); + } + } + } + + if (kmix_error) + { + kdError() << "KMilo: DellI8kMonitor could not access kmix/Mixer0 via dcop" << endl; + return false; + } + + return true; +} + +void DellI8kMonitor::setVolume(int volume) +{ + if( !retrieveVolume() ) + { + return; + } + + if( volume > 100 ) + { + m_volume = 100; + } + else if( volume < 0 ) + { + m_volume = 0; + } + else + { + m_volume = volume; + } + + kmixClient->send("setMasterVolume", m_volume); + + m_progress = m_volume; +} + +bool DellI8kMonitor::retrieveMute() +{ + bool kmix_error = false; + + DCOPReply reply = kmixClient->call( "masterMute" ); + + if( reply.isValid() ) + { + m_mute = reply; + } + else + { + kmix_error = true; + } + + if (kmix_error) + { + // maybe the error occurred because kmix wasn't running + if( kapp->startServiceByDesktopName( "kmix" ) == 0 ) // trying to start kmix + { + // trying again + reply = kmixClient->call( "masterVolume" ); + if( reply.isValid() ) + { + m_volume = reply; + kmix_error = false; + kmixWindow->send( "hide" ); + } + } + } + + if (kmix_error) + { + kdError() << "KMilo: DellI8kMonitor could not access kmix/Mixer0 via dcop in isMute()" << endl; + return false; + } + + return true; +} + +void DellI8kMonitor::setMute( bool b ) +{ + m_mute = b; + kmixClient->send( "setMasterMute", m_mute ); +} + +int DellI8kMonitor::fn_status( int fd ) +{ + int args[1]; + int rc; + + if( ( rc = ioctl( fd, I8K_FN_STATUS, &args ) ) < 0 ) + { + kdError() << "KMilo: DellI8kMonitor: ioctl failed in fn_status()" << endl; + return rc; + } + + return args[0]; +} + +} //close namespace + +K_EXPORT_COMPONENT_FACTORY( kmilo_delli8k, KGenericFactory<KMilo::DellI8kMonitor>( "kmilo_delli8k" ) ) diff --git a/kmilo/delli8k/delli8k.h b/kmilo/delli8k/delli8k.h new file mode 100644 index 0000000..d33f6ff --- /dev/null +++ b/kmilo/delli8k/delli8k.h @@ -0,0 +1,89 @@ +/* + This file is part of the KDE project + + Copyright (c) 2004 Barry O'Donovan <barry.odonovan@kdemail.net> + + The code in this module is heavily based on: + - the Asus Laptop plug-in for KMilo + Copyright (c) 2004 Chris Howells (howells@kde.org) + - the Thinkpad plug-in + Copyright (c) 2004 Jonathan Riddell (jr@jriddell.org) + - the i8k kernel module and utilities (http://www.debian.org/~dz/i8k/) + Copyright (c) 2001-2003 Massimo Dal Zotto <dz@debian.org> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef DELLI8K_H +#define DELLI8K_H + +#include <kapplication.h> +#include <dcopref.h> + +#include "monitor.h" + +#define DELLI8K_VOLUME_STEPSIZE 5 + +namespace KMilo { + + +/** + * KMilo plugin for Dell Laptops (conforming to the i8k driver) + */ +class DellI8kMonitor: public Monitor +{ + public: + DellI8kMonitor( QObject *parent, const char *name, const QStringList& ); + virtual ~DellI8kMonitor(); + + /** + * Reimplemented from KMilo::Monitor. + * Loads configuration. + */ + virtual bool init(); + + /** + * Reimplemented from KMilo::Monitor. + * Called by KMilo, this checks the /proc file system and acts on any changes + */ + virtual DisplayType poll(); + + /** + * Reimplemented from KMilo::Monitor. + * Called by KMilo if poll() returns a volume change. + * Returns the new volume percentage. + */ + virtual int progress() const; + + private: + + void setVolume( int volume ); + void setMute( bool b ); + DCOPRef *kmixClient; + DCOPRef *kmixWindow; + bool retrieveVolume(); + bool retrieveMute(); + int m_status, m_volume; + bool m_mute; + + int m_progress; + int m_fd; + + int fn_status( int fd ); +}; + +} //close namespace + +#endif diff --git a/kmilo/delli8k/i8k.h b/kmilo/delli8k/i8k.h new file mode 100644 index 0000000..1c45ba5 --- /dev/null +++ b/kmilo/delli8k/i8k.h @@ -0,0 +1,46 @@ +/* + * i8k.h -- Linux driver for accessing the SMM BIOS on Dell laptops + * + * Copyright (C) 2001 Massimo Dal Zotto <dz@debian.org> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#ifndef _LINUX_I8K_H +#define _LINUX_I8K_H + +#define I8K_PROC "/proc/i8k" +#define I8K_PROC_FMT "1.0" + +#define I8K_BIOS_VERSION _IOR ('i', 0x80, int) /* broken: meant 4 bytes */ +#define I8K_MACHINE_ID _IOR ('i', 0x81, int) /* broken: meant 16 bytes */ +#define I8K_POWER_STATUS _IOR ('i', 0x82, size_t) +#define I8K_FN_STATUS _IOR ('i', 0x83, size_t) +#define I8K_GET_TEMP _IOR ('i', 0x84, size_t) +#define I8K_GET_SPEED _IOWR('i', 0x85, size_t) +#define I8K_GET_FAN _IOWR('i', 0x86, size_t) +#define I8K_SET_FAN _IOWR('i', 0x87, size_t) + +#define I8K_FAN_LEFT 1 +#define I8K_FAN_RIGHT 0 +#define I8K_FAN_OFF 0 +#define I8K_FAN_LOW 1 +#define I8K_FAN_HIGH 2 +#define I8K_FAN_MAX I8K_FAN_HIGH + +#define I8K_VOL_UP 1 +#define I8K_VOL_DOWN 2 +#define I8K_VOL_MUTE 4 + +#define I8K_AC 1 +#define I8K_BATTERY 0 + +#endif diff --git a/kmilo/delli8k/kmilo_delli8k.desktop b/kmilo/delli8k/kmilo_delli8k.desktop new file mode 100644 index 0000000..4dd7c97 --- /dev/null +++ b/kmilo/delli8k/kmilo_delli8k.desktop @@ -0,0 +1,96 @@ +[Desktop Entry] +Type=Service +ServiceTypes=KMilo Plugin +X-KDE-ModuleType=Plugin +Name=Dell I8k Laptop Plugin +Name[ar]=ملحق حاسوب Dell I8k المحمول +Name[br]=Lugent hezoug Dell I8k +Name[bs]=Dodatak za Dell I8k laptope +Name[ca]=Connector per portàtils Dell I8k +Name[cs]=Dell I8k Laptop modul +Name[da]=Dell I8k bærbar plugin +Name[de]=Dell I8k Notebook-Plugin +Name[el]=Πρόσθετο φορητού Dell I8k +Name[es]=Extensión para el portátil Dell I8k +Name[et]=Dell I8k sülearvuti plugin +Name[eu]=Dell I8k Laptop Plugina +Name[fa]=Dell I8k وصلۀ رایانۀ کیفی +Name[fi]=Dell I8k -kannettavan liitännäinen +Name[fr]=Module externe pour les Dell I8k +Name[ga]=Breiseán Ríomhaire Glúine Dell I8k +Name[he]=תוסף למחשבי ברכיים בעלי Dell l8k +Name[hu]=Dell I8k modul +Name[is]=Dell I8k ferðatölvuíforrit +Name[it]=Plugin portatili Dell I8k +Name[ja]=Dell I8k ラップトップ プラグイン +Name[ka]=Dell I8k ლეპტოპის მოდული +Name[kk]=Dell I8k ноутбуктің модулі +Name[km]=កម្មវិធីជំនួយកុំព្យូទ័រយួរដៃ Dell I8k +Name[lt]=Dell I8k Laptop priedas +Name[nb]=Dell I8k Laptop tillegg +Name[nds]=Dell I8k-Klappreeknermoduul +Name[ne]=डेल I8k ल्यापटप प्लगइन +Name[nl]=Dell i8000 Laptop-plugin +Name[nn]=Programtillegg for Dell I8K-bærbare +Name[pa]=Dell I8k ਲੈਪਟਾਪ ਪਲੱਗਿੰਨ +Name[pl]=Wtyczka laptopa Dell I8k +Name[pt]='Plugin' para Portáteis Dell I8k +Name[pt_BR]=Plugin para Laptops Dell I8k +Name[ru]=Ноутбук Dell I8k +Name[sk]=Modul pre Dell l8k laptop +Name[sl]=Vstavek za prenosnik Dell I8k +Name[sr]=Прикључак за Dell-ове I8k лаптопе +Name[sr@Latn]=Priključak za Dell-ove I8k laptope +Name[sv]=Insticksprogram för Dell I8k bärbar dator +Name[ta]=டெல் 18கே மடிக்கணினி சொருகுப்பொருள் +Name[tr]=Dell I8k Laptop Eklentisi +Name[uk]=Втулок лептопа Dell I8k +Name[uz]=Dell I8k laptopi uchun plagin +Name[uz@cyrillic]=Dell I8k лаптопи учун плагин +Name[zh_CN]=Dell I8k 笔记本插件 +Name[zh_TW]=Dell I8k 筆記型電腦外掛程式 +Comment=Enables support for special Dell laptop keys +Comment[ar]=تمكّن الدعم لمفاتيح حاسوب Dell المحمول الخاصة +Comment[bg]=Тази приставка позволява поддръжката на специалните клавиши на Dell +Comment[bs]=Omogućuje podršku za posebne tipke na Dell laptopima +Comment[ca]=Habilita el funcionament per a tecles especials dels portàtils Dell +Comment[cs]=Umožňuje podporu speciálních kláves laptopů Dell +Comment[da]=Aktiverer støtte for specielle Dell bærbares taster +Comment[de]=Dieses Plugin aktiviert die Unterstützung für Sondertasten bei Dell-Notebook-Tastaturen +Comment[el]=Ενεργοποιεί την υποστήριξη για ειδικά πλήκτρα φορητού Dell +Comment[es]=Activa el soporte de las teclas especiales del portátil Dell +Comment[et]=Võimaldab kasutada Delli sülearvuti eriklahve +Comment[eu]=Dell eramangarrien tekla berezientzako euskarria gaitzen du +Comment[fa]=فعالسازی پشتیبانی برای کلیدهای ویژۀ رایانۀ کیفیDell +Comment[fi]=Tämä liitännäinen mahdollistaa erikoisnäppäinten tuen Dellin kannettaville tietokoneille. +Comment[fr]=Ce module active la gestion des touches spéciales des ordinateurs portables Dell +Comment[ga]=Tacaigh le heochracha speisialta ar ríomhairí glúine Dell +Comment[he]=מוסיף תמיכה בשביל מקשים מיוחדים של Dell +Comment[hu]=Ez a bővítőmodul lehetővé teszi a Dell noteszgépek speciális billentyűinek használatát +Comment[is]=Virkjar stuðning fyrir sérhnappa Dell ferðavéla +Comment[it]=Abilita il supporto per i tasti speciali dei portatili Dell +Comment[ja]=Dell ラップトップの特殊キーをサポートします +Comment[ka]=რთავს Dell-ის ლეპტოპის სპეციალური კლავიშების მხარდაჭერას +Comment[kk]=Dell ноутбуктің арнаулы пернелерін қолдауы +Comment[km]=បើកការគាំទ្រសម្រាប់គ្រាប់ចុចកុំព្យូទ័រយួរដៃ Dell +Comment[lt]=Įgalina specialų Dell nešiojamo kompiuterio raktų palaikymą +Comment[nb]=Muliggjør støtte for spesielle taster på Dell bærbare maskiner +Comment[nds]=Maakt de Sünnertasten-Ünnerstütten för Dell-Klappreekners an +Comment[ne]=विशेष डेल ल्यापटप कुञ्जीका लागि समर्थन सक्षम पार्दछ +Comment[nl]=Activeert de ondersteuning voor speciale Dell-laptop-toetsen +Comment[nn]=Dette programtillegget gjer det mogleg å bruka spesialtastar på Dell-bærbare +Comment[pl]=Włącza obsługę specjalnych klawiszy laptopa Dell +Comment[pt]=Activa o suporte a teclas especiais dos portáteis Dell +Comment[pt_BR]=Habilita suporte para teclas especiais nos laptops Dell +Comment[ru]=Этот модуль поддерживает специальные клавиши ноутбука Dell +Comment[sk]=Povoľuje podporu pre špeciálne klávesy Dell laptopu +Comment[sl]=Omogoči podporo posebnim tipkam prenosnikov Dell +Comment[sr]=Подршка за посебне тастере на Dell-овим лаптопима +Comment[sr@Latn]=Podrška za posebne tastere na Dell-ovim laptopima +Comment[sv]=Aktiverar stöd för speciella tangenter på Dell bärbar dator +Comment[ta]=விசேஷ டெல் மடிக்கணினி விசைகளுக்கான ஆதரவை செயல்படுத்துகிறது +Comment[tr]=Dell dizüstü bilgisayarların özel tuşları için desteği etkinleştirir +Comment[uk]=Уможливлює підтримку спеціальних клавіш для лептопа Dell +Comment[zh_CN]=此插件启用 Dell 笔记本的特殊按键 +Comment[zh_TW]=開啟 Dell 筆記型電腦特殊鍵支援 +X-KDE-Library=kmilo_delli8k |