diff options
Diffstat (limited to 'kmilo')
73 files changed, 7616 insertions, 0 deletions
diff --git a/kmilo/Makefile.am b/kmilo/Makefile.am new file mode 100644 index 0000000..9a0949a --- /dev/null +++ b/kmilo/Makefile.am @@ -0,0 +1,18 @@ +if include_kmilo_powerbook +POWERBOOK_SUBDIR=powerbook +endif + +if include_kmilo_pbb +POWERBOOK2_SUBDIR=powerbook2 +endif + +if include_kmilo_kvaio +KVAIO_SUBDIR=kmilo_kvaio +endif + +if include_kmilo_delli8k +KDELLI8k_SUBDIR=delli8k +endif + + +SUBDIRS=kmilod $(POWERBOOK_SUBDIR) $(POWERBOOK2_SUBDIR) $(KVAIO_SUBDIR) generic thinkpad asus $(KDELLI8k_SUBDIR) diff --git a/kmilo/README b/kmilo/README new file mode 100644 index 0000000..f05588f --- /dev/null +++ b/kmilo/README @@ -0,0 +1,17 @@ +This is a kded module that can be extended to support various types of hardware +input devices that exist, such as those on keyboards. + +It presently supports: +- Apple PowerBooks +- Sony Vaio Laptops (tested on Vaio PCG-GRX series) +- IBM Thinkpads +- Asus Laptops +- Dell laptops (see delli8k/README for models) + +The output device is skinnable, though not extensible by 3rd parties currently. +This will come in the future when the API is finalised. + +It also lacks very much functionality. Any input is appreciated. + +Header files are not presently installed in order to avoid committing to an API. + diff --git a/kmilo/TODO b/kmilo/TODO new file mode 100644 index 0000000..8a31d85 --- /dev/null +++ b/kmilo/TODO @@ -0,0 +1,7 @@ +- Configuration + +- Pluginify the skins + +- Support for more laptops, keyboards, etc. + +- Add a debug area diff --git a/kmilo/asus/Makefile.am b/kmilo/asus/Makefile.am new file mode 100644 index 0000000..39217c0 --- /dev/null +++ b/kmilo/asus/Makefile.am @@ -0,0 +1,37 @@ +# This file is part of the KDE project +# Copyright (C) 2003 George Staikos <staikos@kde.org> +# Copyright (C) 2004 Chris Howells <howells@kde.org> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. + +# You should have received a copy of the GNU Library General Public License +# along with this library; see the file COPYING.LIB. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +#SUBDIRS = . kcmthinkpad + +INCLUDES=-I$(srcdir)/../kmilod $(all_includes) + +kde_module_LTLIBRARIES = kmilo_asus.la + +kmilo_asus_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) +kmilo_asus_la_LIBADD = ../kmilod/libkmilo.la $(LIB_KIO) +kmilo_asus_la_SOURCES = asus.cpp +METASOURCES = AUTO + +noinst_HEADERS = asus.h + +services_DATA = kmilo_asus.desktop +servicesdir = $(kde_servicesdir)/kmilo + +messages: + $(XGETTEXT) $(asus_thinkpad_la_SOURCES) -o $(podir)/kmilo_asus.pot diff --git a/kmilo/asus/README b/kmilo/asus/README new file mode 100644 index 0000000..b375940 --- /dev/null +++ b/kmilo/asus/README @@ -0,0 +1,43 @@ +Asus Laptop plugin for KMilo + +Chris Howells <howells@kde.org> + +About +----- + +This KMilo module, in conjunction with the Asus asus_acpi Linux kernel +module, allows some of the special keys on the keyboard of an Asus laptop to +be fully utilised. + +The asus_acpi kernel modules exports a control and monitoring interface +using the Linux kernel's /proc psuedo file system. + +The /proc file system +--------------------- + +/proc/acpi/asus/brn - Sets/gets the brightness of the LCD backlight +Values between 0 (most dim) and 15 (most bright) + +/proc/acpi/asus/info - Shows information about the laptop + +/proc/acpi/asus/lcd - Sets/gets whether the LCD is on or off +Values of 0 or 1 + +/proc/acpi/asus/disp - Sets/gets whether the LCD/VGA/TV out is used +Values of +0 - no display +1 - LCD only +2 - CRT only +3 - LCD + CRT +4 - TV out only +5 - LCD + TV out +6 - CRT + TV out +7 - LCD + CRT + TV out + +Changes +------- + +Todo +---- +* Support lcd and disp stuff +* Maybe support volume stuff diff --git a/kmilo/asus/asus.cpp b/kmilo/asus/asus.cpp new file mode 100644 index 0000000..e1fbfa0 --- /dev/null +++ b/kmilo/asus/asus.cpp @@ -0,0 +1,213 @@ +/* + This file is part of the KDE project + + Copyright (c) 2004 Chris Howells <howells@kde.org> + Much code and ideas stolen from Jonathan Riddell's ThinkPad plugin + + 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; version + 2 of the License. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ + +#include <kgenericfactory.h> +#include <kconfig.h> +#include <krun.h> +#include <kurl.h> + +#include <qfile.h> +#include <qdir.h> + +#include "kmilointerface.h" + +#include "asus.h" + +#ifdef Q_OS_FREEBSD +#include <sys/types.h> +#include <sys/sysctl.h> +#endif + +#define ROUND(x) (int(x + 0.5)) + +namespace KMilo { + +AsusMonitor::AsusMonitor(QObject* parent, const char* name, const QStringList& args): Monitor(parent, name, args) +{ +} + +AsusMonitor::~AsusMonitor() +{ +} + +bool AsusMonitor::init() +{ + kdDebug() << "loading asus kmilo plugin" << endl; + +#ifdef Q_OS_FREEBSD + /* + * Check if the sysctls are in place by looking up their MIBs. + * Caching the MIBs results in a major speedup. + */ + size_t len = 4; + if ( sysctlnametomib("hw.acpi.asus.lcd_brightness", brightness_mib, &len) == -1 || + sysctlnametomib("hw.acpi.asus.lcd_backlight", backlight_mib, &len) == -1 || + sysctlnametomib("hw.acpi.asus.video_output", video_mib, &len) == -1 ) + { + kdDebug() << "The driver's sysctls don't seem to exist, check that the acpi_asus module is loaded" << endl; + return false; + } +#else + // we need to read the /proc file system and store the current values into a struct + QDir dir("/proc/acpi/asus"); + if (!dir.exists()) + { + kdDebug() << "/proc/acpi/asus doesn't exist, check that the asus_acpi module is loaded" << endl; + return false; + } +#endif + else + { + clearStruct(asus_state); + clearStruct(last_asus_state); + if (!readProc(&asus_state)) + { + return false; + } + } + + return true; +} + +Monitor::DisplayType AsusMonitor::poll() +{ + + // save last state and get new one + memcpy(&last_asus_state, &asus_state, sizeof(asus_state_struct)); + readProc(&asus_state); + + Monitor::DisplayType pollResult = None; + + if (last_asus_state.brightness != asus_state.brightness) + { + pollResult = Brightness; + float value = (float)asus_state.brightness / 15; + m_progress = ROUND(value * 100); + } + + /*if (last_asus_state.lcd != asus_state.lcd) + { + if (asus_state.lcd == 0) + { + _interface->displayText(i18n("Display changed: LCD off")); + } + else + { + _interface->displayText(i18n("Display changed: LCD on")); + } + }*/ + + if (last_asus_state.display != asus_state.display) + { + switch (asus_state.display) + { + case 0: + _interface->displayText(i18n("Display changed: off")); + break; + case 1: + _interface->displayText(i18n("Display changed: LCD on")); + break; + case 2: + _interface->displayText(i18n("Display changed: CRT on")); + break; + case 3: + _interface->displayText(i18n("Display changed: LCD and CRT on")); + break; + case 4: + _interface->displayText(i18n("Display changed: TV out on")); + break; + case 5: + _interface->displayText(i18n("Display changed: LCD and TV out on")); + break; + case 6: + _interface->displayText(i18n("Display changed: CRT and TV out on")); + break; + case 7: + _interface->displayText(i18n("Display changed: LCD, CRT and TV out on")); + break; + } + } + + return pollResult; +} + + +int AsusMonitor::progress() const +{ + return m_progress; +} + +bool AsusMonitor::readProc(asus_state_struct* asus_state) +{ +#ifdef Q_OS_FREEBSD + int value; + size_t value_len = sizeof(value); + + if ( sysctl(brightness_mib, 4, &value, &value_len, NULL, 0) != -1 ) + asus_state->brightness = value; + + if ( sysctl(backlight_mib, 4, &value, &value_len, NULL, 0) != -1 ) + asus_state->lcd = value; + + if ( sysctl(video_mib, 4, &value, &value_len, NULL, 0) != -1 ) + asus_state->display = value; +#else + asus_state->brightness = readProcEntry(QString("brn")); + //asus_state->lcd = readProcEntry(QString("lcd")); + //disabled because it does not yet work on my S5200N (asus_acpi bug) + //asus_state->display = readProcEntry(QString("disp")); + //FIXME +#endif + return true; +} + +int AsusMonitor::readProcEntry(const QString &name) +{ + QFile f(QString("/proc/acpi/asus/%1").arg(name).local8Bit()); + + if (f.open(IO_ReadOnly)) + { + QString line; + if (f.readLine(line, 1024) > 0) + { + line = line.stripWhiteSpace(); + int value = line.section(' ', 0, 0).toInt(); + if (value > 0) + { + return value; + } + } + } + return 0; +} + +void AsusMonitor::clearStruct(asus_state_struct& asus_state) +{ + asus_state.brightness = 0; + asus_state.lcd = 0; + asus_state.display = 0; +} + +} + +K_EXPORT_COMPONENT_FACTORY(kmilo_asus, KGenericFactory<KMilo::AsusMonitor>("kmilo_asus")) diff --git a/kmilo/asus/asus.h b/kmilo/asus/asus.h new file mode 100644 index 0000000..90361d8 --- /dev/null +++ b/kmilo/asus/asus.h @@ -0,0 +1,88 @@ +/* + This file is part of the KDE project + + Copyright (c) 2004 Chris Howells <howells@kde.org> + Much code and ideas stolen from Jonathan Riddell's ThinkPad plugin + + 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; version + 2 of the License. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ +#ifndef ASUS_H +#define ASUS_H + +#include <kapplication.h> +#include <dcopref.h> + +#include "monitor.h" + +namespace KMilo { + +typedef struct +{ + unsigned int brightness; + unsigned int lcd; + unsigned int display; +} asus_state_struct; + +/** + * KMilo plugin for Asus Laptops + */ +class AsusMonitor: public Monitor { + public: + AsusMonitor(QObject *parent, const char *name, const QStringList&); + virtual ~AsusMonitor(); + + /** + * 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 brightness change. + * Returns the new brightness percentage. + */ + virtual int progress() const; + + private: + + int m_progress; + + asus_state_struct last_asus_state; + asus_state_struct asus_state; + + bool readProc(asus_state_struct* ); + int readProcEntry(const QString &); + + void clearStruct(asus_state_struct& asus_state); + +#ifdef Q_OS_FREEBSD + int brightness_mib[4]; + int backlight_mib[4]; + int video_mib[4]; +#endif +}; + +} // close namespace + +#endif diff --git a/kmilo/asus/kmilo_asus.desktop b/kmilo/asus/kmilo_asus.desktop new file mode 100644 index 0000000..5e662bb --- /dev/null +++ b/kmilo/asus/kmilo_asus.desktop @@ -0,0 +1,97 @@ +[Desktop Entry] +Type=Service +ServiceTypes=KMilo Plugin +X-KDE-ModuleType=Plugin +Name=Asus Laptop Plugin +Name[ar]=ملحق حاسوب Asus المحمول +Name[br]=Lugent hezoug Asus +Name[bs]=Dodatak za Asus laptope +Name[ca]=Connector per portàtils Asus +Name[cs]=Asus Laptop modul +Name[da]=Asus bærbar plugin +Name[de]=Asus Notebook-Plugin +Name[el]=Πρόσθετο Sony Vaio +Name[es]=Extensión para el portátil Asus +Name[et]=Asuse sülearvuti plugin +Name[eu]=Asus Laptop plugina +Name[fa]=وصلۀ رایانۀ کیفی Asus +Name[fi]=Asus-kannettavan liitännäinen +Name[fr]=Module externe pour les portables Asus +Name[ga]=Breiseán Ríomhaire Glúine Asus +Name[he]=תוסף למחשבי ברכיים בעלי ASUS +Name[hu]=ASUS modul +Name[is]=Asus ferðatölvuíforrit +Name[it]=Plugin per portatili Asus +Name[ja]=Asus ラップトップ プラグイン +Name[ka]=Asus-ის ლეპტოპის მოდული +Name[kk]=Asus ноутбуктің модулі +Name[km]=កម្មវិធីជំនួយកុំព្យូទ័រយួរដៃ Asus +Name[lt]=Asus Laptop priedas +Name[nb]=Asus Laptop tillegg +Name[nds]=Asus-Klappreeknermoduul +Name[ne]=एसस ल्यापटप प्लगइन +Name[nl]=Asus Laptop-plugin +Name[nn]=Programtillegg for Asus-bærbare +Name[pa]=Asus ਲੈਪਟਾਪ ਪਲੱਗਿੰਨ +Name[pl]=Wtyczka laptopa Asus +Name[pt]='Plugin' para Portáteis Asus +Name[pt_BR]=Plugin para Laptops Asus +Name[ru]=Ноутбук Asus +Name[sk]=Modul pre Asus laptop +Name[sl]=Vstavek za prenosnik Asus +Name[sr]=Прикључак за Asus-ове лаптопе +Name[sr@Latn]=Priključak za Asus-ove laptope +Name[sv]=Insticksprogram för Asus bärbar dator +Name[ta]=Asus மடிக்கணினி சொருகுப்பொருள் +Name[tr]=Asus Dizüstü Bilgisayar Eklentisi +Name[uk]=Втулок лептопа Asus +Name[uz]=Asus laptopi uchun plagin +Name[uz@cyrillic]=Asus лаптопи учун плагин +Name[zh_CN]=华硕笔记本插件 +Name[zh_TW]=華碩筆記型電腦外掛程式 +Comment=Enables support for special Asus laptop keys +Comment[ar]=تمكّن الدعم لمفاتيح حاسوب Asus المحمول الخاصة +Comment[bg]=Тази приставка позволява поддръжката на специалните клавиши на Asus +Comment[bs]=Omogućuje podršku za posebne tipke na Asus laptopima +Comment[ca]=Habilita el funcionament per a tecles especials dels portàtils Asus +Comment[cs]=Umožňuje podporu speciálních kláves laptopů Asus +Comment[da]=Aktiverer støtte for specielle Asus bærbares taster +Comment[de]=Dieses Plugin aktiviert die Unterstützung für Sondertasten bei Asus-Tastaturen +Comment[el]=Ενεργοποιεί την υποστήριξη για ειδικά πλήκτρα φορητού Asus +Comment[es]=Activa el soporte de las teclas especiales del portátil Asus +Comment[et]=Võimaldab kasutada Asuse sülearvuti eriklahve +Comment[eu]=Asus eramangarrien tekla berezientzako euskarria gaitzen du +Comment[fa]=Asus فعالسازی پشتیبانی برای کلیدهای ویژۀ رایانۀ کیفی +Comment[fi]=Tämä liitännäinen mahdollistaa erikoisnäppäinten tuen Asus-merkkisille kannettaville tietokoneille. +Comment[fr]=Ce module active la gestion des touches spéciales des ordinateurs portables Asus +Comment[ga]=Tacaigh le heochracha speisialta ar ríomhairí glúine Asus +Comment[he]=מוסיף תמיכה בשביל מקשים מיוחדים של Asus +Comment[hu]=Ez a bővítőmodul lehetővé teszi az ASUS noteszgépek speciális billentyűinek használatát +Comment[is]=Virkjar stuðning fyrir sérhnappa Asus ferðavéla +Comment[it]=Abilita il supporto per i tasti speciali dei portatili Asus +Comment[ja]=Asus ラップトップの特殊キーをサポートします +Comment[ka]=რთავს Asus-ის ლეპტოპის სპეციალური კლავიშების მხარდაჭერას +Comment[kk]=Asus ноутбугінің арнаулы пернелерін қолдауы +Comment[km]=បើកការគាំទ្រគ្រាប់ចុចកុំព្យូទ័រយួរដៃ Asus ពិសេស +Comment[lt]=Įgalina specialų Asus laptop raktų palaikymą +Comment[nb]=Muliggjør støtte for spesielle taster på Asus maskiner +Comment[nds]=Maakt de Sünnertasten-Ünnerstütten för Asus-Klappreekners an +Comment[ne]=विशेष ल्यापटप कुञ्जीका लागि समर्थन सक्षम पार्दछ +Comment[nl]=Activeert de ondersteuning voor speciale Asus-laptop-toetsen +Comment[nn]=Dette programtillegget gjer det mogleg å bruka spesialtastar på Asus-bærbare +Comment[pa]=ਖਾਸ Asus ਲੈਪਟਾਪ ਸਵਿੱਚਾਂ ਲਈ ਖਾਸ ਸਹਿਯੋਗ +Comment[pl]=Włącza obsługę specjalnych klawiszy laptopa Asus +Comment[pt]=Activa o suporte a teclas especiais dos portáteis Asus +Comment[pt_BR]=Habilita suporte à teclas especiais dos laptops Asus +Comment[ru]=Этот модуль поддерживает специальные клавиши ноутбука Asus +Comment[sk]=Povoľuje podporu pre špeciálne klávesy Asus laptopu +Comment[sl]=Omogoči podporo posebnim tipkam prenosnikov Asus +Comment[sr]=Подршка за посебне тастере на Asus-овим лаптопима +Comment[sr@Latn]=Podrška za posebne tastere na Asus-ovim laptopima +Comment[sv]=Aktiverar stöd för speciella tangenter på Asus bärbar dator +Comment[ta]=விசேஷ ஆஸ்சஸ் மடிக்கணினி விசைகளுக்கான ஆதரவை செயல்படுத்துகிறது +Comment[tr]=Asus dizüstü bilgisayarlar için özel tuş desteğini etkinleştirir +Comment[uk]=Уможливлює підтримку спеціальних клавіш для лептопа Asus +Comment[zh_CN]=启用华硕笔记本的特殊按键 +Comment[zh_TW]=開啟華碩筆記型電腦特殊鍵支援 +X-KDE-Library=kmilo_asus diff --git a/kmilo/configure.in.in b/kmilo/configure.in.in new file mode 100644 index 0000000..048c5b3 --- /dev/null +++ b/kmilo/configure.in.in @@ -0,0 +1,60 @@ + +################################################################## +## +## KMilo configure script +## George Staikos <staikos@kde.org> +## +################################################################## + +dnl --------------------------------------------------------------------- +dnl PowerBook IPC Library + +AC_ARG_WITH(powerbook, + [AC_HELP_STRING(--with-powerbook, + [enable support for PPC PowerBook @<:@default=check@:>@])], + [], with_powerbook=check) + +have_pbbipc="" +have_pbb="" +if test "x$with_powerbook" != xno; then + +KDE_CHECK_LIB(pbbipc, create_msgport, +[ +KEYBOARD_LIBS="-lpbbipc $KEYBOARD_LIBS" +AC_DEFINE(HAVE_POWERBOOK, 1, [If we have Apple PowerBook support]) +have_pbbipc=true +]) + +KDE_CHECK_LIB(pbb, init_libpbb, +[ +KEYBOARD_LIBS="-lpbb $KEYBOARD_LIBS" +AC_DEFINE(HAVE_POWERBOOK, 1, [If we have Apple PowerBook support]) +have_pbb=true +]) + +if test "x$with_powerbook" != xcheck && test -z "$have_pbbipc$have_pbb"; then + AC_MSG_ERROR([--with-powerbook was given, but test for libpbb failed]) +fi +fi + +AM_CONDITIONAL(include_kmilo_powerbook, test x$have_pbbipc = xtrue) +AM_CONDITIONAL(include_kmilo_pbb, test x$have_pbb = xtrue) + +dnl ----------------------------------------------------------------------- +dnl Check if Dell I8K module should be compiled (Linux systems only) +AC_MSG_CHECKING([if dellI8k KMilo module should be compiled]) +case "$host" in + *-*-linux*) kmilo_delli8k_compile=yes; UNAME='Linux' ;; + *) kmilo_delli8k_compile=no; UNAME='' ;; +esac + +AC_MSG_RESULT($kmilo_delli8k_compile) +AM_CONDITIONAL(include_kmilo_delli8k, test x$kmilo_delli8k_compile = xyes) +dnl ----------------------------------------------------------------------- + + + +AC_CHECK_HEADER(linux/sonypi.h, [have_sonypi=true]) +AM_CONDITIONAL(include_kmilo_kvaio, test x$have_sonypi = xtrue) + +AC_SUBST(KEYBOARD_LIBS) 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 diff --git a/kmilo/demo/Makefile.am b/kmilo/demo/Makefile.am new file mode 100644 index 0000000..8ac7a46 --- /dev/null +++ b/kmilo/demo/Makefile.am @@ -0,0 +1,32 @@ +# This file is part of the KDE project +# Copyright (C) 2003 George Staikos <staikos@kde.org> + +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. + +# You should have received a copy of the GNU Library General Public License +# along with this library; see the file COPYING.LIB. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +INCLUDES=-I$(srcdir)/../kmilod $(all_includes) + +kde_module_LTLIBRARIES = kmilo_demo.la + +kmilo_demo_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) +kmilo_demo_la_LIBADD = ../kmilod/libkmilo.la $(LIB_KIO) +kmilo_demo_la_SOURCES = demo.cpp +METASOURCES = AUTO + +noinst_HEADERS = demo.h + +services_DATA = kmilo_demo.desktop +servicesdir = $(kde_servicesdir)/kmilo + diff --git a/kmilo/demo/demo.cpp b/kmilo/demo/demo.cpp new file mode 100644 index 0000000..668d137 --- /dev/null +++ b/kmilo/demo/demo.cpp @@ -0,0 +1,56 @@ +/* + This file is part of the KDE project + + Copyright (c) 2003 George Staikos <staikos@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ + +#include <kgenericfactory.h> + +#include "demo.h" + +namespace KMilo { + +Demo::Demo(QObject *parent, const char *name, const QStringList& args) +: Monitor(parent, name, args) { +} + + +Demo::~Demo() { +} + + +bool Demo::init() { +return true; +} + + +Monitor::DisplayType Demo::poll() { +Monitor::DisplayType rc = None; +return rc; +} + + +int Demo::progress() const { + return 10; +} + +}; + +K_EXPORT_COMPONENT_FACTORY(kmilo_demo, KGenericFactory<Demo>) + diff --git a/kmilo/demo/demo.h b/kmilo/demo/demo.h new file mode 100644 index 0000000..6f57cfc --- /dev/null +++ b/kmilo/demo/demo.h @@ -0,0 +1,39 @@ +/* + This file is part of the KDE project + + Copyright (c) 2003 George Staikos <staikos@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ +#ifndef _DEMO_H_ +#define _DEMO_H_ + +#include "monitor.h" + +class Demo : public KMilo::Monitor { + public: + Demo(QObject *parent, const char *name, const QStringList&); + virtual ~Demo(); + + virtual bool init(); + virtual DisplayType poll(); + virtual int progress() const; + + private: +}; + +#endif diff --git a/kmilo/demo/kmilo_demo.desktop b/kmilo/demo/kmilo_demo.desktop new file mode 100644 index 0000000..288903f --- /dev/null +++ b/kmilo/demo/kmilo_demo.desktop @@ -0,0 +1,110 @@ +[Desktop Entry] +Type=Service +ServiceTypes=KMilo Plugin +X-KDE-ModuleType=Plugin +Name=Demo Plugin +Name[ar]=ملحق للعرض +Name[bg]=Демонстрационна приставка +Name[ca]=Connector demo +Name[cy]=Ategyn Arddangosiad +Name[da]=Demo-plugin +Name[de]=Demo-Plugin +Name[el]=Πρόσθετο επίδειξης +Name[eo]=Demo-kromaĵo +Name[es]=Extensión de demostración +Name[et]=Demoplugin +Name[eu]=Demo Plugina +Name[fa]=وصلۀ Demo +Name[fi]=Esimerkkiliitännäinen +Name[fr]=Module externe de démonstration +Name[ga]=Breiseán Taispeána +Name[he]=תוסף לדוגמה +Name[hi]=डेमो प्लगइन +Name[hu]=Mintamodul +Name[is]=Sýnishorn af íforriti +Name[it]=Plugin dimostrativo +Name[ja]=デモプラグイン +Name[ka]=Demo მოდული +Name[kk]=Үлгілі модулі +Name[km]=កម្មវិធីជំនួយសាកល្បង +Name[lt]=Demo priedas +Name[mk]=Демо приклучок +Name[nb]=Programtillegg for demo +Name[nds]=Demo-Moduul +Name[ne]=डेमो प्लगइन +Name[nl]=Demo-plugin +Name[nn]=Demo-programtillegg +Name[pa]=ਫ਼ਰਜੀ ਪਲੱਗਿੰਨ +Name[pl]=Wtyczka demonstracyjna +Name[pt]='Plugin' de Demonstração +Name[pt_BR]=Plug-in de Demonstração +Name[ro]=Modul demonstrativ +Name[ru]=Демонстрационный модуль +Name[sk]=Testovací modul +Name[sl]=Demonstracijski vstavek +Name[sr]=Демонстрациони прикључак +Name[sr@Latn]=Demonstracioni priključak +Name[sv]=Demoinsticksprogram +Name[ta]= முன்னோட்ட சொருகி +Name[tg]=Модули Намоиш +Name[uk]=Демонстраційний втулок +Name[uz]=Demo plagini +Name[uz@cyrillic]=Демо плагини +Name[wa]=Tchôke-divins di mostraedje +Name[zh_CN]=演示插件 +Name[zh_TW]=示範用外掛程式 +Comment=This plugin does nothing. +Comment[ar]=لا يفعل هذا الملحق أى شئ.. +Comment[bg]=Тази приставка не прави нищо +Comment[bs]=Ovaj dodatak ne radi ništa. +Comment[ca]=Aquest connector no fa res. +Comment[cy]=Nid yw'r ategyn yma yn gwneud unrhyw beth. +Comment[da]=Dette plugin gør ingenting. +Comment[de]=Dieses Plugin macht nichts. +Comment[el]=Αυτό το πρόσθετο δεν κάνει τίποτα. +Comment[eo]=Tiu kromaĵo faras nenion. +Comment[es]=Esta extensión no hace nada. +Comment[et]=See plugin ei tee mitte kui midagi. +Comment[eu]=Plugin honek ez du ezer egiten. +Comment[fa]=این وصله کاری انجام نمیدهد. +Comment[fi]=Tämä liitännäinen ei tee mitään. +Comment[fr]=Ce module ne fait rien. +Comment[ga]=Ní dhéanann an breiseán seo faic. +Comment[he]=התוסף הזה לא עושה כלום +Comment[hi]=यह प्लगइन कुछ नहीं करता है. +Comment[hu]=Ez a bővítőmodul nem csinál semmit +Comment[is]=Þetta íforrit gerir ekki neitt. +Comment[it]=Questo plugin non fa niente +Comment[ja]=このプラグインは何もしません +Comment[ka]=ეს მოდული არაფერს არ აკეთებს +Comment[kk]=Бұл модуль ештеңе істемейді. +Comment[km]=កម្មវិធីជំនួយនេះមិនធ្វើអ្វី ។ +Comment[lt]=Šis priedas nieko nedaro. +Comment[mk]=Овој приклучок не прави ништо. +Comment[ms]=Plug masuk ini tidak melakukan apa-apa. +Comment[nb]=Dette programtillegget utfører ingen funksjoner +Comment[nds]=Dit Moduul deit nix. +Comment[ne]=यो प्लगइनले केही गर्दैन । +Comment[nl]=Deze plugin doet niets. +Comment[nn]=Dette programtillegget gjer ikkje noko som helst. +Comment[pa]=ਇਹ ਪਲੱਗਿੰਨ ਕੁਝ ਨਹੀਂ ਕਰਦੀ ਹੈ। +Comment[pl]=Ta wtyczka nic nie robi. +Comment[pt]=Este 'plugin' não faz nada. +Comment[pt_BR]=Este plug-in não faz coisa alguma. +Comment[ro]=Acest modul nu face nimic. +Comment[ru]=Этот модуль ничего не делает. +Comment[sk]=Tento modul nič nerobí. +Comment[sl]=Ta vstavek ne naredi ničesar. +Comment[sr]=Овај прикључак ништа не ради. +Comment[sr@Latn]=Ovaj priključak ništa ne radi. +Comment[sv]=Det här insticksprogrammet gör ingenting. +Comment[ta]= செருகுப்பொருள் செயல்படவில்லை. +Comment[tg]=Ин модул ҳеҷ чиз намекунад. +Comment[tr]=Bu plugin birşey yapmaz. +Comment[uk]=Цей втулок нічого не робить. +Comment[uz]=Bu plagin hech narsa bajarmaydi. +Comment[uz@cyrillic]=Бу плагин ҳеч нарса бажармайди. +Comment[wa]=Ci tchôke-divins chal ni fwait rén do tot. +Comment[zh_CN]=此插件不完成任何工作。 +Comment[zh_TW]=這個外掛程式不做任何事。 +X-KDE-Library=kmilo_demo diff --git a/kmilo/generic/Makefile.am b/kmilo/generic/Makefile.am new file mode 100644 index 0000000..1dd7094 --- /dev/null +++ b/kmilo/generic/Makefile.am @@ -0,0 +1,34 @@ +# This file is part of the KDE project +# Copyright (C) 2003 George Staikos <staikos@kde.org> + +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. + +# You should have received a copy of the GNU Library General Public License +# along with this library; see the file COPYING.LIB. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +INCLUDES=-I$(srcdir)/../kmilod $(all_includes) + +kde_module_LTLIBRARIES = kmilo_generic.la + +kmilo_generic_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) +kmilo_generic_la_LIBADD = ../kmilod/libkmilo.la $(LIB_KIO) +kmilo_generic_la_SOURCES = generic_monitor.cpp +METASOURCES = AUTO + +noinst_HEADERS = generic_monitor.h + +services_DATA = kmilo_generic.desktop +servicesdir = $(kde_servicesdir)/kmilo + +messages: + $(XGETTEXT) $(kmilo_generic_la_SOURCES) -o $(podir)/kmilo_generic.pot diff --git a/kmilo/generic/README b/kmilo/generic/README new file mode 100644 index 0000000..1727e8e --- /dev/null +++ b/kmilo/generic/README @@ -0,0 +1,38 @@ +This module provides support for the VolumeUp, VolumeDown and Mute Internet +keys found in many laptops and special keyboards. + +Please note that in order this module to work, mentioned special keys have to +generate appropriate X key symbols (keysyms), namely XF86AudioLowerVolume, +XF86AudioRaiseVolume, XF86AudioMute. You can use "xev" program to watch events +generated by X server and "xmodmap" program to assign events (keycodes) to +keysyms. Also watch kernel log (dmesg) for unknown scancodes. + +If you use CTRL in conjunction with volUp/Down it changes the volume by 1%, +otherwise by 10%. + +This module is now configurable (though with no configuration GUI), you can +change which channels (kmix device indexes) to change volume on, you can also +tweak volume changing steps. Channels are represented by numeric indexes +starting from zero, in order to get the right channel, you have to experiment +a little (keep the kmix mixer window open). ;) Examples: + +# Change "fast" step to 5% and "slow" step to 2%: +kwriteconfig --file kmilodrc --group "generic monitor" --key volumeStepFast 5 +kwriteconfig --file kmilodrc --group "generic monitor" --key volumeStepSlow 2 + +# Change channel to set volume on to 1 (use -1 to use kmix' master device): +kwriteconfig --file kmilodrc --group "generic monitor" --key volumeDeviceIdx 1 + +# You can also specify different mute channel (leave it unset or set it to -1 +# to use the same channel for muting and changing volume): +kwriteconfig --file kmilodrc --group "generic monitor" --key muteDeviceIdx 2 + +# KMilo now supports an extra channel, whose volume and mute will be set to +# whatever your primary channel is set to. (leave it unset or set it to -1 to +# disable this functionality): +kwriteconfig --file kmilodrc --group "generic monitor" --key extraDeviceIdx 5 + +# Use following call to apply these settings without restarting your session: +dcop kded kmilod reconfigure + +Have fun. diff --git a/kmilo/generic/generic_monitor.cpp b/kmilo/generic/generic_monitor.cpp new file mode 100644 index 0000000..40e7169 --- /dev/null +++ b/kmilo/generic/generic_monitor.cpp @@ -0,0 +1,324 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: t; tab-width: 2; -*- +/* + This file is part of the KDE project + + Copyright (c) 2003 Willi Richert <w.richert@gmx.net> + Pretty much ripped off from : + George Staikos <staikos@kde.org> :) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ + +#include <kgenericfactory.h> +#include <kdebug.h> +#include <kconfig.h> + +#include <sys/types.h> +#include <unistd.h> + +#include "generic_monitor.h" +#include "kmilointerface.h" +#include <qmessagebox.h> +#include <qfile.h> + +#define CONFIG_FILE "kmilodrc" + + +using namespace KMilo; + +GenericMonitor::GenericMonitor(QObject *parent, const char *name, const QStringList& args) +: Monitor(parent, name, args) +{ + _poll = false; + m_displayType = Monitor::None; + + m_mute = false; + m_progress = 0; + m_minVolume = 0; + m_maxVolume = 100; + m_volume = 50; +} + +GenericMonitor::~GenericMonitor() +{ + if(ga) { + ga->remove("FastVolumeUp"); + ga->remove("FastVolumeDown"); + ga->remove("SlowVolumeUp"); + ga->remove("SlowVolumeDown"); + ga->remove("Mute"); + delete ga; + } +} + +bool GenericMonitor::init() +{ + KConfig config(CONFIG_FILE); + reconfigure(&config); + + if(!m_enabled) + return false; // exit early if we are not supposed to run + + static const ShortcutInfo shortcuts[] = { + { "FastVolumeUp", Qt::Key_VolumeUp, SLOT(fastVolumeUp()) }, + { "FastVolumeDown", Qt::Key_VolumeDown, SLOT(fastVolumeDown()) }, + { "SlowVolumeUp", Qt::CTRL+Qt::Key_VolumeUp, SLOT(slowVolumeUp()) }, + { "SlowVolumeDown", Qt::CTRL+Qt::Key_VolumeDown, SLOT(slowVolumeDown()) }, + { "Mute", KShortcut("XF86AudioMute"), SLOT(mute()) } + }; + + ga = new KGlobalAccel(this, "miloGenericAccel"); + + ShortcutInfo si; + int len = (int)sizeof(shortcuts)/sizeof(ShortcutInfo); + for (int i = 0; i < len; i++) { + si = shortcuts[i]; + + ga->insert(si.name, QString::null, QString::null, + si.symbol, si.symbol, + this, + si.slot, false); + } + + ga->readSettings(); + ga->updateConnections(); + + kmixClient = new DCOPRef("kmix", "Mixer0"); + kmixWindow = new DCOPRef("kmix", "kmix-mainwindow#1"); + + return true; +} + +void GenericMonitor::reconfigure(KConfig *config) +{ + config->setGroup("generic monitor"); + + m_volumeDeviceIdx = config->readNumEntry("volumeDeviceIdx", -1); + m_muteDeviceIdx = config->readNumEntry("muteDeviceIdx", m_volumeDeviceIdx); + m_extraDeviceIdx = config->readNumEntry("extraDeviceIdx", -1); + m_volumeStepFast = config->readNumEntry("volumeStepFast", 10); + m_volumeStepSlow = config->readNumEntry("volumeStepSlow", 1); + m_enabled = config->readBoolEntry("enabled", true); +} + +bool GenericMonitor::retrieveKmixDevices() +{ + if(m_volumeDeviceIdx != -1 && m_muteDeviceIdx != -1) + return true; // both indexes already set + + DCOPReply reply = kmixClient->call("masterDeviceIndex"); + if (!reply.isValid()) + { // maybe the error occurred because kmix wasn't running + _interface->displayText(i18n("Starting KMix...")); + if (kapp->startServiceByDesktopName("kmix")==0) // trying to start kmix + { + reply = kmixClient->call("masterDeviceIndex"); + if (reply.isValid()) + kmixWindow->send("hide"); + } + } + + if (!reply.isValid()) + { + kdDebug() << "KMilo: GenericMonitor could not access kmix/Mixer0 via dcop" + << endl; + _interface->displayText(i18n("It seems that KMix is not running.")); + + return false; + } else { + if (m_volumeDeviceIdx == -1) + m_volumeDeviceIdx = reply; + if (m_muteDeviceIdx == -1) + m_muteDeviceIdx = m_volumeDeviceIdx; // this is the behaviour documented in README + return true; + } +} + +bool GenericMonitor::retrieveVolume() +{ + bool kmix_error = false; + + if(!retrieveKmixDevices()) + return false; + + DCOPReply reply = kmixClient->call("absoluteVolume", m_volumeDeviceIdx); + if (reply.isValid()) + m_volume = reply; + else + kmix_error = true; + + if (kmix_error) // maybe the error occurred because kmix wasn't running + { + _interface->displayText(i18n("Starting KMix...")); + if (kapp->startServiceByDesktopName("kmix")==0) // trying to start kmix + { + // trying again + reply = kmixClient->call("absoluteVolume", m_volumeDeviceIdx); + if (reply.isValid()) + { + m_volume = reply; + kmix_error = false; + kmixWindow->send("hide"); + } + } + } + + if (kmix_error) + { + kdDebug() << "KMilo: GenericMonitor could not access kmix/Mixer0 via dcop" + << endl; + _interface->displayText(i18n("It seems that KMix is not running.")); + + return false; + } else { + reply = kmixClient->call("absoluteVolumeMax", m_volumeDeviceIdx); + m_maxVolume = reply; + reply = kmixClient->call("absoluteVolumeMin", m_volumeDeviceIdx); + m_minVolume = reply; + return true; + } +} + +void GenericMonitor::volumeChange(int direction, int step) +{ + if (!retrieveVolume()) + return; + + /* Following snippet of code may seem to be overcomplicated, but it works for both devices with + * volume grain < 100 (32 tested) and devices with volume grain > 100 (256 tested) while preserving + * accuracy for devices with fine grain and preserving usability for devices with rough grain. */ + int userVisibleVolume = qRound(m_volume * 100.0 / (m_maxVolume - m_minVolume)); + userVisibleVolume += direction * step; // add requested volume step + long previousVolume = m_volume; + m_volume = qRound(m_minVolume + userVisibleVolume * (m_maxVolume - m_minVolume) / 100.0); + if (m_volume == previousVolume) // if the change was rounded to zero + m_volume += direction; + + if (m_volume > m_maxVolume) + m_volume = m_maxVolume; + if (m_volume < m_minVolume) + m_volume = m_minVolume; + + displayVolume(); +} + +void GenericMonitor::slowVolumeUp() { volumeChange( 1, m_volumeStepSlow); } +void GenericMonitor::slowVolumeDown() { volumeChange(-1, m_volumeStepSlow); } +void GenericMonitor::fastVolumeUp() { volumeChange( 1, m_volumeStepFast); } +void GenericMonitor::fastVolumeDown() { volumeChange(-1, m_volumeStepFast); } + +void GenericMonitor::displayVolume() +{ + _interface->displayProgress(i18n("Volume"), qRound(m_volume * 100.0 / (m_maxVolume - m_minVolume))); + + // If we got this far, the DCOP communication with kmix works, + // so we don't have to test the result. + // Also, device indexes are set to their proper values. + kmixClient->send("setAbsoluteVolume", m_volumeDeviceIdx, m_volume); + if(m_extraDeviceIdx != -1) + // for simplicity, use relative volume rather that absolute (extra precision is not needed here) + kmixClient->send("setVolume", m_extraDeviceIdx, qRound(m_volume * 100.0 / (m_maxVolume - m_minVolume))); + + // if mute then unmute + if (m_mute) + { + m_mute = false; + kmixClient->send("setMute", m_muteDeviceIdx, m_mute); + } +} + +bool GenericMonitor::retrieveMute() +{ + bool kmix_error = false; + + if(!retrieveKmixDevices()) + return false; + + DCOPReply reply = kmixClient->call("mute", m_muteDeviceIdx); + if (reply.isValid()) + m_mute = reply; + else + kmix_error = true; + + if (kmix_error) + { + // maybe the error occurred because kmix wasn't running + _interface->displayText(i18n("Starting KMix...")); + if (kapp->startServiceByDesktopName("kmix")==0) // trying to start kmix + { + // trying again + reply = kmixClient->call("mute", m_muteDeviceIdx); + if (reply.isValid()) + { + m_mute = reply; + kmix_error = false; + kmixWindow->send("hide"); + } + } else + { + kmixWindow->send("hide"); + kmix_error = true; + } + } + + if (kmix_error) + { + kdDebug() << "KMilo: GenericMonitor could not access kmix/Mixer0 via dcop" + << endl; + _interface->displayText(i18n("It seems that KMix is not running.")); + + return false; + } else { + return true; + } +} + +void GenericMonitor::mute() +{ + if (!retrieveMute()) + return; + + m_mute = !m_mute; + QString muteText; + if (m_mute) + { + muteText = i18n("Mute on"); + } else { + muteText = i18n("Mute off"); + } + + kmixClient->send("setMute", m_muteDeviceIdx, m_mute); + if(m_extraDeviceIdx != -1) + kmixClient->send("setMute", m_extraDeviceIdx, m_mute); + + _interface->displayText(muteText); +} + +int GenericMonitor::progress() const +{ + return m_progress; +} + +Monitor::DisplayType GenericMonitor::poll() +{ + return m_displayType; +} + + +K_EXPORT_COMPONENT_FACTORY(kmilo_generic, KGenericFactory<GenericMonitor>("kmilo_generic")) + +#include "generic_monitor.moc" diff --git a/kmilo/generic/generic_monitor.h b/kmilo/generic/generic_monitor.h new file mode 100644 index 0000000..c2477c4 --- /dev/null +++ b/kmilo/generic/generic_monitor.h @@ -0,0 +1,94 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: t; tab-width: 2; -*- +/* + This file is part of the KDE project + + Copyright (c) 2003 Willi Richert <w.richert@gmx.net> + Pretty much ripped of from : + George Staikos <staikos@kde.org> :) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ +#ifndef _GENERICMONITOR_H_ +#define _GENERICMONITOR_H_ + +#include <kmainwindow.h> +#include <kglobalaccel.h> +#include <dcopref.h> +#include <kapplication.h> + +#include "kmilod.h" +#include "monitor.h" + +namespace KMilo { + +// now the key data (from kkeyserver_x11.h and $QTDIR/include/qnamespace.h) +struct ShortcutInfo +{ + const char* name; + uint symbol; + const char *slot; +}; + + +class GenericMonitor : public Monitor +{ + Q_OBJECT + +public: + GenericMonitor(QObject *parent, const char *name, const QStringList&); + virtual ~GenericMonitor(); + + virtual bool init(); + virtual int progress() const; + virtual DisplayType poll(); + virtual void reconfigure(KConfig*); + +public slots: + void slowVolumeUp(); + void slowVolumeDown(); + void fastVolumeUp(); + void fastVolumeDown(); + void mute(); + +private: + bool retrieveKmixDevices(); + void volumeChange(int direction, int step); + bool retrieveMute(); + bool retrieveVolume(); + void displayVolume(); + + KGlobalAccel *ga; + + DCOPRef *kmixClient, *kmixWindow; + + int m_progress; + long m_volume; + bool m_mute; + + long m_maxVolume, m_minVolume; + + // following properties are read from config file: + int m_volumeStepFast, m_volumeStepSlow; + int m_volumeDeviceIdx, m_muteDeviceIdx, m_extraDeviceIdx; + bool m_enabled; + + Monitor::DisplayType m_displayType; +}; + +} + +#endif diff --git a/kmilo/generic/kmilo_generic.desktop b/kmilo/generic/kmilo_generic.desktop new file mode 100644 index 0000000..89d55d0 --- /dev/null +++ b/kmilo/generic/kmilo_generic.desktop @@ -0,0 +1,108 @@ +[Desktop Entry] +Type=Service +ServiceTypes=KMilo Plugin +X-KDE-ModuleType=Plugin +Name=Generic Keyboard Plugin +Name[ar]=ملحق عام للوحة المفاتيح +Name[bg]=Приставка за клавиатурата +Name[bs]=Opšti dodatak za tastaturu +Name[ca]=Connector de teclat genèric +Name[cs]=Obecný modul klávesnice +Name[cy]=Ategyn Bysellfwrdd Cyffredinol +Name[da]=Generisk tastatur-plugin +Name[de]=Allgemeines Tastatur-Plugin +Name[el]=Γενικευμένο πρόσθετο πληκτρολογίου +Name[eo]=Komuna klavar-kromprogramo +Name[es]=Extensión de teclado genérico +Name[et]=Tavaline klaviatuuriplugin +Name[eu]=Teklatu Arruntaren Plugina +Name[fa]=وصلۀ کلی صفحه کلید +Name[fi]=Yleinen näppäimistöliitännäinen +Name[fr]=Module externe de clavier générique +Name[ga]=Breiseán Cineálach Méarchláir +Name[he]=תוסף גנרי למקלדות +Name[hi]=जेनेरिक कुंजीपट प्लगइन +Name[hu]=Általános billentyűzet-bővítőmodul +Name[is]=Almennt lyklaborðsíforrit +Name[it]=Plugin tastiera generica +Name[ja]=一般キーボードプラグイン +Name[ka]=სტანდარტული კლავიატურა მოდული +Name[kk]=Негізгі пернетақта модулі +Name[km]=កម្មវិធីជំនួយក្តារចុចទូទៅ +Name[lt]=Bendro pobūdžio klaviatūros priedas +Name[mk]=Општ приклучок за тастатура +Name[nb]=Programtillegg for generisk tastatur +Name[nds]=Allgemeen Tastatuurmoduul +Name[ne]=जेनेरिक कुञ्जीपाटी प्लगइन +Name[nl]=Algemene toetsenbord-plugin +Name[nn]=Programtillegg for generisk tastatur +Name[pa]=ਸਧਾਰਨ ਕੀ-ਬੋਰਡ ਪਲੱਗਿੰਨ +Name[pl]=Wtyczka zwykłej klawiatury +Name[pt]='Plugin' de Teclado Genérico +Name[pt_BR]=Plug-in de Teclado Genérico +Name[ro]=Modul generic de tastatură +Name[ru]=Модуль клавиатуры +Name[sk]=Modul pre generickú klávesnicu +Name[sl]=Generični vstavek za tipkovnice +Name[sr]=Генерички прикључак тастатуре +Name[sr@Latn]=Generički priključak tastature +Name[sv]=Allmänt insticksprogram för tangentbord +Name[ta]= பொதுவான விசைப்பலகை சொருகுபொருள் +Name[tg]=Модули Умумии Забонак +Name[tr]=Generic Klavye Plugini +Name[uk]=Загальний втулок клавіатури +Name[uz]=Umumiy tugmatag plagini +Name[uz@cyrillic]=Умумий тугматаг плагини +Name[wa]=Tchôke-divins djenerike di taprece +Name[zh_CN]=常规键盘插件 +Name[zh_TW]=一般鍵盤外掛程式 +Comment=This plugin enables support for special keys on all sorts of keyboards and laptops. +Comment[ar]=تمكّن الدعم للمفاتيح الخاصة فى كل أنواع لوحات المفاتيح والحواسيب المحمولة. +Comment[bg]=Тази приставка позволява поддръжката на специалните клавиши на различните видове лаптопи и специални клавиатури +Comment[bs]=Ovaj dodatak (plugin) omogućuje podršku za posebne tipke na raznim vrstama tastatura i laptopa. +Comment[ca]=Aquest connector activa el funcionament per a tecles especials en tot tipus de teclats i portàtils. +Comment[cs]=Tento modul umožňuje používat zvláštní klávesy na všech typech klávesnic a notebooků. +Comment[cy]=Mae'r ategyn yn galluogi cynhaliaeth ar gyfer bysyll arbennig ar bob math o bysellfyrdd a gluniaduron. +Comment[da]=Dette plugin aktivere støtte for specielle taster på alle slags tastaturer og bærbare. +Comment[de]=Dieses Plugin aktiviert die Unterstützung für die Sondertasten diverser Tastaturen und Notebooks. +Comment[el]=Αυτό το πρόσθετο ενεργοποιεί την υποστήριξη για ειδικά πλήκτρα σε όλα τα είδη των πληκτρολογίων και φορητών υπολογιστών. +Comment[es]=Esta extensión activa el soporte de las teclas especiales en todo tipo de teclados y portátiles. +Comment[et]=See plugin võimaldab kasutada eriklahve igasugustel klaviatuuridel ja sülearvutitel. +Comment[eu]=Plugin honek tekla berezientzako euskarria gaitzen du teklatu eta magaleko mota guztietan. +Comment[fa]=این وصله، برای کلیدهای ویژه روی همۀ انواع صفحه کلید و رایانههای کیفی، پشتیبانی را فعال میسازد. +Comment[fi]=Tämä liitännäinen mahdollistaa erikoisnäppäinten tuen kaikenlaisille näppäimistöille ja kannettavilla tietokoneille. +Comment[fr]=Ce module active la gestion des touches spéciales pour toutes sortes de claviers et de portables. +Comment[ga]=Tacaíonn an breiseán seo le cnaipí speisialta ar neart sóirt méarchlár agus ríomhairí glúine. +Comment[he]=תוסף זה מאפשר את השימוש בכל המקשים המיוחדים במקלדת ומחשבים ניידים. +Comment[hi]=यह प्लगइन सभी क़िस्म के कुंजीपट तथा लैपटॉप पर विशिष्ट कुंजी समर्थन सक्षम करता है +Comment[hu]=Ez a bővítőmodul lehetővé teszi az extra billentyűk használatát speciális billentyűzeteknél és noteszgépeken. +Comment[is]=Þetta íforrit virkjar sérhnappana sem eru á allskynd gerðum lyklaborða og ferðavéla. +Comment[it]=Questo plugin abilita il supporto per i tasti speciali su qualsiasi tipo di tastiera e portatile. +Comment[ja]=このプラグインはあらゆる種類のキーボードとラップトップで特殊キーをサポートします +Comment[ka]=ეს მოდული რთავს ყველანაერი ტიპის კლავიატურების (მათ შორის ლეპტოპების) სპეციალური კლავიშების მხარდაჭერას. +Comment[kk]=Бұл модуль барлық пернетақталар мен ноутбуктердегі арнаулы пернелерді қолдайды. +Comment[km]=កម្មវិធីជំនួយនេះបើកការគាំទ្រ សម្រាប់គ្រាប់ចុចពិសេសនៅលើប្រភេទក្តារចុច និងកុំព្យូទ័រយួរដៃទាំងអស់ ។ +Comment[lt]=Šis priedas įgalina ypatingų klavišų palaikymą įvairių tipų klaviatūrose bei nešiojamuose kompiuteriuose. +Comment[mk]=Овој приклучок дава поддршка за специјалните копчиња на сите видови на тастатури и лаптопи. +Comment[nb]=Dette programtillegget muliggjør støtte for spesielle taster på alle tastatur og bærbare maskiner +Comment[nds]=Dit Moduul maakt de Sünnertasten-Ünnerstütten för all Oorden vun Tastaturen un Klappreekners an. +Comment[ne]=यो प्लगइनले कुञ्जीपाटी र ल्यापटपको सबै क्रमबद्धतामा विशेष कुञ्जीका लागि समर्थन सक्षम पार्दछ । +Comment[nl]=Deze plugin biedt ondersteuning voor allerlei speciale toetsen op laptops en gewone toetsenborden. +Comment[nn]=Dette programtillegget gjer det mogleg å bruka spesialtastar på alle tastatur og bærbare maskiner. +Comment[pl]=Ta wtyczka umożliwia używanie klawiszy specjalnych na wszystkich rodzajach klawiatur i laptopach. +Comment[pt]=Este 'plugin' activa o suporte para as teclas especiais em todos os tipos de teclados e portáteis. +Comment[pt_BR]=Este plug-in habilita suporte para teclas especiais em todos os tipos de laptops e teclados. +Comment[ro]=Acest modul activează suportul pentru tastele speciale de pe tot felul de tastaturi şi laptop-uri. +Comment[ru]=Этот модуль поддерживает специальные клавиши на всех типах клавиатур и ноутбуках. +Comment[sk]=Tento modul obsahuje podporu pre špeciálne klávesy na rôznych klávesniciach a prenosných počítačoch. +Comment[sl]=Ta vstavek omogoča podporo za posebne tipke na vseh vrstah tipkovnic in prenosnikov. +Comment[sr]=Овај прикључак омогућава подршку за специјалне тастере на свакаквим тастатурама и лаптоповима. +Comment[sr@Latn]=Ovaj priključak omogućava podršku za specijalne tastere na svakakvim tastaturama i laptopovima. +Comment[sv]=Det här insticksprogrammet aktiverar stöd för speciella tangenter för alla typer av tangentbord och bärbara datorer. +Comment[ta]=எல்லா அடுக்குகளிலும் உள்ள விசைபலகைகள் மற்றும் மடிக் கணினிகளின் விசேஷ விசைகளுக்கு இந்த சொருகு சாதனம் ஆதரவளிக்கிறது. +Comment[tg]=Ин модул пуштибонии калидҳои махсусро дар ҳамаи навъҳои забонакҳо ва компютерҳои дастӣ дармегиронад. +Comment[tr]=Bu plugin tüm klavye ve dizüstülerdeki özel tuşlar için desteği sağlar. +Comment[uk]=Цей втулок додає підтримку спеціальних клавіш для різних типів клавіатур та лептопів. +Comment[zh_CN]=此插件启用各种键盘和便携电脑的特殊按键。 +Comment[zh_TW]=這個外掛程式開啟所有鍵盤與筆記型電腦的特殊鍵支援。 +X-KDE-Library=kmilo_generic diff --git a/kmilo/kmilo_kvaio/Makefile.am b/kmilo/kmilo_kvaio/Makefile.am new file mode 100644 index 0000000..a711565 --- /dev/null +++ b/kmilo/kmilo_kvaio/Makefile.am @@ -0,0 +1,39 @@ +# This file is part of the KDE project +# Copyright (C) 2003 George Staikos <staikos@kde.org> + +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. + +# You should have received a copy of the GNU Library General Public License +# along with this library; see the file COPYING.LIB. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +SUBDIRS = . kcmkvaio + +INCLUDES=-I$(srcdir)/../kmilod $(all_includes) + +kde_module_LTLIBRARIES = kmilo_kvaio.la + +kmilo_kvaio_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) +kmilo_kvaio_la_LIBADD = ../kmilod/libkmilo.la $(LIB_KIO) -lXext -lXtst +kmilo_kvaio_la_SOURCES = kmilo_kvaio.cpp kvaiodriverinterface.cpp kvaio.cpp + +METASOURCES = AUTO + +KDE_OPTIONS = nofinal + +noinst_HEADERS = kmilo_kvaio.h kvaiodriverinterface.h kvaio.h + +services_DATA = kmilo_kvaio.desktop +servicesdir = $(kde_servicesdir)/kmilo + +messages: + $(XGETTEXT) $(kmilo_kvaio_la_SOURCES) -o $(podir)/kmilo_kvaio.pot diff --git a/kmilo/kmilo_kvaio/README.sonypi.h b/kmilo/kmilo_kvaio/README.sonypi.h new file mode 100644 index 0000000..5940b38 --- /dev/null +++ b/kmilo/kmilo_kvaio/README.sonypi.h @@ -0,0 +1,18 @@ +(C) 2003, 2004: Mirko Boehm <mirko@kde.org> +Licensed under the terms of the LGPL. + +This file explains the bad hack of copying the sonypi.h header file into this +directory: +----------------------------------------------------------------------------- + +Along with glibc, an outdated header snapshot is installed. The event +definitions in include/linux/sonypi.h in newer kernels differ too much from +it. Since the code shipped here depends on the proper event definitions, I +decided to ship a copy of a more up to date include file here. + +The solution is not optimal, but it works, and I try to keep the files in this +directory up to date. + +If somebody knows a better solution, please let me know at mirko@kde.org. + + diff --git a/kmilo/kmilo_kvaio/kcmkvaio/Makefile.am b/kmilo/kmilo_kvaio/kcmkvaio/Makefile.am new file mode 100644 index 0000000..6555b6c --- /dev/null +++ b/kmilo/kmilo_kvaio/kcmkvaio/Makefile.am @@ -0,0 +1,15 @@ +kde_module_LTLIBRARIES = kcm_kvaio.la + +kcm_kvaio_la_SOURCES = kcmkvaio_general.ui main.cpp + +kcm_kvaio_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) +kcm_kvaio_la_LIBADD = ../kvaiodriverinterface.lo $(LIB_KDEUI) + +INCLUDES= $(all_includes) + +kcm_kvaio_la_METASOURCES = AUTO + +messages: rc.cpp + $(XGETTEXT) *.cpp -o $(podir)/kcmkvaio.pot + +xdg_apps_DATA = kvaio.desktop diff --git a/kmilo/kmilo_kvaio/kcmkvaio/kcmkvaio_general.ui b/kmilo/kmilo_kvaio/kcmkvaio/kcmkvaio_general.ui new file mode 100644 index 0000000..ac376f3 --- /dev/null +++ b/kmilo/kmilo_kvaio/kcmkvaio/kcmkvaio_general.ui @@ -0,0 +1,273 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KCMKVaioGeneral</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KCMKVaioGeneral</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>536</width> + <height>226</height> + </rect> + </property> + <property name="caption"> + <string>KVaio: General Options</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>tlOff</cstring> + </property> + <property name="frameShape"> + <enum>NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>Plain</enum> + </property> + <property name="text"> + <string>Cannot find the <i>Sony Programmable Interrupt Controller</i>. If this is a Sony Vaio Laptop, make sure the <b>sonypi</b> driver module loads without failures.</string> + </property> + </widget> + <widget class="QFrame"> + <property name="name"> + <cstring>frameMain</cstring> + </property> + <property name="frameShape"> + <enum>NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>Plain</enum> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>bgBattery</cstring> + </property> + <property name="title"> + <string>System Power</string> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>mTLBattery</cstring> + </property> + <property name="text"> + <string>Remaining battery capacity:</string> + </property> + <property name="alignment"> + <set>AlignVCenter|AlignRight</set> + </property> + </widget> + <widget class="KProgress"> + <property name="name"> + <cstring>mKPBattery</cstring> + </property> + </widget> + <widget class="KLed"> + <property name="name"> + <cstring>kledAC</cstring> + </property> + <property name="state"> + <enum>Off</enum> + </property> + <property name="shape"> + <enum>Rectangular</enum> + </property> + <property name="color"> + <color> + <red>0</red> + <green>255</green> + <blue>0</blue> + </color> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>tlAC</cstring> + </property> + <property name="font"> + <font> + </font> + </property> + <property name="text"> + <string>AC</string> + </property> + <property name="alignment"> + <set>AlignVCenter|AlignLeft</set> + </property> + </widget> + <widget class="KLed"> + <property name="name"> + <cstring>kledBat1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="state"> + <enum>Off</enum> + </property> + <property name="shape"> + <enum>Rectangular</enum> + </property> + <property name="color"> + <color> + <red>255</red> + <green>255</green> + <blue>0</blue> + </color> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>tlBat1</cstring> + </property> + <property name="font"> + <font> + </font> + </property> + <property name="text"> + <string>Bat 1</string> + </property> + <property name="alignment"> + <set>AlignVCenter|AlignLeft</set> + </property> + </widget> + <widget class="KLed"> + <property name="name"> + <cstring>kledBat2</cstring> + </property> + <property name="state"> + <enum>Off</enum> + </property> + <property name="shape"> + <enum>Rectangular</enum> + </property> + <property name="look"> + <enum>Raised</enum> + </property> + <property name="color"> + <color> + <red>255</red> + <green>255</green> + <blue>0</blue> + </color> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>tlBat2</cstring> + </property> + <property name="font"> + <font> + </font> + </property> + <property name="text"> + <string>Bat 2</string> + </property> + <property name="alignment"> + <set>AlignVCenter|AlignLeft</set> + </property> + </widget> + </hbox> + </widget> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>bgGeneral</cstring> + </property> + <property name="title"> + <string>Other Options</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox"> + <property name="name"> + <cstring>mCbPowerMsgs</cstring> + </property> + <property name="text"> + <string>Periodically inform about battery and AC adapter status</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>mCbBackButtonMsg</cstring> + </property> + <property name="text"> + <string>Show battery and AC status on Back button press</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>cbReportUnknownEvents</cstring> + </property> + <property name="text"> + <string>Report unhandled events using On Screen Display</string> + </property> + </widget> + </vbox> + </widget> + </vbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>cbReportUnknownEvents</sender> + <signal>toggled(bool)</signal> + <receiver>KCMKVaioGeneral</receiver> + <slot>slotChanged()</slot> + </connection> + <connection> + <sender>mCbPowerMsgs</sender> + <signal>toggled(bool)</signal> + <receiver>KCMKVaioGeneral</receiver> + <slot>slotChanged()</slot> + </connection> + <connection> + <sender>mCbBackButtonMsg</sender> + <signal>toggled(bool)</signal> + <receiver>KCMKVaioGeneral</receiver> + <slot>slotChanged()</slot> + </connection> +</connections> +<includes> + <include location="local" impldecl="in implementation">kcmkvaio_general.ui.h</include> +</includes> +<signals> + <signal>changed();</signal> +</signals> +<slots> + <slot>slotChanged()</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/> +<includehints> + <includehint>kprogress.h</includehint> + <includehint>kled.h</includehint> + <includehint>kled.h</includehint> + <includehint>kled.h</includehint> +</includehints> +</UI> diff --git a/kmilo/kmilo_kvaio/kcmkvaio/kcmkvaio_general.ui.h b/kmilo/kmilo_kvaio/kcmkvaio/kcmkvaio_general.ui.h new file mode 100644 index 0000000..96d4938 --- /dev/null +++ b/kmilo/kmilo_kvaio/kcmkvaio/kcmkvaio_general.ui.h @@ -0,0 +1,15 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename functions or slots use +** Qt Designer which will update this file, preserving your code. Create an +** init() function in place of a constructor, and a destroy() function in +** place of a destructor. +*****************************************************************************/ +#include <kdialog.h> + +void KCMKVaioGeneral::slotChanged() +{ + emit(changed()); +} + diff --git a/kmilo/kmilo_kvaio/kcmkvaio/kvaio.desktop b/kmilo/kmilo_kvaio/kcmkvaio/kvaio.desktop new file mode 100644 index 0000000..12be7eb --- /dev/null +++ b/kmilo/kmilo_kvaio/kcmkvaio/kvaio.desktop @@ -0,0 +1,146 @@ +[Desktop Entry] +Type=Application +Exec=kcmshell kvaio +Icon=laptop +DocPath=kcontrol/kvaio/index.html + +X-KDE-Library=kvaio +X-KDE-ParentApp=kcontrol + +Name=Sony Vaio Laptop +Name[ar]=حاسوب سونى فايو المحمولة +Name[bg]=Лаптоп Sony Vaio +Name[br]=Hezoug Sony Vaio +Name[bs]=Sony Vaio laptop +Name[ca]=Portàtil Sony Vaio +Name[cs]=Sony Vaio notebook +Name[cy]=Gluniadur Sony Vaio +Name[da]=Sony Vaio bærbar +Name[de]=Sony Vaio Notebook +Name[el]=Φορητός υπολογιστής Sony Vaio +Name[es]=Portátil Sony Vaio +Name[et]=Sony Vaio sülearvuti +Name[eu]=Sony Vaio Magalekoa +Name[fa]=Sony Vaio رایانۀ کیفی +Name[fi]=Sony Vaio -liitännäinen +Name[fr]=Portable Vaio de Sony +Name[ga]=Ríomhaire Glúine Sony Vaio +Name[he]=מחשב ברכיים מסוג Sony Vaio +Name[hu]=Sony Vaio noteszgép +Name[is]=Sony Vaio kjöltutölva +Name[it]=Portatile Sony Vaio +Name[ja]=Sony Vaio ラップトップ +Name[kk]=Sony Vaio ноутбугі +Name[km]=កុំព្យូទ័រយួរដៃ Sony Vaio +Name[mk]=Лаптоп Sony Vaio +Name[nb]=Programtillegg for Sony Vaio +Name[nds]=Sony Vaio-Klappreekner +Name[ne]=सोनी भाइयो लयापटप +Name[nn]=Sony Vaio-bærbar +Name[pa]=Sony Vaio ਲੈਪਟਾਪ +Name[pl]=Wtyczka Sony Vaio +Name[pt]='Plugin' para o Sony Vaio +Name[pt_BR]=Laptop Sony Vaio +Name[ro]=Laptop Sony Vaio +Name[ru]=Ноутбук Sony Vaio +Name[sk]=Sony Vaio +Name[sl]=Prenosnik Sony Vaio +Name[sr]=Sony-јев Vaio лаптоп +Name[sr@Latn]=Sony-jev Vaio laptop +Name[sv]=Sony Vaio bärbar dator +Name[ta]=சோனி வையோ மடிக் கணிப்பொறி +Name[tr]=Sony Vaio Dizüstü +Name[uk]=Лептоп Sony Vaio +Name[uz]=Sony Vaio laptopi +Name[uz@cyrillic]=Sony Vaio лаптопи +Name[zh_CN]=索尼 Vaio 插件 +Name[zh_TW]=Sony Vaio 筆記型電腦 +Comment=Configure the KDE Interface to the Sony Programmable Interrupt Controller Driver +Comment[ar]=إعداد واجهة كدى لجهاز لمشغل التحكّم بالمقاطعة القابل للبرمجة من سونى +Comment[bg]=Настройване на Sony Programmable Interrupt Controller Driver +Comment[bs]=Podesite KDE interfejs za Sony Programmable Interrupt Controler drajver +Comment[ca]=Configura la interfície entre KDE i el controlador d'interrupcions programables Sony +Comment[cs]=Nastavení KDE rozhraní ovladače programovatelného řadiče přerušení Sony +Comment[cy]=Ffurfweddu'r Rhyngwyneb KDE i'r Gyrrydd Rheolydd Ymyriadau Rhaglenadwy Sony +Comment[da]=Indstil KDE's grænseflade til Sony's programmerbare Interrupt Controller Driver +Comment[de]=Einrichten der KDE-Schnittstelle zum "Sony Programmable Interrupt Controller" Treiber +Comment[el]=Ρυθμίστε το περιβάλλον χρήσης του KDE για τον Sony Programmable Interrupt Controller Driver +Comment[es]=Configurar la interfaz de KDE para el controlador programable de interrupciones de Sony +Comment[et]=KDE liides Sony programmeeritava katkestuskontrolleri draiveri seadistamiseks +Comment[eu]=Konfiguratu Sonyren Interrupzio Kontrolatzaile Programagarriaren Gidariarentzako KDE Interfazea +Comment[fa]=پیکربندی واسط KDE در گردانندۀ کنترلکنندۀ قابل برنامهریزی دارای وقفه +Comment[fi]=Aseta KDE:n liityntää Sonyn ohjelmoitavalle keskeytysajurille +Comment[fr]=Configuration de l'interface KDE pour le pilote du contrôleur d'interruption programmable de Sony +Comment[ga]=Cumraigh comhéadan KDE do Tiománaí an Rialtóir Idirbhriste Inríomhchláraithe Sony +Comment[hi]=केडीई इंटरफेस को सोनी प्रोग्रामेबल इंटरप्ट कन्ट्रोलर ड्राइवर के लिए कॉन्फ़िगर करता है +Comment[hu]=A Sony Vaio noteszgépek speciális kezelőelemeinek beállítása +Comment[is]=Stilla viðmót KDE á Sony Programmable Interrupt stýringuna +Comment[it]=Configura l'interfaccia KDE al driver del controller programmabile interrupt Sony +Comment[ja]=Sony Programmable Interrupt Controller Driver の KDE インターフェースを設定 +Comment[kk]=Sony бағдарламаулы үзілім контроллердің драйверінің KDE интерфейсін баптау +Comment[km]=កំណត់រចនាសម្ព័ន្ធចំណុចប្រទាក់ KDE ទៅកម្មវិធីបញ្ជា Sony Programmable Interrupt Controller +Comment[lt]=KDE sąsaja Sony Programmable Interrupt Controller Driver konfigūravimui +Comment[ms]= Selaraskan Antaramuka KDE untuk Pemacu Pengawal Gangguan Boleh Aturcara Sony +Comment[nb]=Sett opp KDE-grensesnitt til Sony Programmable Interrupt Controller Driver +Comment[nds]=KDE-Koppelsteedinstellen för den programmeerboren Interrupt-Controller-Driever vun Sony +Comment[ne]=सोनी कार्यक्रमयोग्य अवरोध नियन्त्रक ड्राइभरमा KDE इन्टरफेस कन्फिगर गर्नुहोस् +Comment[nl]=Voor het instellen van KDE's communicatie met het stuurprogramma van de Sony Programmeerbare Interrupt Controller +Comment[nn]=Set opp KDE-grensesnittet til Sony Programmable Interrupt Controller Driver +Comment[pl]=Konfigurujacja sterownika programowalnego kontrolora przerwań Sony w KDE +Comment[pt]=Configurar a Interface para o KDE do Controlador do Programmable Interrupt Controller da Sony +Comment[pt_BR]=Configura a Interface do KDE para o Driver Controlador de Interrupção Programável da Sony +Comment[ro]=Configurează interfaţa KDE către modulul Sony de control al întreruperilor +Comment[ru]=Настройка интерфейса KDE для драйвера программируемого контроллера прерываний Sony +Comment[sk]=Nastavenie rozhrania KDE k Sony Programmable Interrupt Controller Driver +Comment[sl]=Nastavite vmesnik KDE za gonilnik Sony Programmable Interrupt Controller +Comment[sr]=Подесите KDE-ов интерфејс за управљачки програм Sony-јевог програмабилног контролера прекида +Comment[sr@Latn]=Podesite KDE-ov interfejs za upravljački program Sony-jevog programabilnog kontrolera prekida +Comment[sv]=Anpassa KDE:s gränssnitt till Sonys drivrutin för programmerbar avbrottshantering +Comment[ta]=சோனி நிரல் தடங்கல் கட்டுப்பாட்டு சாதனத்துக்கு கேடிஇ இடைமுகத்தை வடிவமை +Comment[tg]=Танзимкунии Интерфейси KDE барои Гардонандаи Танзимкунандаи кандашавии барномавии Sony +Comment[tr]=KDE arayüzünü Sony Programlanabilir Kesilme Kontrolör Sürücüsüne ayarla +Comment[uk]=Налаштування інтерфейсу KDE до драйвера перепин Sony +Comment[zh_CN]=配置 KDE 界面使用索尼可编程中断控制器驱动程序 +Comment[zh_TW]=設定 Sony 可編程中斷控制器驅動程式的 KDE 介面 +Keywords=Sony, Vaio, kvaio, brightness, mute, Jog Dial +Keywords[ca]=Sony, Vaio, kvaio, brillantor, silenci, Jog Dial +Keywords[cs]=Sony,Vaio,kvaio,jas,ztlumení,Jog Dial +Keywords[cy]=Sony, Vaio, kvaio, gloywder, mud, Jog Dial +Keywords[da]=Sony, Vaio, kvaio, lysstyrke, stum, Jog Dial +Keywords[de]=Sony, Vaio, kvaio, brightness, mute, Jog Dial, stumm, hell, dunkel +Keywords[el]=Sony, Vaio, kvaio, φωτεινότητα, κλείσιμο ήχου, Jog Dial +Keywords[es]=Sony, Vaio, kvaio, brillo, mute, Jog Dial +Keywords[et]=Sony, Vaio, kvaio, heledus, tumm, Jog Dial +Keywords[eu]=Sony, Vaio, kvaio, distira, mutu, Jog Dial +Keywords[fa]=Sony،Vaio، kvaio، روشنایی، بدون صدا، Jog Dial +Keywords[fi]=Sony, Vaio, kvaio, kirkkaus, vaimenna, Jog Dial +Keywords[fr]=Sony, Vaio, kvaio, luminosité, sourdine, mute, Jog Dial +Keywords[ga]=Sony, Vaio, kvaio, gile, gan fuaim, Jog Dial +Keywords[hi]=सोनी,वायो,के-वायो,चमकीलापन,म्यूट,जॉग डायल +Keywords[hu]=Sony,Vaio,kvaio,fényerő,elnémítás,tárcsagomb +Keywords[it]=Sony,Vaio,kvaio,luminosità,muto,Jog Dial +Keywords[ja]=Sony, Vaio, kvaio, 明るさ, ミュート, ジョグダイアル +Keywords[mk]=Sony, Vaio, kvaio, brightness, mute, Jog Dial, Сони, осветленост, пригушување +Keywords[ms]= kecerahan,bisu,Sony, Vaio, kvaio, brightness, mute, Jog Dial +Keywords[nb]=Sony, Vaio, kvaio, lysstyrke, lydsperre, Jog Dial +Keywords[nds]=Sony, Vaio, kvaio, Helligkeit, stumm, Jog Dial +Keywords[ne]=सोनी, भाइयो, केभाइयो, चम्किलोपना, चुप लाग्नु, जोग डायल +Keywords[nl]=Sony,Vaio,kvaio,brightness,helderheid,mute,Jog Dial +Keywords[nn]=Sony,vaio,kvaio,lysstyrke,lydsperre,hjul +Keywords[pl]=Sony, Vaio, kvaio, jasność, Jog Dial,jog,jogdial +Keywords[pt]=Sony, Vaio, kvaio, brilho, sem som, Jog Dial +Keywords[pt_BR]=Sony, Vaio, kvaio,brilho, mudo, Jog Dial +Keywords[ro]=Sony,Vaio,kvaio,strălucire,fără sunet,jog dial +Keywords[ru]=Sony, Vaio, kvaio, brightness, mute, Jog Dial, яркость, звук +Keywords[sk]=Sony, Vaio, kvaio, jas, potichu, Jog Dial +Keywords[sl]=Sony, Vaio, kvaio, svetlost, tiho, Jog Dial +Keywords[sr]=Sony, Vaio, kvaio, brightness, mute, Jog Dial, светлина +Keywords[sr@Latn]=Sony, Vaio, kvaio, brightness, mute, Jog Dial, svetlina +Keywords[sv]=Sony, Vaio, kvaio, ljusstyrka, tyst, rullhjul +Keywords[ta]=சோனி, வையொ, வெளிச்சம்,சத்தமில்லாத,ஜோக் டயல் +Keywords[tg]=Sony, Vaio, kvaio, равшанӣ, хомӯшӣ, Jog Dial +Keywords[tr]=Sony, Vaio, kvaio, parlaklık, sessiz, gösterme itmesi +Keywords[uk]=Sony, Vaio, kvaio, яскравість, вимкнення звуку +Keywords[zh_CN]=Sony, Vaio, kvaio, brightness, mute, Jog Dial,索尼,亮度,静音 + +Categories=Qt;KDE;X-KDE-settings-system; diff --git a/kmilo/kmilo_kvaio/kcmkvaio/main.cpp b/kmilo/kmilo_kvaio/kcmkvaio/main.cpp new file mode 100644 index 0000000..ce27c94 --- /dev/null +++ b/kmilo/kmilo_kvaio/kcmkvaio/main.cpp @@ -0,0 +1,176 @@ +/* + * main.cpp + * + * Copyright (C) 2003 Mirko Boehm (mirko@kde.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 <qlabel.h> +#include <qlayout.h> +#include <qcheckbox.h> +#include <qtimer.h> +#include <qslider.h> + +#include <dcopclient.h> +#include <kgenericfactory.h> +#include <kaboutdata.h> +#include <kdebug.h> +#include <kconfig.h> +#include <kled.h> +#include <kprogress.h> + +#include "kcmkvaio_general.h" + +#include <dcopclient.h> + +#include "main.h" +#include "main.moc" + +typedef KGenericFactory<KVaioModule, QWidget> KVaioModuleFactory; +K_EXPORT_COMPONENT_FACTORY( kcm_kvaio, KVaioModuleFactory("kcmkvaio")) + +#define CONFIG_FILE "kmilodrc" + + +KVaioModule::KVaioModule(QWidget *parent, const char *name, const QStringList &) + : KCModule(KVaioModuleFactory::instance(), parent, name) +{ + KAboutData *about = + new KAboutData(I18N_NOOP("kcmkvaio"), + I18N_NOOP("KDE Control Module for Sony " + "Vaio Laptop Hardware"), + 0, 0, KAboutData::License_GPL, + "(c) 2003 Mirko Boehm"); + + about->addAuthor("Mirko Boehm", + I18N_NOOP("Original author"), + "mirko@kde.org"); + setAboutData( about ); + + QVBoxLayout *layout = new QVBoxLayout(this); + mKVaioGeneral = new KCMKVaioGeneral(this); + layout->addWidget( mKVaioGeneral ); + layout->addStretch(); + + mDriver = new KVaioDriverInterface(this); + mDriverAvailable = mDriver->connectToDriver(false); + mTimer = new QTimer(this); + mTimer->start(231); + + load(); + if (! mDriverAvailable) + { + mKVaioGeneral->tlOff->show(); + mKVaioGeneral->frameMain->setEnabled(false); + setButtons(buttons() & ~Default); + } else { + mKVaioGeneral->tlOff->hide(); + // mKVaioGeneral->frameMain->setEnabled (true); + } + + connect(mKVaioGeneral, SIGNAL(changed()), + SLOT(changed())); + connect(mTimer, SIGNAL(timeout()), SLOT(timeout())); + connect(mDriver, SIGNAL (vaioEvent(int)), SLOT (vaioEvent(int) ) ); +} + +void KVaioModule::save() +{ + if (! mDriverAvailable) return; + DCOPClient mClient; + + kdDebug() << "KVaioModule: saving." << endl; + KConfig config(CONFIG_FILE); + + config.setGroup("KVaio"); + + config.writeEntry("Report_Unknown_Events", + mKVaioGeneral->cbReportUnknownEvents->isChecked()); + config.writeEntry("PeriodicallyReportPowerStatus", + mKVaioGeneral->mCbPowerMsgs->isChecked() ); + config.writeEntry("PowerStatusOnBackButton", + mKVaioGeneral->mCbBackButtonMsg->isChecked() ); + config.sync(); + + if(mClient.attach()) + { + QByteArray data, replyData; + QCString replyType; + + if (!mClient.call("kded", "kmilod", "reconfigure()", + data, replyType, replyData)) + { + kdDebug() << "KVaio::showTextMsg: " + << "there was some error using DCOP." << endl; + } + } else { + kdDebug() << "KVaioModule: cannot attach to DCOP server, " + << "no automatic config update." << endl; + } +} + +void KVaioModule::load() +{ + load( false ); +} + +void KVaioModule::load(bool useDefaults) +{ + kdDebug() << "KVaioModule: loading." << endl; + KConfig config(CONFIG_FILE); + + config.setReadDefaults( useDefaults ); + + config.setGroup("KVaio"); + mKVaioGeneral->cbReportUnknownEvents->setChecked + (config.readBoolEntry("Report_Unknown_Events", false)); + mKVaioGeneral->mCbPowerMsgs->setChecked + (config.readBoolEntry("PeriodicallyReportPowerStatus", false) ); + mKVaioGeneral->mCbBackButtonMsg->setChecked + (config.readBoolEntry("PowerStatusOnBackButton", true) ); + + emit changed( useDefaults ); +} + +void KVaioModule::defaults() +{ + load( true ); +} + +void KVaioModule::timeout() +{ + bool bat1Avail = false, bat2Avail = false, acConnected = false; + int bat1Remaining = 0, bat1Max = 0, bat2Remaining = 0, bat2Max = 0; + + if(mDriver->getBatteryStatus(bat1Avail, bat1Remaining, bat1Max, + bat2Avail, bat2Remaining, bat2Max, + acConnected) ) + { + } + int remaining = (int)(100.0*(bat1Remaining+bat2Remaining) + / (bat1Max+bat2Max)); + mKVaioGeneral->mKPBattery->setValue(remaining); + mKVaioGeneral->kledBat1->setState(bat1Avail ? KLed::On : KLed::Off); + mKVaioGeneral->kledBat2->setState(bat2Avail ? KLed::On : KLed::Off); + mKVaioGeneral->kledAC->setState(acConnected ? KLed::On : KLed::Off); +} + +void KVaioModule::vaioEvent (int e) +{ + kdDebug () << "KVaioModule::vaioEvent: event: " << e << endl; +} + diff --git a/kmilo/kmilo_kvaio/kcmkvaio/main.h b/kmilo/kmilo_kvaio/kcmkvaio/main.h new file mode 100644 index 0000000..c19b648 --- /dev/null +++ b/kmilo/kmilo_kvaio/kcmkvaio/main.h @@ -0,0 +1,53 @@ +/* + * main.h + * + * Copyright (C) 2003 Mirko Boehm (mirko@kde.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 KCMKVAIO_MAIN_H +#define KCMKVAIO_MAIN_H + +#include <kcmodule.h> +#include "../kvaiodriverinterface.h" + +class QTimer; +class KCMKVaioGeneral; + +class KVaioModule : public KCModule +{ + Q_OBJECT + +public: + KVaioModule(QWidget *parent, const char *name, const QStringList &); + + void save(); + void load(); + void load(bool useDefaults); + void defaults(); + +protected slots: + void timeout(); + void vaioEvent (int); +private: + KCMKVaioGeneral *mKVaioGeneral; + KVaioDriverInterface *mDriver; + QTimer *mTimer; + bool mDriverAvailable; +}; + +#endif // KCMKVAIO_MAIN_H diff --git a/kmilo/kmilo_kvaio/kmilo_kvaio.cpp b/kmilo/kmilo_kvaio/kmilo_kvaio.cpp new file mode 100644 index 0000000..6389759 --- /dev/null +++ b/kmilo/kmilo_kvaio/kmilo_kvaio.cpp @@ -0,0 +1,68 @@ +/* -*- C++ -*- + + This file implements the KVaio module for KMilo. + + $ Author: Mirko Boehm $ + $ Copyright: (C) 1996-2003, Mirko Boehm $ + $ Contact: mirko@kde.org + http://www.kde.org + http://www.hackerbuero.org $ + $ License: LGPL with the following explicit clarification: + This code may be linked against any version of the Qt toolkit + from Troll Tech, Norway. $ + + $Id$ + + * Portions of this code are + * (C) 2001-2002 Stelian Pop <stelian@popies.net> and + * (C) 2001-2002 Alcove <www.alcove.com>. + * Thanks to Stelian for the implementation of the sonypi driver. +*/ + +#include <kgenericfactory.h> + +#include "monitor.h" +#include "kmilo_kvaio.h" +#include "kvaio.h" +#include "kmilointerface.h" + +KMiloKVaio::KMiloKVaio(QObject *parent, const char *name, + const QStringList& args) + : Monitor(parent, name, args), + m_kvaio(0) +{ + _poll = false; + m_displayType = (Monitor::DisplayType)None ; +} + + +KMiloKVaio::~KMiloKVaio() { +} + + +bool KMiloKVaio::init() +{ + m_kvaio = new KVaio(this); + + return m_kvaio->driver()!=0; +} + + +KMilo::Monitor::DisplayType KMiloKVaio::poll() { +// Monitor::DisplayType rc = (Monitor::DisplayType)None; +// return rc; + return m_displayType; +} + + +int KMiloKVaio::progress() const { + return m_kvaio->progress(); +} + +void KMiloKVaio::reconfigure(KConfig* k) +{ + m_kvaio->loadConfiguration(k); +} + +K_EXPORT_COMPONENT_FACTORY(kmilo_kvaio, KGenericFactory<KMiloKVaio>("kmilo_kvaio")) + diff --git a/kmilo/kmilo_kvaio/kmilo_kvaio.desktop b/kmilo/kmilo_kvaio/kmilo_kvaio.desktop new file mode 100644 index 0000000..5539734 --- /dev/null +++ b/kmilo/kmilo_kvaio/kmilo_kvaio.desktop @@ -0,0 +1,106 @@ +[Desktop Entry] +Type=Service +ServiceTypes=KMilo Plugin +X-KDE-ModuleType=Plugin +Name=Sony Vaio Plugin +Name[ar]=ملحق سونى فايوة +Name[br]=Lugent an hezoug Sony Vaio +Name[bs]=Sony Vaio dodatak +Name[ca]=Connector Sony Vaio +Name[cs]=Sony Vaio modul +Name[cy]=Ategyn Sony Vaio +Name[da]=Sony Vaio plugin +Name[el]=Πρόσθετο Sony Vaio +Name[es]=Extensión para Sony Vaio +Name[et]=Sony Vaio plugin +Name[eu]=Sony Vaio Plugina +Name[fa]=وصلۀ Sony Vaio +Name[fi]=Sony Vaio -liitännäinen +Name[fr]=Module externe pour les Vaio de Sony +Name[ga]=Breiseán Sony Vaio +Name[he]=תוסף ל-Sony Vaio +Name[hi]=सोनी वायो प्लगइन +Name[hu]=Sony Vaio bővítőmodul +Name[is]=Sony Vaio íforrit +Name[it]=Plugin per Sony Vaio +Name[ja]=Sony Vaio プラグイン +Name[ka]=Sony Vaio მოდული +Name[kk]=Sony Vaio модулі +Name[km]=កម្មវិធីជំនួយ Sony Vaio +Name[lt]=Sony Vaio priedas +Name[mk]=Приклучок за Sony Vaio +Name[nb]=Programtillegg for Sony Vaio +Name[nds]=Sony Vaio-Moduul +Name[ne]=सोनी भाइयो प्लगइन +Name[nl]=Sony Vaio-plugin +Name[nn]=Tilleggsprogram for Sony Vaio +Name[pa]=Sony Vaio ਪਲੱਗਿੰਨ +Name[pl]=Wtyczka Sony Vaio +Name[pt]='Plugin' para o Sony Vaio +Name[pt_BR]=Plugin do Sony Vaio +Name[ro]=Modul Sony Vaio +Name[ru]=Модуль Sony Vaio +Name[sk]=Modul pre Sony Vaio +Name[sl]=Vstavek za Sony Vaio +Name[sr]=Прикључак за Sony-јев Vaio +Name[sr@Latn]=Priključak za Sony-jev Vaio +Name[sv]=Sony Vaio-insticksprogram +Name[ta]=சோனி வையோ சொருகு சாதனம் +Name[tg]=Модули Sony Vaio +Name[tr]=Sony Vaio Eklentisi +Name[uk]=Втулок Sony Vaio +Name[uz]=Sony Vaio plagini +Name[uz@cyrillic]=Sony Vaio плагини +Name[wa]=Tchôke-divins Sony Vaio +Name[zh_CN]=索尼 Vaio 插件 +Name[zh_TW]=Sony Vaio 外掛程式 +Comment=KMilo Module for Sony Vaio Laptop support +Comment[ar]=وحدة KMilo لدعم حاسوب سونى فايو المحمول +Comment[bg]=Модул за поддръжка на KMilo за лаптопи Sony Vaio +Comment[bs]=KMilo modul za podršku za Sony Vaio laptope +Comment[ca]=Mòdul KMilo per funcionar amb portàtils Sony Vaio +Comment[cs]=KMilo modul pro podporu notebooků Sony Vaio +Comment[cy]=Cynhaliaeth Modiwl KMilo ar gyfer Gluniadur Sony Vaio +Comment[da]=KMilo Modul for understøttelse af Sony Vaio bærbare +Comment[de]=KMilo-Modul für Sony Vaio Notebook-Unterstützung +Comment[el]=Πρόσθετο KMilo για υποστήριξη του φορητού Sony Vaio +Comment[es]=Módulo KMilo para el soporte del portátil Sony Vaio +Comment[et]=KMilo moodul Sony Vaio sülearvuti toega +Comment[eu]=KMilo Moduloa Sony Vaio Magalekoen euskarriarentzako +Comment[fa]=پیمانۀ KMilo برای پشتیبانی رایانۀ کیفی Sony Vaio +Comment[fi]=KMilo-moduuli Sony Vaio -kannettavatuelle +Comment[fr]=Module KMilo pour la gestion des portables Vaio de Sony +Comment[ga]=Modúl KMilo a thacaíonn le Sony Vaio +Comment[he]=KMilo מודול לתמיכה במחשב הברכיים Vaio של Sony +Comment[hi]=सोनी वायो लेपटॉप समर्थन के लिए के-मिलो मॉड्यूल +Comment[hu]=KMilo beállítómodul Sony Vaio noteszgépek beállításához +Comment[is]=KMilo eining fyrir Sony Vaio kjöltutölvur +Comment[it]=Modulo di KMilo per il supporto dei portatili Sony Vaio +Comment[ja]=Sony Vaio ラップトップをサポートする KMilo モジュール +Comment[ka]=Sony Vaio ლეპტოპის მხარდამჭერი KMilo მოდული +Comment[kk]=Sony Vaio ноутбукті қолдау KMilo модулі +Comment[km]=ម៉ូឌុល KMilo សម្រាប់ការគាំទ្រកុំព្យូទ័រយួរដៃ Sony Vaio +Comment[lt]=KMilo modulis Sony Vaio Laptop palaikymui +Comment[mk]=Модул од KMilo за поддршка за лаптопот Sony Vaio +Comment[nb]=KMilo modul for Sony Vaio bærbar maskin +Comment[nds]=KMilo-Moduul för Sony-Vaio-Klappreeknerünnerstütten +Comment[ne]=सोनी भाइयो ल्यापटप समर्थनका लागि केमिलो मोड्युल +Comment[nl]=KMilo-module met ondersteuning voor de Sony Vaio laptop +Comment[nn]=KMilo-modul for Sony Vaio bærbar maskin +Comment[pl]=Moduł KMilo do obsługi laptopów Sony Vaio +Comment[pt]=Módulo do KMilo para o suporte do portátil Vaio da Sony +Comment[pt_BR]= Módulo para o suporte ao Sony Vaio +Comment[ro]=Modul KMilo pentru suport laptop Sony Vaio +Comment[ru]=Модуль KMilo для ноутбуков Sony Vaio +Comment[sk]=Module pre podporu Sony Vaio pre KMilo +Comment[sl]=Modul KMilo za podporo prenosniku Sony Vaio +Comment[sr]=KMilo, модул за подршку Sony-јевог Vaio лаптопа +Comment[sr@Latn]=KMilo, modul za podršku Sony-jevog Vaio laptopa +Comment[sv]=Kmilo-modul för stöd av bärbar Sony Vaio-dator +Comment[ta]=சோனி வையோ மடிக் கணினி ஆதரவுக்கான கேமிலோ கூறு +Comment[tg]=Модули KMilo барои пуштибонии Компютери дастии Sony Vaio +Comment[tr]=Sony Vaio Dizüstüler için KMilo Modül desteği +Comment[uk]=Модуль KMilo, що додає підтримку лептопів Sony Vaio +Comment[zh_CN]=索尼 Vaio 便携电脑支持的 KMilo 模块 +Comment[zh_TW]=支援 Sony Vaio 筆記型電腦的 KMilo 模組 +X-KDE-Library=kmilo_kvaio diff --git a/kmilo/kmilo_kvaio/kmilo_kvaio.h b/kmilo/kmilo_kvaio/kmilo_kvaio.h new file mode 100644 index 0000000..fccd7e9 --- /dev/null +++ b/kmilo/kmilo_kvaio/kmilo_kvaio.h @@ -0,0 +1,66 @@ +/* -*- C++ -*- + + This file declares the KVaio module for KMilo. + + $ Author: Mirko Boehm $ + $ Copyright: (C) 1996-2003, Mirko Boehm $ + $ Contact: mirko@kde.org + http://www.kde.org + http://www.hackerbuero.org $ + $ License: LGPL with the following explicit clarification: + This code may be linked against any version of the Qt toolkit + from Troll Tech, Norway. $ + + $Id$ + + * Portions of this code are + * (C) 2001-2002 Stelian Pop <stelian@popies.net> and + * (C) 2001-2002 Alcove <www.alcove.com>. + * Thanks to Stelian for the implementation of the sonypi driver. +*/ + +#ifndef _KMILO_KVAIO_H_ +#define _KMILO_KVAIO_H_ + +#include <kmainwindow.h> +#include <kglobalaccel.h> +#include <dcopref.h> +#include <kapplication.h> + +#include "kmilod.h" +#include "monitor.h" +#include "kmilointerface.h" + +class KVaio; + +class KMiloKVaio : public KMilo::Monitor { +// Q_OBJECT + + public: + KMiloKVaio(QObject *parent, + const char *name, const QStringList&); + virtual ~KMiloKVaio(); + + virtual bool init(); + virtual DisplayType poll(); + virtual int progress() const; + + virtual void reconfigure(KConfig*); + + + bool showTextMsg(const QString& msg) { + _interface->displayText(msg); + return true; + } + bool showProgressMsg(const QString& msg, int progress) { + _interface->displayProgress(msg,progress); + return true; + } + + private: + KVaio *m_kvaio; + Monitor::DisplayType m_displayType; +}; + + +#endif diff --git a/kmilo/kmilo_kvaio/kvaio.cpp b/kmilo/kmilo_kvaio/kvaio.cpp new file mode 100644 index 0000000..8a02098 --- /dev/null +++ b/kmilo/kmilo_kvaio/kvaio.cpp @@ -0,0 +1,606 @@ +/* -*- C++ -*- + + This file implements the KVaio class. + + $ Author: Mirko Boehm $ + $ Copyright: (C) 1996-2003, Mirko Boehm $ + $ Contact: mirko@kde.org + http://www.kde.org + http://www.hackerbuero.org $ + $ License: LGPL with the following explicit clarification: + This code may be linked against any version of the Qt toolkit + from Troll Tech, Norway. $ + + $Id$ + + * Portions of this code are + * (C) 2001-2002 Stelian Pop <stelian@popies.net> and + * (C) 2001-2002 Alcove <www.alcove.com>. + * Thanks to Stelian for the implementation of the sonypi driver. + + * Modified by Toan Nguyen <nguyenthetoan@gmail.com> + * to include support for + * Fn+F2,F3,F4 (Volume) + * Fn+F5,F6 (Brightness) + * Fn+F1 (blankscreen) + * Fn+F12 (suspend to disk) +*/ + +#include <kconfig.h> + +#include "kvaio.h" +#include "kmilointerface.h" + +#include <qlabel.h> +#include <qcstring.h> +#include <qevent.h> +#include <qdatastream.h> +#include <kmainwindow.h> +#include <klocale.h> +#include <kdebug.h> +#include <kdialogbase.h> +#include <dcopclient.h> +#include <kapplication.h> + +extern "C" { +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/ioctl.h> +#include <getopt.h> +#include <errno.h> + +#include "./sonypi.h" +} + + +KVaio::KVaio(KMiloKVaio *parent, const char* name) + : QObject(parent, name), + mDisp(0), + mTimer (new QTimer (this) ) +{ + myparent = parent; + + mDriver = new KVaioDriverInterface(this); + + if(!mDriver->connectToDriver()) + { + delete mDriver; mDriver = 0L; + kdDebug() << "KVaio: Cannot connect to driver." << endl; + } else { + kdDebug() << "KVaio: Connected to SonyPI driver." << endl; + connect(mDriver, SIGNAL(vaioEvent(int)), SLOT(slotVaioEvent(int))); + connect (mTimer, SIGNAL (timeout ()), SLOT (slotTimeout() ) ); + mTimer->start (10000, true); + } + + mDisp = XOpenDisplay(NULL); + if(!mDisp) + { + kdDebug() << "KVaio ctor: Failed to open display. Very strange." + << endl; + } + + if(!mClient.attach()) + { + kdDebug() << "KVaio ctor: cannot attach to DCOP server." << endl; + } + + KConfig config("kmilodrc"); + + loadConfiguration(&config); + + m_mute = false; + m_progress = 0; + m_minVolume = 0; + m_maxVolume = 100; + m_volume = 50; + + m_VolumeStep = 10; + + m_brightness = 128; + m_minBright = 0; + m_maxBright = 255; + m_BrightnessStep = 16; + + kmixClient = new DCOPRef("kmix", "Mixer0"); + kmixWindow = new DCOPRef("kmix", "kmix-mainwindow#1"); +// retrieveVolume(); +// retrieveMute(); + +} + +KVaio::~KVaio() +{ + kdDebug() << "KVaio dtor: shutting down." << endl; + if(mDriver!=0) + { + mDriver->disconnectFromDriver(); + } + if(mClient.isAttached()) + { + mClient.detach(); + } +} + +void KVaio::slotVaioEvent(int event) +{ + QString text; + QTextStream stream(text, IO_WriteOnly); + + switch(event) + { + case SONYPI_EVENT_FNKEY_RELEASED: + break; + case SONYPI_EVENT_FNKEY_F1: + blankScreen(); + break; + case SONYPI_EVENT_FNKEY_F2: + mute(); + break; + case SONYPI_EVENT_FNKEY_F3: + VolumeDown(m_VolumeStep); + break; + case SONYPI_EVENT_FNKEY_F4: + VolumeUp(m_VolumeStep); + break; + case SONYPI_EVENT_FNKEY_F5: + BrightnessDown(m_BrightnessStep); + break; + case SONYPI_EVENT_FNKEY_F6: + BrightnessUp(m_BrightnessStep); + break; + case SONYPI_EVENT_FNKEY_F12: + suspendToDisk(); + break; + case SONYPI_EVENT_MEMORYSTICK_INSERT: + showTextMsg( i18n ("Memory Stick inserted") ); + break; + case SONYPI_EVENT_MEMORYSTICK_EJECT: + showTextMsg( i18n ("Memory Stick ejected") ); + break; + case SONYPI_EVENT_BACK_PRESSED: + if (mShowPowerStatusOnBackButton) + { + showBatteryStatus (true); + } + break; + default: + stream << i18n("Unhandled event: ") << event; + if(mReportUnknownEvents) showTextMsg(text); + kdDebug() << "KVaio::slotVaioEvent: event not handled." + << endl; + } +} + +bool KVaio::showTextMsg(const QString& msg) +{ + return myparent->showTextMsg(msg); +} + + + +bool KVaio::showProgressMsg(const QString& msg, int value) +{ + m_progress = value; + return myparent->showProgressMsg(msg,value); +} + +void KVaio::blankScreen() +{ + bool blankonly; + + if (isKScreensaverAvailable()) { + + QByteArray data, replyData; + QDataStream arg(data, IO_WriteOnly); + QCString replyType; + + /* Set the screensave to BlankOnly mode */ + blankonly = true; + arg << blankonly; + mClient.call("kdesktop","KScreensaverIface","setBlankOnly(bool)", + data, replyType, replyData) ; + + /* Save the screen */ + if ( !mClient.call("kdesktop", "KScreensaverIface", "save()", + data, replyType, replyData) ) + { + kdDebug() << "KVaio::blankScreen: there was some error " + << "using DCOP." << endl; + } + + /* Set the screensave to its original mode */ + blankonly = false; + arg << blankonly; + mClient.call("kdesktop","KScreensaverIface","setBlankOnly(bool)", + data, replyType, replyData) ; + + } + +} + +void KVaio::suspendToDisk() +{ + QByteArray data, replyData; + QDataStream arg(data, IO_WriteOnly); + QCString replyType; + + mClient.call("kpowersave","KPowersaveIface","do_suspendToDisk()", + data, replyType, replyData) ; +} + + +bool KVaio::isKScreensaverAvailable() +{ + if(mClient.isAttached()) + { + // kdDebug() << "KVaio::showTextMsg: attached to DCOP server." << endl; + if(mClient.isApplicationRegistered("kdesktop")) + { + QCStringList objects; + + // kdDebug() << "KVaio::showTextMsg: kded is registered at dcop server." + // << endl; + objects = mClient.remoteObjects("kdesktop"); + if(objects.contains("KScreensaverIface")) + { + // kdDebug() << "KVaio::showTextMsg: kmilod is available at kded." + // << endl; + return true; + } else { + kdDebug() << "KVaio::isKScreensaverAvailable: " + << "KScreensaverIface is NOT available at kdesktop." << endl; + return false; + } + } else { + kdDebug() << "KVaio::isKScreensaverAvailable: " + << "kdesktop is NOT registered at dcop server." << endl; + return false; + } + } else { + kdDebug() << "KVaio::isKScreensaverAvailable: " + << "kdesktop is NOT registered at dcop server." << endl; + return false; + } +} + +bool KVaio::isKMiloDAvailable() +{ + if(mClient.isAttached()) + { + // kdDebug() << "KVaio::showTextMsg: attached to DCOP server." << endl; + if(mClient.isApplicationRegistered("kded")) + { + QCStringList objects; + + // kdDebug() << "KVaio::showTextMsg: kded is registered at dcop server." + // << endl; + objects = mClient.remoteObjects("kded"); + if(objects.contains("kmilod")) + { + // kdDebug() << "KVaio::showTextMsg: kmilod is available at kded." + // << endl; + return true; + } else { + kdDebug() << "KVaio::isKMiloDAvailable: " + << "kmilod is NOT available at kded." << endl; + return false; + } + } else { + kdDebug() << "KVaio::isKMiloDAvailable: " + << "kded is NOT registered at dcop server." << endl; + return false; + } + } else { + kdDebug() << "KVaio::isKMiloDAvailable: " + << "kded is NOT registered at dcop server." << endl; + return false; + } +} + +void KVaio::loadConfiguration(KConfig *k) +{ + k->setGroup("KVaio"); + + mReportUnknownEvents = + k->readBoolEntry("Report_Unknown_Events", false); + mReportPowerStatus = + k->readBoolEntry("PeriodicallyReportPowerStatus", false); + mShowPowerStatusOnBackButton = + k->readBoolEntry("PowerStatusOnBackButton", true); + + kdDebug() << "KVaio::loadConfiguration: " << endl + << " mReportUnknownEvents: " + << mReportUnknownEvents << endl + << " mReportPowerStatus: " + << mReportPowerStatus << endl + << "mShowPowerStatusOnBackButton: " + << mShowPowerStatusOnBackButton << endl; +} + +const KVaioDriverInterface* KVaio::driver() +{ + return mDriver; +} + +void KVaio::slotTimeout () +{ + showBatteryStatus (); + mTimer->start (4000, true); +} + +bool KVaio::showBatteryStatus ( bool force ) +{ + static bool acConnectedCache = false; + static int previousChargeCache = -1; + bool bat1Avail = false, bat2Avail = false, acConnected = false; + int bat1Remaining = 0, bat1Max = 0, bat2Remaining = 0, bat2Max = 0; + bool displayBatteryMsg = false; + bool displayACStatus = false; + + QString text, acMsg; + QTextStream stream(text, IO_WriteOnly); + + // ----- + // only display on startup if mReportPowerStatus is true: + if (mReportPowerStatus==false || !force) + { + return true; + } + + // query all necessary information: + (void) mDriver->getBatteryStatus(bat1Avail, bat1Remaining, bat1Max, + bat2Avail, bat2Remaining, bat2Max, + acConnected); + + int remaining; + if ( bat1Avail || bat2Avail ) + remaining = (int)(100.0*(bat1Remaining+bat2Remaining) + / (bat1Max+bat2Max)); + else + remaining = -1; // no battery available + + if (acConnectedCache != acConnected || force) + { + displayACStatus = true; + acConnectedCache = acConnected; + } + + displayBatteryMsg = ( previousChargeCache * 100 / remaining > 1000 ) + || ( previousChargeCache * 100 / remaining > 200 && remaining < 10 ) + || force; + + + if (displayBatteryMsg) + { + previousChargeCache = remaining; + } + + // ----- prepare text messages + if (displayACStatus || displayBatteryMsg) + { + + if (displayACStatus) + { + acMsg = acConnected ? i18n ("AC Connected") : i18n ("AC Disconnected"); + } + + switch (remaining) + { + case 100: + stream << i18n("Battery is Fully Charged. "); + break; + case 5: + case 4: + case 3: + case 2: + case 1: + stream << i18n("Caution: Battery is Almost Empty (%1% remaining).").arg(remaining); + break; + case 0: + stream << i18n("Alert: Battery is Empty!"); + break; + case -1: + stream << i18n("No Battery Inserted."); + break; + default: + stream << i18n("Remaining Battery Capacity: %1%").arg( remaining ); + }; + + // show a message if the battery status changed by more then 10% or on startup + if (displayACStatus) + { + stream << endl << acMsg; + } + + return showTextMsg (text); + } else { + return true; + } +} + +void KVaio::BrightnessUp(int step) +{ + m_brightness = mDriver->brightness(); + + m_brightness += step; + if(m_brightness > m_maxBright) { + m_brightness = m_maxBright; + } + + mDriver->setBrightness(m_brightness); + showProgressMsg( i18n("Brightness"), m_brightness*100/255); +} + +void KVaio::BrightnessDown(int step) +{ + m_brightness = mDriver->brightness(); + + m_brightness -= step; + if(m_brightness < m_minBright) { + m_brightness = m_minBright; + } + + mDriver->setBrightness(m_brightness); + showProgressMsg( i18n("Brightness"), m_brightness*100/255); +} + + +void KVaio::displayVolume() +{ +// _interface->displayProgress(i18n("Volume"), m_volume); + + showProgressMsg(i18n("Volume"), m_volume); + // If we got this far, the DCOP communication with kmix works, + // so we don't have to test the result. + kmixClient->send("setMasterVolume", m_volume); + + // if mute then unmute + if (m_mute) + { + m_mute = false; + kmixClient->send("setMasterMute", m_mute); + } +} + + +bool KVaio::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 + { +// _interface->displayText + showTextMsg(i18n("Starting KMix...")); + 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) + { + kdDebug() << "KMilo: GenericMonitor could not access kmix/Mixer0 via dcop" + << endl; + //_interface->displayText + showTextMsg(i18n("It seems that KMix is not running.")); + + return false; + } else { + return true; + } +} + +void KVaio::VolumeUp(int step) +{ + if (!retrieveVolume()) + return; + + // FIXME if the mixer doesn't support steps of the specified size it + // could get stuck at one position + m_volume += step; + if (m_volume > m_maxVolume) + m_volume = m_maxVolume; + + displayVolume(); +} + +void KVaio::VolumeDown(int step) +{ + if (!retrieveVolume()) + return; + + m_volume -= step; + if (m_volume < m_minVolume) + m_volume = m_minVolume; + + displayVolume(); +} + +bool KVaio::retrieveMute() +{ + bool kmix_error = false; + + DCOPReply reply = kmixClient->call("masterMute"); + if (reply.isValid()) + m_volume = reply; + else + kmix_error = true; + + if (kmix_error) + { + // maybe the error occurred because kmix wasn't running + //_interface->displayText + showTextMsg(i18n("Starting KMix...")); + if (kapp->startServiceByDesktopName("kmix")==0) // trying to start kmix + { + // trying again + reply = kmixClient->call("masterMute"); + if (reply.isValid()) + { + m_mute = reply; + kmix_error = false; + kmixWindow->send("hide"); + } + } else + { + kmixWindow->send("hide"); + kmix_error = true; + } + } + + if (kmix_error) + { + kdDebug() << "KMilo: GenericMonitor could not access kmix/Mixer0 via dcop" + << endl; + //_interface->displayText + showTextMsg(i18n("It seems that KMix is not running.")); + + return false; + } else { + return true; + } +} + +void KVaio::mute() +{ + if (!retrieveMute()) + return; + + m_mute = !m_mute; + + int newVolume; + QString muteText; + if (m_mute) + { + m_oldVolume = m_volume; + newVolume = 0; + muteText = i18n("Mute on"); + } else { + newVolume = m_oldVolume; + muteText = i18n("Mute off"); + } + + kmixClient->send("setMasterMute", m_mute); + + //_interface->displayText(muteText); + showTextMsg(muteText); + +} + + +#include "kvaio.moc" diff --git a/kmilo/kmilo_kvaio/kvaio.h b/kmilo/kmilo_kvaio/kvaio.h new file mode 100644 index 0000000..c16f27e --- /dev/null +++ b/kmilo/kmilo_kvaio/kvaio.h @@ -0,0 +1,113 @@ +/* -*- C++ -*- + + This file declares the KVaio class. + + $ Author: Mirko Boehm $ + $ Copyright: (C) 1996-2003, Mirko Boehm $ + $ Contact: mirko@kde.org + http://www.kde.org + http://www.hackerbuero.org $ + $ License: LGPL with the following explicit clarification: + This code may be linked against any version of the Qt toolkit + from Troll Tech, Norway. $ + + $Id$ + + * Portions of this code are + * (C) 2001-2002 Stelian Pop <stelian@popies.net> and + * (C) 2001-2002 Alcove <www.alcove.com>. + * Thanks to Stelian for the implementation of the sonypi driver. +*/ + +#ifndef _KVAIO_H +#define _KVAIO_H + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <qtimer.h> + +#include <dcopclient.h> +#include <dcopref.h> +#include <kmainwindow.h> +#include "kvaiodriverinterface.h" +#include "monitor.h" +#include "kmilo_kvaio.h" + +extern "C" { +#include <X11/Xlib.h> +//#include <X11/extensions/XTest.h> +} + +class KVaio; +class KMiloKVaio; + +/** + * @short KVaio class + * This class provides an interface between the Vaio driver and the + * respective application (either the kmilod module or a single + * application). + * This class provides the application of the events created by the + * KVaioDriverInterface class. + * @author Mirko Boehm <mirko@hackerbuero.org> + * @version 0.2 + */ +class KVaio : public QObject +{ + Q_OBJECT +public: +// KVaio(QObject *parent = 0, const char *name =0); + KVaio(KMiloKVaio *parent = 0, const char *name =0); + + virtual ~KVaio(); + const KVaioDriverInterface *driver(); + void loadConfiguration(KConfig *); + const int progress() { return m_progress; } + +protected: + KVaioDriverInterface *mDriver; + Display *mDisp; + DCOPClient mClient; + bool isKScreensaverAvailable(); + bool isKMiloDAvailable(); + bool showTextMsg(const QString& msg); + bool showProgressMsg(const QString& msg, int progress); + bool showBatteryStatus ( bool force = false); +protected slots: + void slotVaioEvent(int); + void slotTimeout(); +public slots: + void blankScreen(); + void suspendToDisk(); + void BrightnessUp(int step); + void BrightnessDown(int step); + void VolumeUp(int step); + void VolumeDown(int step); + void mute(); +private: + bool retrieveMute(); + bool retrieveVolume(); + void displayVolume(); + + KMiloKVaio *myparent; + + DCOPRef *kmixClient, *kmixWindow; + + int m_progress; + int m_volume, m_oldVolume, m_brightness; + bool m_mute; + + int m_maxVolume, m_minVolume; + int m_maxBright, m_minBright; + + int m_VolumeStep; + int m_BrightnessStep; + + bool mReportUnknownEvents; + bool mReportPowerStatus; + bool mShowPowerStatusOnBackButton; + QTimer *mTimer; +}; + +#endif // _KVAIO_H diff --git a/kmilo/kmilo_kvaio/kvaiodriverinterface.cpp b/kmilo/kmilo_kvaio/kvaiodriverinterface.cpp new file mode 100644 index 0000000..32da70a --- /dev/null +++ b/kmilo/kmilo_kvaio/kvaiodriverinterface.cpp @@ -0,0 +1,221 @@ +/* -*- C++ -*- + + This file implements the KVaioDriverInterface class. + It provides an event-oriented wrapper for the kernel sonypi driver. + + $ Author: Mirko Boehm $ + $ Copyright: (C) 1996-2003, Mirko Boehm $ + $ Contact: mirko@kde.org + http://www.kde.org + http://www.hackerbuero.org $ + $ License: LGPL with the following explicit clarification: + This code may be linked against any version of the Qt toolkit + from Troll Tech, Norway. $ + + $Id$ + + * Portions of this code are + * (C) 2001-2002 Stelian Pop <stelian@popies.net> and + * (C) 2001-2002 Alcove <www.alcove.com>. + * Thanks to Stelian for the implementation of the sonypi driver. +*/ + +#include "kvaiodriverinterface.h" + +extern "C" { +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <sys/ioctl.h> +#include <linux/types.h> +#include <X11/Xlib.h> +//#include <X11/extensions/XTest.h> + +#include "./sonypi.h" +} + +#include <qsocketnotifier.h> +#include <kdebug.h> + +// Taken from Stelian Pop's spicctrl utility: + +/* Have our own definition of ioctls... */ + +/* get/set brightness */ +#define SONYPI_IOCGBRT _IOR('v', 0, __u8) +#define SONYPI_IOCSBRT _IOW('v', 0, __u8) + +/* get battery full capacity/remaining capacity */ +#define SONYPI_IOCGBAT1CAP _IOR('v', 2, __u16) +#define SONYPI_IOCGBAT1REM _IOR('v', 3, __u16) +#define SONYPI_IOCGBAT2CAP _IOR('v', 4, __u16) +#define SONYPI_IOCGBAT2REM _IOR('v', 5, __u16) + +/* get battery flags: battery1/battery2/ac adapter present */ +#define SONYPI_BFLAGS_B1 0x01 +#define SONYPI_BFLAGS_B2 0x02 +#define SONYPI_BFLAGS_AC 0x04 +#define SONYPI_IOCGBATFLAGS _IOR('v', 7, __u8) + +/* get/set bluetooth subsystem state on/off */ +#define SONYPI_IOCGBLUE _IOR('v', 8, __u8) +#define SONYPI_IOCSBLUE _IOW('v', 9, __u8) + +KVaioDriverInterface::KVaioDriverInterface(QObject *parent) + : QObject(parent), + mFd(0), + mNotifier(0) +{ +} + +bool KVaioDriverInterface::connectToDriver(bool listen) +{ + const char* DriverFile = "/dev/sonypi"; + + mFd = open(DriverFile, O_RDONLY); + + // mFd = open(DriverFile, O_RDWR); + + if(mFd == -1) + { + kdDebug() << "KVaio: Failed to open /dev/sonypi: " + << strerror(errno) << "." << endl; + return false; + } + + fcntl(mFd, F_SETFL, fcntl(mFd, F_GETFL) | O_ASYNC); + + if(listen) + { + mNotifier = new QSocketNotifier(mFd, QSocketNotifier::Read, this); + connect(mNotifier, SIGNAL(activated(int)), SLOT(socketActivated(int))); + } + return true; +} + +void KVaioDriverInterface::disconnectFromDriver() +{ + delete mNotifier; + mNotifier = 0; + + if(mFd!=0) + { + close(mFd); + mFd = 0; + } +} + +void KVaioDriverInterface::socketActivated(int) +{ + unsigned char events[8]; + int count; + + do { + count = read(mFd, &events, sizeof(events)); + for(int index = 0; index<count; index++) + { + emit(vaioEvent(events[index])); + } + } while(count==sizeof(events)); +} + +int KVaioDriverInterface::brightness() +{ + unsigned char value = 0; + int result=0; + + result = ioctl(mFd, SONYPI_IOCGBRT, &value); + + if (result >= 0) + { + return value; + } else { + return -1; + } + +} + +void KVaioDriverInterface::setBrightness(int value) +{ + static unsigned char cache; // to avoid unnecessary updates + int result; + unsigned char value8 = 0; + + if(value<0) value=0; + if(value>255) value=255; + + value8 = __u8(value); + + if(value8 != cache) + { + result = ioctl(mFd, SONYPI_IOCSBRT, &value8); + + if(result<0) + { + kdDebug() << "KVaioDriverInterface::setBrightness: ioctl failed." + << endl; + } + cache = value8; + } +} + +bool KVaioDriverInterface::getBatteryStatus( + bool& bat1Avail, int& bat1Remaining, int& bat1Max, + bool& bat2Avail, int& bat2Remaining, int& bat2Max, + bool& acConnected) +{ + unsigned char batFlags = 0; + + bool retval = true; + + if(ioctl(mFd, SONYPI_IOCGBATFLAGS, &batFlags)<0) + { + retval = false; + } else { + __u16 rem1 = 0, rem2 = 0, cap1 = 0, cap2 = 0; + + bat1Avail = batFlags & SONYPI_BFLAGS_B1; + bat2Avail = batFlags & SONYPI_BFLAGS_B2; + acConnected = batFlags & SONYPI_BFLAGS_AC; + +// kdDebug() << "KVaioDriverInterface::getBatteryStatus: battery 1: " +// << (bat1Avail ? "available" : "not available") << endl +// << " battery 2: " +// << (bat2Avail ? "available" : "not available") << endl +// << " AC adapter: " +// << (acConnected ? "connected" : "connected") +// << "." << endl; + + if(bat1Avail + && ioctl(mFd, SONYPI_IOCGBAT1CAP, &cap1) >= 0 + && ioctl(mFd, SONYPI_IOCGBAT1REM, &rem1) >= 0) + { + bat1Max = cap1; + bat1Remaining = rem1; + } else { + bat1Remaining = 0; + bat1Max = 0; + retval = false; + } + + if(bat2Avail + && ioctl(mFd, SONYPI_IOCGBAT2CAP, &cap2) >= 0 + && ioctl(mFd, SONYPI_IOCGBAT2REM, &rem2) >= 0) + { + bat2Max = cap2; + bat2Remaining = rem2; + } else { + bat2Remaining = 0; + bat2Max = 0; + retval = false; + } + } + + return retval; +} + +#include "kvaiodriverinterface.moc" + diff --git a/kmilo/kmilo_kvaio/kvaiodriverinterface.h b/kmilo/kmilo_kvaio/kvaiodriverinterface.h new file mode 100644 index 0000000..55c32b6 --- /dev/null +++ b/kmilo/kmilo_kvaio/kvaiodriverinterface.h @@ -0,0 +1,62 @@ +/* -*- C++ -*- + + This file declares the KVaioDrierInterface class. + It provides an event-oriented wrapper for the kernel sonypi driver. + + $ Author: Mirko Boehm $ + $ Copyright: (C) 1996-2003, Mirko Boehm $ + $ Contact: mirko@kde.org + http://www.kde.org + http://www.hackerbuero.org $ + $ License: LGPL with the following explicit clarification: + This code may be linked against any version of the Qt toolkit + from Troll Tech, Norway. $ + + $Id$ +*/ + +#ifndef KVAIO_DRIVERINTERFACE_H +#define KVAIO_DRIVERINTERFACE_H + +#include <qobject.h> + +class QTimer; + +extern "C" +{ +#include <fcntl.h> + +#include "./sonypi.h" +} + +class QSocketNotifier; + +class KVaioDriverInterface : public QObject +{ + Q_OBJECT +public: + KVaioDriverInterface(QObject *parent=0); + bool connectToDriver(bool listen = true); + void disconnectFromDriver(); + /** Return the current display brightness, a value between 0 and + 255. Returns -1 if the setting cannot be retrieved. */ + int brightness(); + /** Get the battery status. */ + bool getBatteryStatus(bool& bat1Avail, int& bat1Remaining, int& bat1Max, + bool& bat2Avail, int& bat2Remaining, int& bat2Max, + bool& acConnected); +public slots: + /** Set the display brightness. 0<= value <=255. */ + void setBrightness(int); +protected: + int mFd; + fd_set mRfds; + QSocketNotifier *mNotifier; +signals: + void vaioEvent(int); + // void brightnessChanged(int); +protected slots: + void socketActivated(int); +}; + +#endif // KVAIO_DRIVERINTERFACE_H diff --git a/kmilo/kmilo_kvaio/sonypi.h b/kmilo/kmilo_kvaio/sonypi.h new file mode 100644 index 0000000..43cfc80 --- /dev/null +++ b/kmilo/kmilo_kvaio/sonypi.h @@ -0,0 +1,158 @@ +/* + * Sony Programmable I/O Control Device driver for VAIO + * + * Copyright (C) 2001-2005 Stelian Pop <stelian@popies.net> + * + * Copyright (C) 2005 Narayanan R S <nars@kadamba.org> + + * Copyright (C) 2001-2002 Alcve <www.alcove.com> + * + * Copyright (C) 2001 Michael Ashley <m.ashley@unsw.edu.au> + * + * Copyright (C) 2001 Junichi Morita <jun1m@mars.dti.ne.jp> + * + * Copyright (C) 2000 Takaya Kinjo <t-kinjo@tc4.so-net.ne.jp> + * + * Copyright (C) 2000 Andrew Tridgell <tridge@valinux.com> + * + * Earlier work by Werner Almesberger, Paul `Rusty' Russell and Paul Mackerras. + * + * 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 _SONYPI_H_ +#define _SONYPI_H_ + +#include <linux/types.h> + +/* events the user application reading /dev/sonypi can use */ + +#define SONYPI_EVENT_JOGDIAL_DOWN 1 +#define SONYPI_EVENT_JOGDIAL_UP 2 +#define SONYPI_EVENT_JOGDIAL_DOWN_PRESSED 3 +#define SONYPI_EVENT_JOGDIAL_UP_PRESSED 4 +#define SONYPI_EVENT_JOGDIAL_PRESSED 5 +#define SONYPI_EVENT_JOGDIAL_RELEASED 6 /* obsolete */ +#define SONYPI_EVENT_CAPTURE_PRESSED 7 +#define SONYPI_EVENT_CAPTURE_RELEASED 8 /* obsolete */ +#define SONYPI_EVENT_CAPTURE_PARTIALPRESSED 9 +#define SONYPI_EVENT_CAPTURE_PARTIALRELEASED 10 +#define SONYPI_EVENT_FNKEY_ESC 11 +#define SONYPI_EVENT_FNKEY_F1 12 +#define SONYPI_EVENT_FNKEY_F2 13 +#define SONYPI_EVENT_FNKEY_F3 14 +#define SONYPI_EVENT_FNKEY_F4 15 +#define SONYPI_EVENT_FNKEY_F5 16 +#define SONYPI_EVENT_FNKEY_F6 17 +#define SONYPI_EVENT_FNKEY_F7 18 +#define SONYPI_EVENT_FNKEY_F8 19 +#define SONYPI_EVENT_FNKEY_F9 20 +#define SONYPI_EVENT_FNKEY_F10 21 +#define SONYPI_EVENT_FNKEY_F11 22 +#define SONYPI_EVENT_FNKEY_F12 23 +#define SONYPI_EVENT_FNKEY_1 24 +#define SONYPI_EVENT_FNKEY_2 25 +#define SONYPI_EVENT_FNKEY_D 26 +#define SONYPI_EVENT_FNKEY_E 27 +#define SONYPI_EVENT_FNKEY_F 28 +#define SONYPI_EVENT_FNKEY_S 29 +#define SONYPI_EVENT_FNKEY_B 30 +#define SONYPI_EVENT_BLUETOOTH_PRESSED 31 +#define SONYPI_EVENT_PKEY_P1 32 +#define SONYPI_EVENT_PKEY_P2 33 +#define SONYPI_EVENT_PKEY_P3 34 +#define SONYPI_EVENT_BACK_PRESSED 35 +#define SONYPI_EVENT_LID_CLOSED 36 +#define SONYPI_EVENT_LID_OPENED 37 +#define SONYPI_EVENT_BLUETOOTH_ON 38 +#define SONYPI_EVENT_BLUETOOTH_OFF 39 +#define SONYPI_EVENT_HELP_PRESSED 40 +#define SONYPI_EVENT_FNKEY_ONLY 41 +#define SONYPI_EVENT_JOGDIAL_FAST_DOWN 42 +#define SONYPI_EVENT_JOGDIAL_FAST_UP 43 +#define SONYPI_EVENT_JOGDIAL_FAST_DOWN_PRESSED 44 +#define SONYPI_EVENT_JOGDIAL_FAST_UP_PRESSED 45 +#define SONYPI_EVENT_JOGDIAL_VFAST_DOWN 46 +#define SONYPI_EVENT_JOGDIAL_VFAST_UP 47 +#define SONYPI_EVENT_JOGDIAL_VFAST_DOWN_PRESSED 48 +#define SONYPI_EVENT_JOGDIAL_VFAST_UP_PRESSED 49 +#define SONYPI_EVENT_ZOOM_PRESSED 50 +#define SONYPI_EVENT_THUMBPHRASE_PRESSED 51 +#define SONYPI_EVENT_MEYE_FACE 52 +#define SONYPI_EVENT_MEYE_OPPOSITE 53 +#define SONYPI_EVENT_MEMORYSTICK_INSERT 54 +#define SONYPI_EVENT_MEMORYSTICK_EJECT 55 +#define SONYPI_EVENT_ANYBUTTON_RELEASED 56 +#define SONYPI_EVENT_BATTERY_INSERT 57 +#define SONYPI_EVENT_BATTERY_REMOVE 58 +#define SONYPI_EVENT_FNKEY_RELEASED 59 + +/* get/set brightness */ +#define SONYPI_IOCGBRT _IOR('v', 0, __u8) +#define SONYPI_IOCSBRT _IOW('v', 0, __u8) + +/* get battery full capacity/remaining capacity */ +#define SONYPI_IOCGBAT1CAP _IOR('v', 2, __u16) +#define SONYPI_IOCGBAT1REM _IOR('v', 3, __u16) +#define SONYPI_IOCGBAT2CAP _IOR('v', 4, __u16) +#define SONYPI_IOCGBAT2REM _IOR('v', 5, __u16) + +/* get battery flags: battery1/battery2/ac adapter present */ +#define SONYPI_BFLAGS_B1 0x01 +#define SONYPI_BFLAGS_B2 0x02 +#define SONYPI_BFLAGS_AC 0x04 +#define SONYPI_IOCGBATFLAGS _IOR('v', 7, __u8) + +/* get/set bluetooth subsystem state on/off */ +#define SONYPI_IOCGBLUE _IOR('v', 8, __u8) +#define SONYPI_IOCSBLUE _IOW('v', 9, __u8) + +/* get/set fan state on/off */ +#define SONYPI_IOCGFAN _IOR('v', 10, __u8) +#define SONYPI_IOCSFAN _IOW('v', 11, __u8) + +/* get temperature (C) */ +#define SONYPI_IOCGTEMP _IOR('v', 12, __u8) + +#ifdef __KERNEL__ + +/* used only for communication between v4l and sonypi */ + +#define SONYPI_COMMAND_GETCAMERA 1 /* obsolete */ +#define SONYPI_COMMAND_SETCAMERA 2 +#define SONYPI_COMMAND_GETCAMERABRIGHTNESS 3 /* obsolete */ +#define SONYPI_COMMAND_SETCAMERABRIGHTNESS 4 +#define SONYPI_COMMAND_GETCAMERACONTRAST 5 /* obsolete */ +#define SONYPI_COMMAND_SETCAMERACONTRAST 6 +#define SONYPI_COMMAND_GETCAMERAHUE 7 /* obsolete */ +#define SONYPI_COMMAND_SETCAMERAHUE 8 +#define SONYPI_COMMAND_GETCAMERACOLOR 9 /* obsolete */ +#define SONYPI_COMMAND_SETCAMERACOLOR 10 +#define SONYPI_COMMAND_GETCAMERASHARPNESS 11 /* obsolete */ +#define SONYPI_COMMAND_SETCAMERASHARPNESS 12 +#define SONYPI_COMMAND_GETCAMERAPICTURE 13 /* obsolete */ +#define SONYPI_COMMAND_SETCAMERAPICTURE 14 +#define SONYPI_COMMAND_GETCAMERAAGC 15 /* obsolete */ +#define SONYPI_COMMAND_SETCAMERAAGC 16 +#define SONYPI_COMMAND_GETCAMERADIRECTION 17 /* obsolete */ +#define SONYPI_COMMAND_GETCAMERAROMVERSION 18 /* obsolete */ +#define SONYPI_COMMAND_GETCAMERAREVISION 19 /* obsolete */ + +int sonypi_camera_command(int command, u8 value); + +#endif /* __KERNEL__ */ + +#endif /* _SONYPI_H_ */ diff --git a/kmilo/kmilod/Makefile.am b/kmilo/kmilod/Makefile.am new file mode 100644 index 0000000..72662db --- /dev/null +++ b/kmilo/kmilod/Makefile.am @@ -0,0 +1,43 @@ +# This file is part of the KDE project +# Copyright (C) 2003 George Staikos <staikos@kde.org> + +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. + +# You should have received a copy of the GNU Library General Public License +# along with this library; see the file COPYING.LIB. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +INCLUDES=$(all_includes) + +kde_module_LTLIBRARIES = kded_kmilod.la +kded_kmilod_la_LDFLAGS = -module -avoid-version $(all_libraries) +kded_kmilod_la_LIBADD = $(LIB_KIO) libkmilo.la +kded_kmilod_la_SOURCES = kmilod.cpp kmilod.skel defaultskin.cpp \ + defaultwidget.ui kmilointerface.cpp + +lib_LTLIBRARIES = libkmilo.la +libkmilo_la_SOURCES = monitor.cpp displayskin.cpp +libkmilo_la_LDFLAGS = -version-info 1:0:0 -no-undefined $(all_libraries) +libkmilo_la_LIBADD = $(LIB_QT) + +METASOURCES = AUTO + +noinst_HEADERS = kmilod.h monitor.h displayskin.h defaultskin.h + +services_DATA = kmilod.desktop +servicesdir = $(kde_servicesdir)/kded + +servicetypes_DATA = kmilopluginsvc.desktop +servicetypesdir = $(kde_servicetypesdir)/kmilo + +messages: rc.cpp + $(XGETTEXT) *.cpp -o $(podir)/kmilod.pot diff --git a/kmilo/kmilod/defaultskin.cpp b/kmilo/kmilod/defaultskin.cpp new file mode 100644 index 0000000..f0324de --- /dev/null +++ b/kmilo/kmilod/defaultskin.cpp @@ -0,0 +1,107 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: t; tab-width: 2; -*- +/* + This file is part of the KDE project + + Copyright (c) 2003 George Staikos <staikos@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ + +#include "defaultwidget.h" + +#include <qprogressbar.h> +#include <qwidget.h> +#include <qwidgetstack.h> +#include <qlabel.h> +#include <qapplication.h> + +#include <kwin.h> +#include <netwm.h> +#include <kglobalsettings.h> +#include <kdeversion.h> + +#include "defaultskin.h" + + +DefaultSkin::DefaultSkin() { + connect(&_timer, SIGNAL(timeout()), this, SLOT(timeout())); + + _widget = new DefaultWidget(0, "Screen Indicator", Qt::WX11BypassWM); + _widget->setFocusPolicy(QWidget::NoFocus); + + KWin::setOnAllDesktops(_widget->winId(), true); + KWin::setState( _widget->winId(), NET::StaysOnTop | NET::Sticky + | NET::SkipTaskbar | NET::SkipPager ); + KWin::setType(_widget->winId(), NET::Override); + + _widget->hide(); +} + + +DefaultSkin::~DefaultSkin() { + delete _widget; + _widget = 0; +} + + +void DefaultSkin::clear() { + _timer.stop(); + _widget->hide(); +} + + +void DefaultSkin::show() { +#if KDE_IS_VERSION(3,1,90) + QRect r = KGlobalSettings::splashScreenDesktopGeometry(); +#else + QRect r = QApplication::desktop()->geometry(); +#endif + // _label->resize(_label->minimumSizeHint()); + // _widget->resize(_label->minimumSizeHint()); + _widget->move(r.center() - + QPoint(_widget->width()/2, _widget->height()/2)); + _widget->show(); + _timer.start(750, true); +} + + +void DefaultSkin::displayText(const QString& text, const QPixmap& customPixmap) { + Q_UNUSED(customPixmap) + _timer.stop(); + _widget->_widgetStack->raiseWidget(0); + _widget->_textOnly->setText(text); + show(); +} + + +void DefaultSkin::displayProgress(const QString& text, int percent, const QPixmap& customPixmap) { + Q_UNUSED(customPixmap) + _timer.stop(); + _widget->_progressText->setText(text); + _widget->_progress->setProgress(percent); + _widget->_widgetStack->raiseWidget(1); + show(); +} + + +void DefaultSkin::timeout() { + clear(); +} + + +#include "defaultskin.moc" + diff --git a/kmilo/kmilod/defaultskin.h b/kmilo/kmilod/defaultskin.h new file mode 100644 index 0000000..0e01f23 --- /dev/null +++ b/kmilo/kmilod/defaultskin.h @@ -0,0 +1,56 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: t; tab-width: 2; -*- +/* + This file is part of the KDE project + + Copyright (c) 2003 George Staikos <staikos@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef _DEFAULTSKIN_H_ +#define _DEFAULTSKIN_H_ + +#include <qstring.h> +#include <qobject.h> +#include <qtimer.h> +#include "displayskin.h" + +class DefaultWidget; + +class DefaultSkin : public QObject, public KMilo::DisplaySkin { + Q_OBJECT + public: + DefaultSkin(); + virtual ~DefaultSkin(); + + virtual void clear(); + + virtual void displayText(const QString& text, const QPixmap& customPixmap=QPixmap()); + virtual void displayProgress(const QString& text, + int percent, const QPixmap& customPixmap=QPixmap()); + + private slots: + void timeout(); + + private: + void show(); + + DefaultWidget *_widget; + QTimer _timer; +}; + + +#endif diff --git a/kmilo/kmilod/defaultwidget.ui b/kmilo/kmilod/defaultwidget.ui new file mode 100644 index 0000000..b4809fe --- /dev/null +++ b/kmilo/kmilod/defaultwidget.ui @@ -0,0 +1,195 @@ +<!DOCTYPE UI><UI version="3.1" stdsetdef="1"> +<class>DefaultWidget</class> +<comment>Default widget for the default display for kmilod +Released under the terms of the GNU GPL.</comment> +<author>George Staikos <staikos@kde.org</author> +<widget class="QWidget"> + <property name="name"> + <cstring>DefaultWidget</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>566</width> + <height>180</height> + </rect> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>214</red> + <green>213</green> + <blue>212</blue> + </color> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QWidgetStack" row="0" column="0"> + <property name="name"> + <cstring>_widgetStack</cstring> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>214</red> + <green>213</green> + <blue>212</blue> + </color> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <widget class="QWidget"> + <property name="name"> + <cstring>page</cstring> + </property> + <attribute name="id"> + <number>0</number> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>_textOnly</cstring> + </property> + <property name="paletteForegroundColor"> + <color> + <red>26</red> + <green>69</green> + <blue>198</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>214</red> + <green>213</green> + <blue>212</blue> + </color> + </property> + <property name="font"> + <font> + <pointsize>28</pointsize> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string></string> + </property> + <property name="alignment"> + <set>AlignCenter</set> + </property> + </widget> + </grid> + </widget> + <widget class="QWidget"> + <property name="name"> + <cstring>page</cstring> + </property> + <attribute name="id"> + <number>1</number> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer row="1" column="2"> + <property name="name"> + <cstring>spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>81</width> + <height>31</height> + </size> + </property> + </spacer> + <spacer row="1" column="0"> + <property name="name"> + <cstring>spacer1_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>81</width> + <height>31</height> + </size> + </property> + </spacer> + <widget class="QProgressBar" row="1" column="1"> + <property name="name"> + <cstring>_progress</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>1</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>214</red> + <green>213</green> + <blue>212</blue> + </color> + </property> + <property name="centerIndicator"> + <bool>false</bool> + </property> + </widget> + <widget class="QLabel" row="0" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>_progressText</cstring> + </property> + <property name="paletteForegroundColor"> + <color> + <red>26</red> + <green>69</green> + <blue>198</blue> + </color> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>214</red> + <green>213</green> + <blue>212</blue> + </color> + </property> + <property name="font"> + <font> + <pointsize>28</pointsize> + <bold>1</bold> + </font> + </property> + <property name="text"> + <string></string> + </property> + <property name="alignment"> + <set>AlignCenter</set> + </property> + </widget> + </grid> + </widget> + </widget> + </grid> +</widget> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff --git a/kmilo/kmilod/displayskin.cpp b/kmilo/kmilod/displayskin.cpp new file mode 100644 index 0000000..f0fd422 --- /dev/null +++ b/kmilo/kmilod/displayskin.cpp @@ -0,0 +1,34 @@ +/* + This file is part of the KDE project + + Copyright (c) 2003 George Staikos <staikos@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ + +#include "displayskin.h" + +namespace KMilo { + +DisplaySkin::DisplaySkin() { +} + +DisplaySkin::~DisplaySkin() { +} + +} + diff --git a/kmilo/kmilod/displayskin.h b/kmilo/kmilod/displayskin.h new file mode 100644 index 0000000..4e74e0c --- /dev/null +++ b/kmilo/kmilod/displayskin.h @@ -0,0 +1,47 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: t; tab-width: 2; -*- +/* + This file is part of the KDE project + + Copyright (c) 2003 George Staikos <staikos@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef _DISPLAYSKIN_H_ +#define _DISPLAYSKIN_H_ + +#include <kdemacros.h> + +#include <qstring.h> +#include <qpixmap.h> + +namespace KMilo { + +class KDE_EXPORT DisplaySkin { + public: + DisplaySkin(); + virtual ~DisplaySkin(); + + virtual void clear() = 0; + + virtual void displayText(const QString& text,const QPixmap& customPixmap=QPixmap()) = 0; + virtual void displayProgress(const QString& text, + int percent, const QPixmap& customPixmap=QPixmap()) = 0; +}; + +} + +#endif diff --git a/kmilo/kmilod/kmilod.cpp b/kmilo/kmilod/kmilod.cpp new file mode 100644 index 0000000..98203b1 --- /dev/null +++ b/kmilo/kmilod/kmilod.cpp @@ -0,0 +1,227 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: t; tab-width: 2; -*- +/* + This file is part of the KDE project + + Copyright (c) 2003 George Staikos <staikos@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "kmilod.h" +#include "monitor.h" + +#include <qfile.h> + +#include <klocale.h> +#include <kdebug.h> +#include <kservicetype.h> +#include <kservice.h> +#include <kconfig.h> +#include <kparts/componentfactory.h> + +#include "kmilointerface.h" +#include "defaultskin.h" + +using namespace KMilo; + +extern "C" { + KDE_EXPORT KDEDModule *create_kmilod(const QCString &name) { + return new KMiloD(name); + } +} + + +KMiloD::KMiloD(const QCString &name) : KDEDModule(name), _interval(100) +{ + _monitors.setAutoDelete(true); + _miface = new KMiloInterface(this); + + // Create the display skin object + _display = new DefaultSkin; + + bool shouldPoll = false; + + // Load the modules + KService::List plugs = KServiceType::offers("KMilo Plugin"); + for (KService::List::ConstIterator it = plugs.begin(); + it != plugs.end(); ++it) { + KService::Ptr service = *it; + KMilo::Monitor *m = KParts::ComponentFactory::createInstanceFromService<KMilo::Monitor>(service, 0, service->desktopEntryName().latin1()); + if (m) { + m->setInterface(_miface); + if (m->init()) { + _monitors.append(m); + kdDebug() << "KMilo loaded module " + << service->property("Name").toString() + << endl; + shouldPoll = shouldPoll || m->shouldPoll(); + } else { + delete m; + } + } + } + + // Start the timer + QObject::connect(&_timer, SIGNAL(timeout()), this, SLOT(doTimer())); + if (shouldPoll) { + _timer.start(_interval); + } +} + + +KMiloD::~KMiloD() +{ + _timer.stop(); + + // Modules are automatically cleaned up when this is done. It has + // to be done before delete _display to avoid a race though. + _monitors.clear(); + + delete _display; + _display = 0L; + + delete _miface; + _miface = 0L; +} + + +void KMiloD::setEnabled(bool enabled) { + if (enabled) { + enable(); + } else { + disable(); + } +} + + +void KMiloD::enable() { + if (!_monitors.isEmpty()) { + _timer.start(_interval, false); + } +} + + +void KMiloD::disable() { + _timer.stop(); +} + + +bool KMiloD::enabled() const { + return _timer.isActive(); +} + + +int KMiloD::pollMilliSeconds() const { + return _interval; +} + + +bool KMiloD::setPollMilliSeconds(int ms) { + if (ms > 1000 || ms < 0) { + return false; + } + + if (!_monitors.isEmpty()) { + _timer.start(_interval, false); + } + + _interval = ms; + +return true; +} + + +void KMiloD::doTimer() { + // Iterate through all the modules we have and poll + for (KMilo::Monitor *m = _monitors.first(); m; m = _monitors.next()) { + if (!m->shouldPoll()) { + continue; + } + + KMilo::Monitor::DisplayType dt = m->poll(); + switch (dt) { + case KMilo::Monitor::Volume: + displayProgress(i18n("Volume"), m->progress()); + break; + case KMilo::Monitor::Brightness: + displayProgress(i18n("Brightness"), m->progress()); + break; + case KMilo::Monitor::Mute: + displayText(i18n("Muted")); + break; + case KMilo::Monitor::Tap: + displayText(m->message()); + break; + case KMilo::Monitor::Sleep: + displayText(m->message()); + break; + case KMilo::Monitor::None: + // Do nothing + break; + case KMilo::Monitor::Error: + { + // On error, remove the monitor and continue + KMilo::Monitor *n = _monitors.next(); + _monitors.remove(m); // deletes m + m = n; + } + break; + default: + kdWarning() << "Error in KMiloD. Please report." << endl; + break; + } + } +} + + +void KMiloD::displayText(const QString& text) { + _display->displayText(text, QPixmap()); +} + + +void KMiloD::displayText(const QString& text, const QPixmap& customPixmap) { + _display->displayText(text, customPixmap); +} + + +void KMiloD::displayProgress(const QString& text, int progress) { + _display->displayProgress(text, progress, QPixmap()); +} + +void KMiloD::displayProgress(const QString& text, int progress, const QPixmap& customPixmap ) { + _display->displayProgress(text, progress, customPixmap); +} + +void KMiloD::reconfigure() +{ + // load the kmilo configuration file: + KConfig config("kmilodrc"); + + KMilo::Monitor *monitor; + + for(monitor = _monitors.first(); monitor; monitor = _monitors.next()) + { + monitor->reconfigure(&config); + } +} + +#include "kmilod.moc" + diff --git a/kmilo/kmilod/kmilod.desktop b/kmilo/kmilod/kmilod.desktop new file mode 100644 index 0000000..d31dacb --- /dev/null +++ b/kmilo/kmilod/kmilod.desktop @@ -0,0 +1,59 @@ +[Desktop Entry] +Type=Service +ServiceTypes=KDEDModule +X-KDE-ModuleType=Library +X-KDE-Library=kmilod +X-KDE-FactoryName=kmilod +X-KDE-Kded-autoload=true +X-KDE-Kded-load-on-demand=false +Name=KMilo +Name[de]=KMilo Sondertasten +Name[hi]=के-मिलो +Name[ne]=केमिलो +Name[sv]=Kmilo +Name[ta]= கேமிலோ +Comment=KDE special key notifier +Comment[ar]=مبلغ كدى للمفاتيح الخاصة +Comment[bg]=Известяване при натискане на специалните клавиши на някои модели лаптопи +Comment[bs]=KDE obavještenje o posebnim tipkama +Comment[ca]=Notificador de tecles especials de KDE +Comment[cs]=Hlášení speciálních kláves +Comment[da]=KDE Speciel tast bekendtgørelse +Comment[de]=Unterstützung für Sonder- und Multimediatasten in KDE +Comment[el]=Ειδοποιητής ειδικών πλήκτρων του KDE +Comment[eo]=KDE-specialklavatentigilo +Comment[es]=Notificador de teclas especiales de KDE +Comment[et]=KDE eriklahvide märkija +Comment[eu]=KDE tekla berezien jakinarazlea +Comment[fa]=اخطار دهندۀ ویژۀ کلید KDE +Comment[fi]=KDE:n erikoisnäppäinhuomauttaja +Comment[fr]=Notificateur de touche spéciale pour KDE +Comment[hu]=KDE-s kezelőprogram a speciális billentyűkhöz +Comment[is]=KDE sérhnappatólið +Comment[it]=Gestione KDE dei tasti speciali +Comment[ja]=KDE の特殊キー通知 +Comment[kk]=KDE-ның арнаулы пернелерді қолдауы +Comment[km]=កម្មវិធីជូនដំណឹងគ្រាប់ចុច KDE ពិសេស +Comment[lt]=KDE specialiųjų raktų pranešiklis +Comment[mk]=Известувач за спец. копчиња во KDE +Comment[nb]=Beskjedgiver KDE spesialtaster +Comment[nds]=KDE-Sünnertastenmellen +Comment[ne]=KDE विशेष कुञ्जी सूचनाकर्ता +Comment[nl]=KDE-notificatie van speciale toetsen +Comment[nn]=KDE-verktøy for spesialtastar +Comment[pa]=KDE ਖਾਸ ਸਵਿੱਚ ਸੂਚਕ +Comment[pl]=Obsługa klawiszy specjalnych +Comment[pt]=Notificação de teclas especiais do KDE +Comment[pt_BR]=Notificador de tecla especial do KDE +Comment[ro]=Notificare taste speciale pentru KDE +Comment[ru]=Поддержка специальных клавиш +Comment[sk]=KDE upozornenie na špeciálne klávesy +Comment[sl]=Opomnik posebnih ključev v KDE +Comment[sr]=KDE-ов обаваштавач о посебним тастерима +Comment[sr@Latn]=KDE-ov obavaštavač o posebnim tasterima +Comment[sv]=Underrättelse om KDE specialtangent +Comment[ta]= கேடிஇ சிறப்பு விசை குறிப்பான் +Comment[tr]=KDE özel tuş bildirici +Comment[uk]=Сповіщувач про натискання спеціальних клавіш для KDE +Comment[zh_CN]=KDE 特殊按键通知程序 +Comment[zh_TW]=KDE 特殊鍵通知 diff --git a/kmilo/kmilod/kmilod.h b/kmilo/kmilod/kmilod.h new file mode 100644 index 0000000..d97027b --- /dev/null +++ b/kmilo/kmilod/kmilod.h @@ -0,0 +1,72 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: t; tab-width: 2; -*- +/* + This file is part of the KDE project + + Copyright (c) 2003 George Staikos <staikos@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ +#ifndef _KMILOD_H_ +#define _KMILOD_H_ + +#include <kdedmodule.h> +#include <qstring.h> +#include <qtimer.h> +#include <qptrlist.h> +#include "monitor.h" +#include "displayskin.h" + +namespace KMilo { + +class KMiloInterface; + +class KMiloD : public KDEDModule { + Q_OBJECT + K_DCOP + public: + KMiloD(const QCString &name); + virtual ~KMiloD(); + + k_dcop: + virtual void setEnabled(bool enabled); + virtual void enable(); + virtual void disable(); + virtual bool enabled() const; + virtual int pollMilliSeconds() const; + virtual bool setPollMilliSeconds(int ms); + + virtual void displayText(const QString& text); + virtual void displayText(const QString& text, const QPixmap& customPixmap); + virtual void displayProgress(const QString& text, int progress, const QPixmap& customPixmap); + virtual void displayProgress(const QString& text, int progress); + + virtual void reconfigure(); + + private slots: + virtual void doTimer(); + + private: + QTimer _timer; + int _interval; + QPtrList<Monitor> _monitors; + DisplaySkin *_display; + KMiloInterface *_miface; +}; + +} + +#endif diff --git a/kmilo/kmilod/kmilointerface.cpp b/kmilo/kmilod/kmilointerface.cpp new file mode 100644 index 0000000..21a6430 --- /dev/null +++ b/kmilo/kmilod/kmilointerface.cpp @@ -0,0 +1,26 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: t; tab-width: 2; -*- +/* + This file is part of the KDE project + + Copyright (c) 2003 George Staikos <staikos@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ + +#include "kmilointerface.h" +#include "kmilointerface.moc" + diff --git a/kmilo/kmilod/kmilointerface.h b/kmilo/kmilod/kmilointerface.h new file mode 100644 index 0000000..d1edbb9 --- /dev/null +++ b/kmilo/kmilod/kmilointerface.h @@ -0,0 +1,57 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: t; tab-width: 2; -*- +/* + This file is part of the KDE project + + Copyright (c) 2003 George Staikos <staikos@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ +#ifndef _KMILOI_H_ +#define _KMILOI_H_ + +#include <qobject.h> +#include <qstring.h> +#include "kmilod.h" + +namespace KMilo { + +// FIXME: make put the methods into .cpp file when the header is installed. +class KMiloInterface : public QObject { + Q_OBJECT + public: + KMiloInterface(KMiloD *p) : QObject() { _p = p; } + virtual ~KMiloInterface() {} + + public slots: + int pollMilliSeconds() const { return _p->pollMilliSeconds(); } + bool setPollMilliSeconds(int ms) { return _p->setPollMilliSeconds(ms); } + + void displayText(const QString& text) { _p->displayText(text); } + void displayText(const QString& text, const QPixmap& customPixmap) { _p->displayText(text, customPixmap); } + + void displayProgress(const QString& text, int progress, const QPixmap& customPixmap) { _p->displayProgress(text, progress, customPixmap); } + void displayProgress(const QString& text, int progress) { _p->displayProgress(text, progress); } + + void reconfigure() { _p->reconfigure(); } + + private: + KMiloD *_p; +}; + +} + +#endif diff --git a/kmilo/kmilod/kmilopluginsvc.desktop b/kmilo/kmilod/kmilopluginsvc.desktop new file mode 100644 index 0000000..bccb599 --- /dev/null +++ b/kmilo/kmilod/kmilopluginsvc.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Type=ServiceType +X-KDE-ServiceType=KMilo Plugin + +[PropertyDef::X-KMilo-Plugin-Author] +Type=QString +[PropertyDef::X-KMilo-Default-Enabled] +Type=bool + diff --git a/kmilo/kmilod/monitor.cpp b/kmilo/kmilod/monitor.cpp new file mode 100644 index 0000000..f427ce4 --- /dev/null +++ b/kmilo/kmilod/monitor.cpp @@ -0,0 +1,44 @@ +/* + This file is part of the KDE project + + Copyright (c) 2003 George Staikos <staikos@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ + +#include "monitor.h" + +KMilo::Monitor::Monitor(QObject *parent, const char *name, const QStringList&) +: QObject(parent, name) { + _poll = true; +} + +KMilo::Monitor::~Monitor() { +} + +void KMilo::Monitor::reconfigure(KConfig*) +{ +} + +KMilo::Monitor::DisplayType KMilo::Monitor::poll() { return None; } + +int KMilo::Monitor::progress() const { return 42; } + +QString KMilo::Monitor::message() const { return QString::null; } +QPixmap KMilo::Monitor::customPixmap() const { return QPixmap(); } +bool KMilo::Monitor::init() { return true; } + diff --git a/kmilo/kmilod/monitor.h b/kmilo/kmilod/monitor.h new file mode 100644 index 0000000..ee1581c --- /dev/null +++ b/kmilo/kmilod/monitor.h @@ -0,0 +1,98 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: t; tab-width: 2; -*- +/* + This file is part of the KDE project + + Copyright (c) 2003 George Staikos <staikos@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef _MONITOR_H_ +#define _MONITOR_H_ + +#include <qstring.h> +#include <qstringlist.h> +#include <qpixmap.h> +#include <qobject.h> + +#include <kdemacros.h> + +class KConfig; + +namespace KMilo { +class KMiloInterface; + +class KDE_EXPORT Monitor : public QObject { + public: + Monitor(QObject *parent, const char *name, const QStringList&); + virtual ~Monitor(); + + /** + * Called by kmilod to initialise this plugin. The plugin + * must return true if its hardware is present and it should + * be loaded. If it returns false, it will be unloaded. + */ + virtual bool init(); + + enum DisplayType { None, //! + Error, //! Error + Volume, //! Volume level changed + Mute, //! Volume has been muted + Brightness, //! Brighteness of the screen has changed + Tap, //! Mousttracker tap mode has changed + Sleep //! laptop will sleep in progress() seconds + }; + + /** + * This is called by KMiloD when it polls. Must return + * the type of event that has occurred, or None. + */ + virtual DisplayType poll(); + + /** + * If poll() returns stating that a value has changed, this + * will be called by kmilod to determine the value (0..100) + * for the slider in the display, if necessary. + */ + virtual int progress() const; + + /** + * Message displayed for DisplayType's that are not int + * measurable ( DisplayType::Tap for example ) + */ + virtual QString message() const; + + /** + * Custom pixmap that can be displayed be the themes + * when displaying the DisplayType. + */ + virtual QPixmap customPixmap() const; + + bool shouldPoll() const { return _poll; } + + virtual void reconfigure(KConfig*); + + protected: + bool _poll; // set to false to disable polling. + friend class KMiloD; + void setInterface(KMiloInterface *i) { _interface = i; } + + KMiloInterface *_interface; +}; + +} + +#endif diff --git a/kmilo/powerbook/Makefile.am b/kmilo/powerbook/Makefile.am new file mode 100644 index 0000000..5c3f467 --- /dev/null +++ b/kmilo/powerbook/Makefile.am @@ -0,0 +1,34 @@ +# This file is part of the KDE project +# Copyright (C) 2003 George Staikos <staikos@kde.org> + +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. + +# You should have received a copy of the GNU Library General Public License +# along with this library; see the file COPYING.LIB. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +INCLUDES=-I$(srcdir)/../kmilod $(all_includes) + +kde_module_LTLIBRARIES = kmilo_powerbook.la + +kmilo_powerbook_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) +kmilo_powerbook_la_LIBADD = ../kmilod/libkmilo.la $(LIB_KIO) $(KEYBOARD_LIBS) +kmilo_powerbook_la_SOURCES = pb_monitor.cpp +METASOURCES = AUTO + +noinst_HEADERS = pb_monitor.h + +services_DATA = kmilo_powerbook.desktop +servicesdir = $(kde_servicesdir)/kmilo + +messages: + $(XGETTEXT) $(kmilo_powerbook_la_SOURCES) -o $(podir)/kmilo_powerbook.pot diff --git a/kmilo/powerbook/kmilo_powerbook.desktop b/kmilo/powerbook/kmilo_powerbook.desktop new file mode 100644 index 0000000..842d276 --- /dev/null +++ b/kmilo/powerbook/kmilo_powerbook.desktop @@ -0,0 +1,105 @@ +[Desktop Entry] +Type=Service +ServiceTypes=KMilo Plugin +X-KDE-ModuleType=Plugin +Name=Apple (R) PowerBook (R) Plugin +Name[ar]=ملحق Apple (R) PowerBook (R)ة +Name[br]=Lugent Apple (R) PowerBook (R) +Name[bs]=Apple (R) PowerBook (R) dodatak +Name[ca]=Connector Apple (R) PowerBook (R) +Name[cs]=Apple (R) PowerBook (R) modul +Name[cy]=Ategyn Apple (R) PowerBook (R) +Name[da]=Apple (R) PowerBook (R) plugin +Name[el]=Πρόσθετο Apple (R) PowerBook (R) +Name[es]=Extensión para Apple ® PowerBook ® +Name[et]=Apple (R) PowerBook (R) plugin +Name[eu]=Apple (R) PowerBook (R) Plugina +Name[fa]=Apple (R) PowerBook (R) وصلۀ +Name[fi]=Apple (R) PowerBook (R) -liitännäinen +Name[fr]=Module externe Apple (R) PowerBook (R) +Name[ga]=Breiseán Apple® PowerBook® +Name[he]=תוסף למחשבי Apple (R) PowerBook (R) +Name[hi]=एप्पल (R) पावरबुक (R) प्लगइन +Name[hu]=Apple (R) PowerBook (R) bővítőmodul +Name[is]=Apple (R) PowerBook (R) íforrit +Name[it]=Plugin per Apple (R) PowerBook (R) +Name[ja]=Apple (R) PowerBook (R) プラグイン +Name[ka]=Apple (R) PowerBook (R) მოდული +Name[kk]=Apple (R) PowerBook (R) модулі +Name[km]=កម្មវិធីជំនួយ Apple (R) PowerBook (R) +Name[lt]=Apple (R) PowerBook (R) priedas +Name[mk]=Приклучок за Apple (R) PowerBook (R) +Name[nb]=Programtillegg for Apple (R) PowerBook (R) +Name[nds]=Apple(R) PowerBook(R)-Moduul +Name[ne]=एप्पल (R) पावरबुक (R) प्लगइन +Name[nl]=Apple (R) PowerBook (R)-Plugin +Name[nn]=Tilleggsprogram for Apple ® PowerBook ® +Name[pa]=Apple (R) PowerBook (R) ਪਲੱਗਿੰਨ +Name[pl]=Wtyczka Apple (R) PowerBook (R) +Name[pt]='Plugin' para Apple (R) PowerBook (R) +Name[pt_BR]=Plug-in para Apple (R) PowerBook (R) +Name[ro]=Modul Apple (R) PowerBook (R) +Name[ru]=Модуль Apple® PowerBook® +Name[sk]=Modul pre Apple (R) PowerBook (R) +Name[sl]=Vstavek za Apple (R) PowerBook (R) +Name[sr]=Прикључак за Apple-ов PowerBook +Name[sr@Latn]=Priključak za Apple-ov PowerBook +Name[sv]=Apple ® PowerBook ®-insticksprogram +Name[ta]=ஆப்பிள் (R) பவர்புக் (R) சொருகுப்பொருள் +Name[tg]=Модули Apple (R) PowerBook (R) +Name[tr]=Apple (R) PowerBook (R) Eklentisi +Name[uk]=Втулок Apple (R) PowerBook (R) +Name[uz]=Apple (R) PowerBook (R) plagini +Name[uz@cyrillic]=Apple (R) PowerBook (R) плагини +Name[zh_CN]=Apple(R) PowerBook(R) 插件 +Name[zh_TW]=Apple (R) PowerBook (R) 外掛程式 +Comment=This plugin enables support for special keys on Apple (R) PowerBook (R) laptops via pbbuttonsd. +Comment[ar]=تمكّن الدعم لمفاتيح حاسوب Apple (R) PowerBook (R) المحمول الخاصة عن طريق pbbuttonsd. +Comment[bg]=Тази приставка позволява поддръжката на специалните клавиши на Apple (R) PowerBook (R) laptops. +Comment[bs]=Ovaj dodatak (plugin) omogućuje podršku za posebne tipke na Apple (R) PowerBook (R) laptopima koristeći pbbuttonsd. +Comment[ca]=Aquest connector activa el funcionament per a tecles especials dels Apple (R) PowerBooks (R) via pbbuttonsd. +Comment[cs]=Tento modul umožňuje používat zvláštní klávesy notebooků Apple (R) PowerBook (R) přes pbbuttonsd. +Comment[cy]=Galluoga'r ategyn yma gynhaliaeth ar gyfer bysyll arbennig ar luniaduron Apple (R) PowerBook (R) drwy pbbuttonsd. +Comment[da]=Dette plugin aktivere støtte for specielle taster på Apple (R) PowerBook (R) bærbare via pbbuttonsd. +Comment[de]=Dieses Plugin schaltet die Unterstützung für Sondertasten des Apple (R) Powerbooks (R) via pbbuttonsd ein. +Comment[el]=Αυτό το πρόσθετο ενεργοποιεί την υποστήριξη για ειδικά πλήκτρα στα φορητά Apple (R) PowerBook (R) μέσω του pbbuttonsd. +Comment[es]=Esta extensión activa el soporte de las teclas especiales en los portátiles Apple ® PowerBook ® mediante pbbuttonsd. +Comment[et]=See plugin võimaldab pbbuttonsd vahendusel kasutada eriklahve Apple (R) PowerBook (R) sülearvutil. +Comment[eu]=Plugin honek tekla berezientzako euskarria gaitzen du Apple (R) PowerBook (R) magalekoetan pbbuttonsd bitartez. +Comment[fa]=این وصله، برای کلیدهای ویژۀ روی رایانههای کیفی Apple (R) PowerBook (R) via pbbuttonsd پشتیبانی را فعال میکند. +Comment[fi]=Tänmä liitännäinen mahdollistaa tuen Apple (R) PowerBook (R) kannettavien erikoisnäppäimille pbbuttonsd-ohjelman kautta. +Comment[fr]=Ce module active la gestion des touches spéciales des Apple (R)PowerBook (R) via pbbuttonsd. +Comment[ga]=Tacaíonn an breiseán seo le cnaipí speisialta ar ríomhairí glúine Apple® PowerBook® trí pbbuttonsd. +Comment[he]=התוסף הזה מאפשר תמיכה במקשים מיוחדים על מחשבים הברכיים של Apple (R) PowerBook (R) +Comment[hi]=यह प्लगइन एपल (R) पावर-बुक (R) लैपटॉप पर pbbuttonsd के द्वारा विशिष्ट कुंजी समर्थन सक्षम करता है +Comment[hu]=Ez a bővítőmodul lehetővé teszi az extra billentyűk használatát Apple (R) PowerBook (R) noteszgépeken (a pbbuttonsd szolgáltatáson keresztül). +Comment[is]=Þetta íforrit gerir þér kleyft að nota sérhnappana á Apple (R) PowerBook (R) með pbbuttonsd þjóninum. +Comment[it]=Questo plugin abilita il supporto per i tasti speciali sui portatili Apple (R) PowerBook (R) tramite pbbuttonsd. +Comment[ja]=このプラグインは pbbuttonsd を通して Apple (R) PowerBook (R) ラップトップの特殊キーをサポートします +Comment[ka]=.ეს მოდული რთავს Apple (R) PowerBook (R) ლეპტოპის სპეციალური კლავიშების მხარდაჭერას pbbuttonsd-ის მეშვეობით. +Comment[kk]=Бұл модуль Apple (R) PowerBook (R) ноутбуктерінде pbbuttonsd арқылы арнаулы пернелерді қолдау үшін. +Comment[km]=កម្មវិធីជំនួយនេះបើកការគាំទ្រសម្រាប់គ្រាប់ចុចពិសេសនៅលើកុំព្យូទ័រយួរដៃ Apple (R) PowerBook (R) តាមរយៈ pbbuttonsd ។ +Comment[lt]=Šis priedas įgalina specialiųjų raktų Apple (R) PowerBook (R) nešiojamuose kompiuteriuose palaikymą per pbbuttonsd. +Comment[mk]=Овој приклучок дава поддршка за специјалните копчиња на лаптопите Apple (R) PowerBook (R) преку pbbuttonsd. +Comment[nb]=Dette programtilleggmet muliggjør støtte for spesielle taster på Apple (R) PowerBook (R) bærbare maskiner via pbbuttonsd. +Comment[nds]=Dit Moduul maakt de Sünnertasten-Ünnerstütten för PowerBook(R)-Klappreekners vun Apple(R) via pbbuttonsd an. +Comment[ne]=यो प्लगइनले pbbuttonsd द्वारा एप्पल (R) पावरबुक (R) ल्यापटपका विशेष कुञ्जीका लागि समर्थन सक्षम पार्दछ । +Comment[nl]=Maakt het mogelijk speciale toetsen op Apple (R) PowerBook (R) laptops te gebruiken via pbbuttonsd. +Comment[nn]=Dette programtillegget gjer at du kan bruka spesialtastane på Apple® PowerBook® gjennom pbbuttonsd. +Comment[pl]=Ta wtyczka umożliwia obsługę klawiszy specjalnych na laptopach Apple (R) PowerBook (R) za pomocą pbbuttonsd. +Comment[pt]=Este 'plugin' activa o suporte para as teclas especiais nos portáteis Apple (R) PowerBook (R) através do 'pbbuttonsd'. +Comment[pt_BR]=Este plug-in habilita suporte para teclas especiais nos Apple (R) PowerBooks (R) via pbbuttonsd. +Comment[ro]=Acest modul activează suportul pentru tastele speciale din laptop-urile Apple (R) PowerBook (R), utilizînd "pbbuttonsd". +Comment[ru]=Этот модуль поддерживает специальные клавиши на ноутбуках Apple® PowerBook® через pbbuttonsd. +Comment[sk]=Tento modul obsahuje podporu špeciálnych kláves pre Apple (R) PowerBook (R) pomocou pbbuttonsd. +Comment[sl]=Ta vstavek vam omogoča podboro posebnim ključem na prenosnikih Apple (R) PowerBook (R) preko pbbuttonsd. +Comment[sr]=Овај прикључак омогућава подршку за специјалне тастере на Apple-овим PowerBook лаптопима преко pbbuttonsd. +Comment[sr@Latn]=Ovaj priključak omogućava podršku za specijalne tastere na Apple-ovim PowerBook laptopima preko pbbuttonsd. +Comment[sv]=Det här insticksprogrammet aktiverar stöd för speciella tangenter för Apple ® PowerBook ® via pbbuttonsd. +Comment[ta]=ஆப்பிள் (R) பவர்புக் (R) மடிக் கணினி மூலமாக பிபிபட்டன்எஸ்டி போன்றவைக்கு இந்த சொருகு பொருள் ஆதரிக்கிறது. +Comment[tg]=Ин модул пуштибонии калидҳои махсусро дар компютери дастии Apple (R) PowerBook (R) ба воситаи pbbuttonsd дармегиронад. +Comment[tr]=Bu plugin pbbuttonsd aracılığı ile Apple(R) PowerBook(R) dizüstüler için özel tuş desteğini açar. +Comment[uk]=Цей втулок дозволяє користуватися спеціальними клавішами на лептопах Apple (R) PowerBook (R) за допомогою pbbuttonsd. +Comment[zh_CN]=此插件启用 Apple(R) PowerBook(R) 便携电脑上的特殊按键。 +Comment[zh_TW]=這個外掛程式透過 pbbuttonsd 開啟 Apple(R) PowerBook(R) 筆記型電腦的特殊鍵支援。 +X-KDE-Library=kmilo_powerbook diff --git a/kmilo/powerbook/pb_monitor.cpp b/kmilo/powerbook/pb_monitor.cpp new file mode 100644 index 0000000..6279854 --- /dev/null +++ b/kmilo/powerbook/pb_monitor.cpp @@ -0,0 +1,127 @@ +/* + This file is part of the KDE project + + Copyright (c) 2003 George Staikos <staikos@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ + +#include "pb_monitor.h" + +#include <sys/types.h> +#include <unistd.h> + +#include <kgenericfactory.h> + +extern "C" { +#include <pbbipc.h> +} + +namespace KMilo { + +PowerBookMonitor::PowerBookMonitor(QObject *parent, const char *name, const QStringList& args) +: Monitor(parent, name, args) { + _serverPort = -1; + _clientPort = -1; + _progress = 0; +} + + +PowerBookMonitor::~PowerBookMonitor() { +struct pbb_message msg; + if (_serverPort >= 0) { + msg.code = UNREGISTERCLIENT; + msg.value = _clientPort; + put_message(_serverPort, &msg); + } + + if (_clientPort >= 0) { + remove_msgport(_clientPort); + } +} + + +bool PowerBookMonitor::init() { + _serverPort = find_msgport(SERVERPORTKEY); + if (_serverPort < 0) { + return false; + } + + _clientPort = create_msgport(getpid()); + if (_clientPort < 0) { + _serverPort = -1; + return false; + } + + // Register + struct pbb_message msg; + msg.code = REGISTERCLIENT; + msg.value = _clientPort; + if (put_message(_serverPort, &msg) < 0) { + remove_msgport(_clientPort); + _clientPort = -1; + _serverPort = -1; + return false; + } + +return true; +} + + +Monitor::DisplayType PowerBookMonitor::poll() { +Monitor::DisplayType rc = None; +struct pbb_message msg; + + if (_serverPort < 0 || _clientPort < 0) + return Error; + + // Drain the queue, send the last message + while (0 == get_message(_clientPort, 0, &msg)) { + switch (msg.code) { + case DISPLAYVOLUME: + rc = Monitor::Volume; + _progress = msg.value; + break; + case DISPLAYMUTE: + rc = Monitor::Mute; + _progress = msg.value; + break; + case DISPLAYBRIGHTNESS: + rc = Monitor::Brightness; + _progress = msg.value*100/15; + break; + case REGFAILED: + case CLIENTEXIT: + rc = Monitor::Error; + break; + default: + break; + } + } + +return rc; +} + + +int PowerBookMonitor::progress() const { + return _progress; +} + +}; + +K_EXPORT_COMPONENT_FACTORY(kmilo_powerbook, KGenericFactory<PowerBookMonitor>("kmilo_powerbook")) + diff --git a/kmilo/powerbook/pb_monitor.h b/kmilo/powerbook/pb_monitor.h new file mode 100644 index 0000000..6d2736d --- /dev/null +++ b/kmilo/powerbook/pb_monitor.h @@ -0,0 +1,42 @@ +/* + This file is part of the KDE project + + Copyright (c) 2003 George Staikos <staikos@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ +#ifndef _PBMONITOR_H_ +#define _PBMONITOR_H_ + +#include "monitor.h" + +class PowerBookMonitor : public KMilo::Monitor { + public: + PowerBookMonitor(QObject *parent, const char *name, const QStringList&); + virtual ~PowerBookMonitor(); + + virtual bool init(); + virtual DisplayType poll(); + virtual int progress() const; + + private: + int _clientPort; + int _serverPort; + int _progress; +}; + +#endif diff --git a/kmilo/powerbook2/Makefile.am b/kmilo/powerbook2/Makefile.am new file mode 100644 index 0000000..5c3f467 --- /dev/null +++ b/kmilo/powerbook2/Makefile.am @@ -0,0 +1,34 @@ +# This file is part of the KDE project +# Copyright (C) 2003 George Staikos <staikos@kde.org> + +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. + +# You should have received a copy of the GNU Library General Public License +# along with this library; see the file COPYING.LIB. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +INCLUDES=-I$(srcdir)/../kmilod $(all_includes) + +kde_module_LTLIBRARIES = kmilo_powerbook.la + +kmilo_powerbook_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) +kmilo_powerbook_la_LIBADD = ../kmilod/libkmilo.la $(LIB_KIO) $(KEYBOARD_LIBS) +kmilo_powerbook_la_SOURCES = pb_monitor.cpp +METASOURCES = AUTO + +noinst_HEADERS = pb_monitor.h + +services_DATA = kmilo_powerbook.desktop +servicesdir = $(kde_servicesdir)/kmilo + +messages: + $(XGETTEXT) $(kmilo_powerbook_la_SOURCES) -o $(podir)/kmilo_powerbook.pot diff --git a/kmilo/powerbook2/kmilo_powerbook.desktop b/kmilo/powerbook2/kmilo_powerbook.desktop new file mode 100644 index 0000000..9aff481 --- /dev/null +++ b/kmilo/powerbook2/kmilo_powerbook.desktop @@ -0,0 +1,106 @@ +[Desktop Entry] +Type=Service +ServiceTypes=KMilo Plugin +X-KDE-ModuleType=Plugin +Name=Apple PowerBook Plugin +Name[ar]=ملحق Apple PowerBook +Name[br]=Lugent Apple PowerBook +Name[bs]=Apple PowerBook dodatak +Name[ca]=Connector Apple PowerBook +Name[cs]=Apple PowerBook modul +Name[cy]=Ategyn Apple PowerBook +Name[el]=Πρόσθετο Apple PowerBook +Name[es]=Extensión del PowerBook de Apple +Name[et]=Apple PowerBooki plugin +Name[eu]=Apple PowerBook Plugina +Name[fa]=Apple PowerBook وصلۀ +Name[fi]=Apple PowerBook -liitännäinen +Name[fr]=Module externe Apple PowerBook +Name[ga]=Breiseán Apple® PowerBook® +Name[he]=תוסף ל-Apple PowerBook +Name[hi]=एपल पावर-बुक प्लगइन +Name[hu]=Apple PowerBook bővítőmodul +Name[is]=Apple PowerBook íforrit +Name[it]=Plugin per Apple PowerBook +Name[ja]=Apple PowerBook プラグイン +Name[ka]=Apple PowerBook მოდული +Name[kk]=Apple PowerBook модулі +Name[km]=កម្មវិធីជំនួយ Apple PowerBook +Name[lt]=Apple PowerBook priedas +Name[mk]=Приклучок за Apple PowerBook +Name[ms]= Plug masuk Apple PowerBook +Name[nb]=Programtillegg for Apple PowerBook +Name[nds]=Apple PowerBook-Moduul +Name[ne]=एप्पल पावरबुक प्लगइन +Name[nl]=Apple PowerBook-plugin +Name[nn]=Programtillegg for Apple PowerBook +Name[pa]=Apple PowerBook ਪਲੱਗਿੰਨ +Name[pl]=Wtyczka Apple PowerBook +Name[pt]='Plugin' para Apple PowerBook +Name[pt_BR]=Plug-in para Apple PowerBook +Name[ro]=Modul Apple PowerBook +Name[ru]=Модуль Apple PowerBook +Name[sk]=Module pre Applet PowerBook +Name[sl]=Vstavek za Apple PowerBook +Name[sr]=Прикључак за Apple-ов PowerBook +Name[sr@Latn]=Priključak za Apple-ov PowerBook +Name[sv]=Apple PowerBook-insticksprogram +Name[ta]=ஆப்பிள் பவர்புக் சொருகுப்பொருள் +Name[tg]=Модули Apple PowerBook +Name[tr]=Apple PowerBook Eklentisi +Name[uk]=Втулок Apple PowerBook +Name[uz]=Apple PowerBook plagini +Name[uz@cyrillic]=Apple PowerBook плагини +Name[zh_CN]=Apple PowerBook 插件 +Name[zh_TW]=Apple Powerbook 外掛程式 +Comment=This plugin enabled support for special keys on Apple PowerBooks via pbbuttonsd. +Comment[ar]=تمكّن الدعم لمفاتيح حاسوب Apple PowerBook المحمول الخاصة عن طريق pbbuttonsd. +Comment[bg]=Тази приставка позволява поддръжката на специалните клавиши на Apple PowerBooks. +Comment[bs]=Ovaj dodatak (plugin) omogućuje podršku za posebne tipke na Apple PowerBooks laptopima koristeći pbbuttonsd. +Comment[ca]=Aquest connector activa el funcionament per a tecles especials dels Apple PowerBooks via pbbuttonsd. +Comment[cs]=Tento modul umožňuje používat zvláštní klávesy notebooků Apple PowerBook přes pbbuttonsd. +Comment[cy]=Galluoga'r ategyn yma gynhaliaeth ar gyfer bysyll arbennig ar yr Apple PowerBook drwy pbbuttonsd. +Comment[da]=Dette plugin aktivere støtte for specielle taster på Apple PowerBooks via pbbuttonsd. +Comment[de]=Dieses Plugin schaltet die Unterstützung für Sondertasten des Apple Powerbooks via pbbuttonsd ein. +Comment[el]=Αυτό το πρόσθετο ενεργοποιεί την υποστήριξη για ειδικά πλήκτρα στα Apple PowerBooks μέσω του pbbuttonsd. +Comment[es]=Esta extensión activa el soporte de las teclas especiales en los PowerBooks de Apple mediante «pbbuttonsd». +Comment[et]=See plugin võimaldab pbbuttonsd vahendusel kasutada eriklahve Apple PowerBooksil +Comment[eu]=Plugin honek tekla berezientzako euskarria gaitu du Apple PowerBook magalekoetan pbbuttonsd bitartez. +Comment[fa]=این وصله، برای کلیدهای ویژۀ Apple PowerBooks via pbbuttonsd، پشتیبانی را فعال میکند. +Comment[fi]=Tämä sovelma mahdollisti tuen Apple Powerbook kannettavien erikoisnäppäimille pbbuttonsd-ohjelman kautta. +Comment[fr]=Ce module active la gestion des touches spéciales des Apple PowerBook via pbbuttonsd. +Comment[ga]=Tacaíonn an breiseán seo le cnaipí speisialta ar ríomhairí glúine Apple® PowerBook® trí pbbuttonsd. +Comment[he]=התוסף הזה מאפשר תמיכה במקשים מיוחדים על מחשבים הברכיים של Apple PowerBook +Comment[hi]=यह प्लगइन एपल पावर-बुक पर pbbuttonsd के द्वारा विशिष्ट कुंजी समर्थन सक्षम करता है +Comment[hu]=Az Apple PowerBook noteszgépek speciális kezelőelemeinek beállítása (a pbbuttonsd szolgáltatáson keresztül) +Comment[is]=Þetta íforrit gerir þér kleyft að nota sérhnappana á Apple PowerBook með pbbuttonsd þjóninum. +Comment[it]=Questo plugin abilita il supporto per i tasti speciali sui portatili Apple PowerBook tramite pbbuttonsd. +Comment[ja]=このプラグインは pbbuttonsd を通して Apple PowerBook の特殊キーをサポートします +Comment[ka]= ეს მოდული რთავს Apple PowerBooks-ის სპეციალური კლავიშების მხარდაჭერას pbbuttonsd-ის მეშვეობით. +Comment[kk]=Бұл модуль Apple PowerBook ноутбуктерінде pbbuttonsd арқылы арнаулы пернелерді қолдау үшін. +Comment[km]=កម្មវិធីជំនួយនេះបើកការគាំទ្រសម្រាប់គ្រាប់ចុចពិសេសនៅលើ Apple PowerBooks តាមរយៈ pbbuttonsd ។ +Comment[lt]=Šis priedas įgalina specialiųjų raktų Apple PowerBook nešiojamuose kompiuteriuose palaikymą per pbbuttonsd. +Comment[mk]=Овој приклучок дава поддршка за специјалните копчиња на Apple PowerBooks преку pbbuttonsd. +Comment[ms]=Plug masuk membolehkan sokongan untuk kekunci khas Apple PowerBooks menerusi pbbuttonsd. +Comment[nb]=Dette programtillegget muliggjør støtte for spesille taster på Apple PowerBooks via pbbuttonsd. +Comment[nds]=Dit Moduul maakt de Sünnertasten-Ünnerstütten för Apple-PowerBooks via pbbuttonsd an. +Comment[ne]=यो प्लगइनले pbbuttonsd द्वारा एप्पल पावरबुक विशेष कुञ्जीका लागि समर्थन सक्षम पार्दछ । +Comment[nl]=Maakt het mogelijk speciale toetsen op Apple (R) PowerBook (R) laptops te gebruiken via pbbuttonsd. +Comment[nn]=Dette programtillegget gjer at du kan bruka spesialtastane på Apple PowerBook gjennom pbbuttonsd. +Comment[pl]=Ta wtyczka umożliwia obsługę klawiszy specjalnych na laptopach Apple PowerBook za pomocą pbbuttonsd. +Comment[pt]=Este 'plugin' activa o suporte para as teclas especiais nos portáteis Apple PowerBook através do 'pbbuttonsd'. +Comment[pt_BR]=Este plug-in habilita suporte para teclas especiais nos Apple PowerBooks via pbbuttonsd. +Comment[ro]=Acest modul activează suportul pentru tastele speciale din laptop-urile Apple PowerBook, utilizînd "pbbuttonsd". +Comment[ru]=Этот модуль поддерживает специальные клавиши на Apple PowerBooks через pbbuttonsd. +Comment[sk]=Tento modul obsahuje podporu špeciálnych kláves pre Apple (R) PowerBook (R) pomocou pbbuttonsd. +Comment[sl]=Ta vstavek vam omogoča podboro posebnim ključem na prenosnikih Apple PowerBook preko pbbuttonsd. +Comment[sr]=Овај прикључак омогућава подршку за специјалне тастере на Apple-овим PowerBook-овима преко pbbuttonsd. +Comment[sr@Latn]=Ovaj priključak omogućava podršku za specijalne tastere na Apple-ovim PowerBook-ovima preko pbbuttonsd. +Comment[sv]=Det här insticksprogrammet aktiverar stöd för speciella tangenter för Apple PowerBook via pbbuttonsd. +Comment[ta]=ஆப்பிள் பவர்புக்ஸ் மூலமாக பிபிபட்டன்எஸ்டிக்கு இந்த சொருகுப் பொருள் ஆதரவளிக்கிறது +Comment[tg]=Ин модул пуштибонии калидҳои махсусро дар компютери дастии Apple PowerBooks ба воситаи pbbuttonsd дармегиронад. +Comment[tr]=Bu plugin pbbuttonsd aracılığı ile Apple PowerBook dizüstüler için özel tuş desteğini açar. +Comment[uk]=Цей втулок дозволив користуватися спеціальними клавішами на лептопах Apple PowerBook за допомогою pbbuttonsd. +Comment[zh_CN]=此插件启用 Apple PowerBook 电源按钮的特殊按键支持。 +Comment[zh_TW]=這個外掛程式透過 pbbuttonsd 開啟 Apple Powerbooks 特殊鍵支援。 +X-KDE-Library=kmilo_powerbook diff --git a/kmilo/powerbook2/pb_monitor.cpp b/kmilo/powerbook2/pb_monitor.cpp new file mode 100644 index 0000000..84c72d5 --- /dev/null +++ b/kmilo/powerbook2/pb_monitor.cpp @@ -0,0 +1,165 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: t; tab-width: 2; -*- +/* + This file is part of the KDE project + + Copyright (c) 2003 Zack Rusin <staikos@kde.org> + Pretty much ripped of from : + George Staikos <staikos@kde.org> :) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ + +#include "pb_monitor.h" + +#include <kgenericfactory.h> +#include <kdebug.h> + +#include <sys/types.h> +#include <unistd.h> + +extern "C" { +//Hack because of the fact that pbb author is using C++ keywords in the code +//among which is "template"... +#undef template +#include <pbb.h> + +// TAG_BRIGHTNESS was renamed to TAG_LCDBRIGHTNESS in pbbuttons +// 0.6.1-2 +#ifndef TAG_LCDBRIGHTNESS +#define TAG_LCDBRIGHTNESS TAG_BRIGHTNESS +#endif +} + +#define BUFFERLEN 200 +const QString tpmodes[] = { I18N_NOOP("No Tap"), I18N_NOOP("Tap"), I18N_NOOP("Drag"), I18N_NOOP("Lock") }; + +namespace KMilo { + +PowerBookMonitor::PowerBookMonitor(QObject *parent, const char *name, + const QStringList& args) + : Monitor(parent, name, args), + m_progress( 0 ) +{ + init_libpbb(); +} + +PowerBookMonitor::~PowerBookMonitor() +{ + ipc_exit(); +} + + +bool PowerBookMonitor::init() +{ +// pbbuttons 0.6.7 or newer +#ifdef CLIENT_REGISTER + return ( ipc_init( "kmilo", LIBMODE_CLIENT, CLIENT_REGISTER ) == 0 ); +#else + return ( ipc_init( LIBMODE_CLIENT, 1 ) == 0 ); +#endif +} + + +Monitor::DisplayType PowerBookMonitor::poll() +{ + Monitor::DisplayType rc = None; + // Drain the queue, send the last message + struct tagitem* tag = readMessage(); + m_message = QString::null; + while ( tag && tag->tag != TAG_END ) { + switch ( tag->tag ) { + case TAG_VOLUME: + rc = Monitor::Volume; + m_progress = (int)tag->data; + break; + case TAG_MUTE: + rc = Monitor::Mute; + m_progress = (int)tag->data; + break; + case TAG_LCDBRIGHTNESS: + rc = Monitor::Brightness; + m_progress = ((int)tag->data)*100/15; + break; + case TAG_TPMODE: + { + rc = Monitor::Tap; + QString marg = tpmodes[ tag->data & 3 ]; + m_message = i18n( "Operating mode set to: %1." ).arg( marg ); + } + break; + default: + break; + } + ++tag; + } + + if ( m_sleep ) { + rc = Monitor::Sleep; + } + + return rc; +} + + +int PowerBookMonitor::progress() const +{ + return m_progress; +} + +QString PowerBookMonitor::message() const +{ + return m_message; +} + +struct tagitem* PowerBookMonitor::readMessage() +{ + char buffer[BUFFERLEN]; + m_sleep = false; + if ( (ipc_receive(buffer, BUFFERLEN)) >=0 ) { + if ( buffer ) { + struct pbbmessage *msg = reinterpret_cast<struct pbbmessage*>( buffer ); + switch ( msg->action ) { + case REGFAILED: + kdDebug()<<"PBB registration failed"<<endl; + break; + case CLIENTEXIT: + kdDebug()<<"PBB client exited"<<endl; + break; + case CHANGEVALUE: + return msg->taglist; + break; + case WARNING: + if ( msg->taglist->data == 0 ) { + m_message = i18n( "The computer will sleep now." ); + } else { + m_message = i18n( "The computer will sleep in %n second.", + "The computer will sleep in %n seconds.", + msg->taglist->data ); + } + m_sleep = true; + kdDebug()<<"PBB Warning"<<endl; + break; + } + } + } + return 0; +} + +} + +K_EXPORT_COMPONENT_FACTORY(kmilo_powerbook, KGenericFactory<KMilo::PowerBookMonitor>("kmilo_powerbook")) + diff --git a/kmilo/powerbook2/pb_monitor.h b/kmilo/powerbook2/pb_monitor.h new file mode 100644 index 0000000..a6bf651 --- /dev/null +++ b/kmilo/powerbook2/pb_monitor.h @@ -0,0 +1,55 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: t; tab-width: 2; -*- +/* + This file is part of the KDE project + + Copyright (c) 2003 Zack Rusin <staikos@kde.org> + Pretty much ripped of from : + George Staikos <staikos@kde.org> :) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ +#ifndef _PBMONITOR_H_ +#define _PBMONITOR_H_ + +#include "monitor.h" + +struct tagitem; + +namespace KMilo { + +class PowerBookMonitor : public KMilo::Monitor +{ +public: + PowerBookMonitor(QObject *parent, const char *name, const QStringList&); + virtual ~PowerBookMonitor(); + + virtual bool init(); + virtual DisplayType poll(); + virtual int progress() const; + virtual QString message() const; + +private: + struct tagitem* readMessage(); +private: + int m_progress; + QString m_message; + bool m_sleep; +}; + +} + +#endif diff --git a/kmilo/thinkpad/Makefile.am b/kmilo/thinkpad/Makefile.am new file mode 100644 index 0000000..e82c26b --- /dev/null +++ b/kmilo/thinkpad/Makefile.am @@ -0,0 +1,36 @@ +# This file is part of the KDE project +# Copyright (C) 2003 George Staikos <staikos@kde.org> + +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. + +# You should have received a copy of the GNU Library General Public License +# along with this library; see the file COPYING.LIB. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +SUBDIRS = . kcmthinkpad + +INCLUDES=-I$(srcdir)/../kmilod $(all_includes) + +kde_module_LTLIBRARIES = kmilo_thinkpad.la + +kmilo_thinkpad_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) +kmilo_thinkpad_la_LIBADD = ../kmilod/libkmilo.la $(LIB_KIO) +kmilo_thinkpad_la_SOURCES = thinkpad.cpp +METASOURCES = AUTO + +noinst_HEADERS = thinkpad.h + +services_DATA = kmilo_thinkpad.desktop +servicesdir = $(kde_servicesdir)/kmilo + +messages: + $(XGETTEXT) $(kmilo_thinkpad_la_SOURCES) -o $(podir)/kmilo_thinkpad.pot diff --git a/kmilo/thinkpad/README b/kmilo/thinkpad/README new file mode 100644 index 0000000..56b5da0 --- /dev/null +++ b/kmilo/thinkpad/README @@ -0,0 +1,61 @@ +Thinkpad Buttons KMilo Plugin + +Jonathan Riddell jr@jriddell.org, January 2004 + +A port of tpb ( http://www.nongnu.org/tpb/ ) to KMilo. + +KMilo is a service for kded, the KDE daemon. KMilo is new to KDE 3.2. +It allows plugins which interact with the special buttons found on +some keyboards and laptops. + +This KMilo plugin reads the nvram used in IBM Thinkpads. You need the +Linux nvram module ('insmod nvram') and to create a device node +('mknod /dev/nvram c 10 144'). + +Thinkpad R30/R31 models do not have a hardware volume control and so +require software volume control. Other models need software volume +control only if you want a volume change step different from the +builtin value (14). This required write access to nvram ('chmod 666 +/dev/nvram') and could potentially damage the machine. + +A KControl Centre module is included to configure the values including +whether this service is run or not (by default it is not). + +INSTALL: + +Download kdeutils source for kde 3.2 or newer. Then compile as +usual starting from the kdeutils directory: + + make -f Makefile.cvs + ./configure + cd kmilo + make + sudo make install + +Restarting kded is probably needed: + + kdekillall kded + kded + +HISTORY: + +05 January 2004, Initial release, most things working + +21 January 2004, Bug fix, stop it crashing if starting without kmix + runningdisplay rounded min and max volume levels, pda icon for + KControl module + +24 January 2004, Stopped it start kmix on kded startup even when set not to run + +28 January 2004, Added to KDE CVS + +TODO: + + - Need a better icon for the KControl module + - Test on machines other than my R31, which only has volume, + brightness buttons, light and 'Thinkpad' buttons + - Add options for the 'Thinkpad' and other action buttons to do something (e.g. bring up Konqueror) + For this sort of thing we really want integration with KHotKeys but I'm not sure how + + + diff --git a/kmilo/thinkpad/kcmthinkpad/Makefile.am b/kmilo/thinkpad/kcmthinkpad/Makefile.am new file mode 100644 index 0000000..4e70c40 --- /dev/null +++ b/kmilo/thinkpad/kcmthinkpad/Makefile.am @@ -0,0 +1,15 @@ +kde_module_LTLIBRARIES = kcm_thinkpad.la + +kcm_thinkpad_la_SOURCES = kcmthinkpad_general.ui main.cpp + +kcm_thinkpad_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) +kcm_thinkpad_la_LIBADD = $(LIB_KIO) + +INCLUDES= $(all_includes) -DKDE_BINDIR="\"$(bindir)\"" + +kcm_thinkpad_la_METASOURCES = AUTO + +messages: rc.cpp + $(XGETTEXT) *.cpp -o $(podir)/kcmthinkpad.pot + +xdg_apps_DATA = thinkpad.desktop diff --git a/kmilo/thinkpad/kcmthinkpad/kcmthinkpad_general.ui b/kmilo/thinkpad/kcmthinkpad/kcmthinkpad_general.ui new file mode 100644 index 0000000..771b7bf --- /dev/null +++ b/kmilo/thinkpad/kcmthinkpad/kcmthinkpad_general.ui @@ -0,0 +1,307 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KCMThinkpadGeneral</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KCMThinkpadGeneral</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>559</width> + <height>548</height> + </rect> + </property> + <property name="caption"> + <string>KVaio: General Options</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>tlOff</cstring> + </property> + <property name="frameShape"> + <enum>NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>Plain</enum> + </property> + <property name="text"> + <string>Could not read /dev/nvram. If you have an IBM Thinkpad load the nvram Linux module <em>insmod nvram</em> and create the node <em>mknod /dev/nvram c 10 144</em> then make the device readable <em>chmod 664 /dev/nvram</em> or writable <em>chmod 666 /dev/nvram</em>.<p> nvram must be writable for software volume control required for R30/R31 models and for using a custom volume change step.</string> + </property> + </widget> + <widget class="QButtonGroup" row="1" column="0"> + <property name="name"> + <cstring>bgGeneral</cstring> + </property> + <property name="title"> + <string>Thinkpad Button Options</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox" row="0" column="0"> + <property name="name"> + <cstring>mCbRun</cstring> + </property> + <property name="text"> + <string>Run Thinkpad Buttons KMilo plugin</string> + </property> + </widget> + <widget class="QCheckBox" row="1" column="0"> + <property name="name"> + <cstring>mCbSoftwareVolume</cstring> + </property> + <property name="text"> + <string>Change volume in software (required by R30/R31)</string> + </property> + </widget> + <widget class="QLayoutWidget" row="2" column="0"> + <property name="name"> + <cstring>layout27</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel" row="4" column="0"> + <property name="name"> + <cstring>textLabel2_5</cstring> + </property> + <property name="text"> + <string>Command for Mail button:</string> + </property> + </widget> + <widget class="QLabel" row="5" column="0"> + <property name="name"> + <cstring>textLabel2_6</cstring> + </property> + <property name="text"> + <string>Command for FN-Zoom button:</string> + </property> + </widget> + <widget class="KURLRequester" row="2" column="1"> + <property name="name"> + <cstring>commandExecHome</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>1</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + <widget class="QLabel" row="3" column="0"> + <property name="name"> + <cstring>textLabel2_4</cstring> + </property> + <property name="text"> + <string>Command for Search button:</string> + </property> + </widget> + <widget class="KURLRequester" row="1" column="1"> + <property name="name"> + <cstring>commandExec</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>1</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>volumeStepLabel</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>Plain</enum> + </property> + <property name="text"> + <string>Volume step (out of 100):</string> + </property> + </widget> + <widget class="KURLRequester" row="5" column="1"> + <property name="name"> + <cstring>commandExecZoom</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>1</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + <widget class="QLabel" row="2" column="0"> + <property name="name"> + <cstring>textLabel2_3</cstring> + </property> + <property name="text"> + <string>Command for Home button:</string> + </property> + </widget> + <widget class="QSpinBox" row="0" column="1"> + <property name="name"> + <cstring>mSpinboxVolumeStep</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>1</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maxValue"> + <number>30</number> + </property> + <property name="minValue"> + <number>1</number> + </property> + </widget> + <widget class="KURLRequester" row="3" column="1"> + <property name="name"> + <cstring>commandExecSearch</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>1</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + <widget class="QLabel" row="1" column="0"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="text"> + <string>Command for Thinkpad button:</string> + </property> + </widget> + <widget class="KURLRequester" row="4" column="1"> + <property name="name"> + <cstring>commandExecMail</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>1</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </grid> + </widget> + </grid> + </widget> + </grid> +</widget> +<customwidgets> +</customwidgets> +<connections> + <connection> + <sender>mCbRun</sender> + <signal>toggled(bool)</signal> + <receiver>KCMThinkpadGeneral</receiver> + <slot>slotChanged()</slot> + </connection> + <connection> + <sender>mCbSoftwareVolume</sender> + <signal>toggled(bool)</signal> + <receiver>KCMThinkpadGeneral</receiver> + <slot>slotChanged()</slot> + </connection> + <connection> + <sender>mSpinboxVolumeStep</sender> + <signal>valueChanged(int)</signal> + <receiver>KCMThinkpadGeneral</receiver> + <slot>slotChanged()</slot> + </connection> + <connection> + <sender>commandExec</sender> + <signal>textChanged(const QString&)</signal> + <receiver>KCMThinkpadGeneral</receiver> + <slot>slotChanged()</slot> + </connection> + <connection> + <sender>commandExecHome</sender> + <signal>textChanged(const QString&)</signal> + <receiver>KCMThinkpadGeneral</receiver> + <slot>slotChanged()</slot> + </connection> + <connection> + <sender>commandExecMail</sender> + <signal>textChanged(const QString&)</signal> + <receiver>KCMThinkpadGeneral</receiver> + <slot>slotChanged()</slot> + </connection> + <connection> + <sender>commandExecSearch</sender> + <signal>textChanged(const QString&)</signal> + <receiver>KCMThinkpadGeneral</receiver> + <slot>slotChanged()</slot> + </connection> + <connection> + <sender>commandExecZoom</sender> + <signal>textChanged(const QString&)</signal> + <receiver>KCMThinkpadGeneral</receiver> + <slot>slotChanged()</slot> + </connection> +</connections> +<tabstops> + <tabstop>mCbRun</tabstop> + <tabstop>mCbSoftwareVolume</tabstop> + <tabstop>mSpinboxVolumeStep</tabstop> + <tabstop>commandExec</tabstop> + <tabstop>commandExecHome</tabstop> + <tabstop>commandExecSearch</tabstop> + <tabstop>commandExecMail</tabstop> +</tabstops> +<includes> + <include location="local" impldecl="in implementation">kcmthinkpad_general.ui.h</include> +</includes> +<signals> + <signal>changed();</signal> +</signals> +<slots> + <slot>slotChanged()</slot> +</slots> +<layoutdefaults spacing="6" margin="11"/> +<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/> +<includehints> + <includehint>kurlrequester.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kurlrequester.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kurlrequester.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kurlrequester.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kurlrequester.h</includehint> + <includehint>kpushbutton.h</includehint> +</includehints> +</UI> diff --git a/kmilo/thinkpad/kcmthinkpad/kcmthinkpad_general.ui.h b/kmilo/thinkpad/kcmthinkpad/kcmthinkpad_general.ui.h new file mode 100644 index 0000000..6ccc675 --- /dev/null +++ b/kmilo/thinkpad/kcmthinkpad/kcmthinkpad_general.ui.h @@ -0,0 +1,36 @@ +/* + * kcmthinkpad_general.uih + * + * Copyright (C) 2004 Jonathan Riddell <jr@jriddell.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. + * + */ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename functions or slots use +** Qt Designer which will update this file, preserving your code. Create an +** init() function in place of a constructor, and a destroy() function in +** place of a destructor. +*****************************************************************************/ +#include <kdialog.h> + +void KCMThinkpadGeneral::slotChanged() { + emit(changed()); +} + + + diff --git a/kmilo/thinkpad/kcmthinkpad/main.cpp b/kmilo/thinkpad/kcmthinkpad/main.cpp new file mode 100644 index 0000000..1b8b4bd --- /dev/null +++ b/kmilo/thinkpad/kcmthinkpad/main.cpp @@ -0,0 +1,189 @@ +/* + * main.cpp + * + * Copyright (C) 2004 Jonathan Riddell <jr@jriddell.org> + * + * Based on kcm_kvaio + * Copyright (C) 2003 Mirko Boehm (mirko@kde.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 <qlabel.h> +#include <qlayout.h> +#include <qcheckbox.h> +#include <qspinbox.h> +#include <qfile.h> +#include <qbuttongroup.h> + +#include <dcopclient.h> +#include <kgenericfactory.h> +#include <kaboutdata.h> +#include <kdebug.h> +#include <kconfig.h> +#include <kurlrequester.h> +#include <kcmodule.h> + +#ifdef Q_OS_FREEBSD +#include <sys/types.h> +#include <sys/sysctl.h> +#endif + +#include "kcmthinkpad_general.h" + +#include <dcopclient.h> + +#include "main.h" +#include "main.moc" + +typedef KGenericFactory<KCMThinkpadModule, QWidget> KCMThinkpadModuleFactory; +K_EXPORT_COMPONENT_FACTORY( kcm_thinkpad, KCMThinkpadModuleFactory("kcmthinkpad")) + +#define CONFIG_FILE "kmilodrc" + +KCMThinkpadModule::KCMThinkpadModule(QWidget* parent, const char* name, const QStringList&) + : KCModule(KCMThinkpadModuleFactory::instance(), parent, name) { + KAboutData* about = + new KAboutData(I18N_NOOP("kcmthinkpad"), + I18N_NOOP("KDE Control Module for IBM Thinkpad " + "Laptop Hardware"), + 0, 0, KAboutData::License_GPL, + "(c) 2004 Jonathan Riddell"); + + about->addAuthor("Jonathan Riddell", + I18N_NOOP("Original author"), + "jr@jriddell.org"); + setAboutData( about ); + + QVBoxLayout* layout = new QVBoxLayout(this); + m_KCMThinkpadGeneral = new KCMThinkpadGeneral(this); + layout->addWidget( m_KCMThinkpadGeneral ); + layout->addStretch(); + + load(); + + //try and open /dev/nvram + m_nvramReadable = false; + m_nvramWriteable = false; + +#ifdef Q_OS_FREEBSD + // Look if the sysctl tree of acpi_ibm is in place + u_int n = 0; + size_t len = sizeof(n); + if (m_nvramReadable = ( sysctlbyname("dev.acpi_ibm.0.volume", &n, &len, NULL, 0) != -1 )) + m_nvramWriteable = ( sysctlbyname("dev.acpi_ibm.0.volume", NULL, NULL, &n, len) != -1 ); + + if (!m_nvramReadable) { + setButtons(buttons() & ~Default); + m_KCMThinkpadGeneral->bgGeneral->setEnabled(false); + m_KCMThinkpadGeneral->tlOff->setText(i18n("In order to use the Thinkpad Buttons KMilo Plugin, " + "you have to load the acpi_ibm(4) driver.")); + } else if (!m_nvramWriteable) { + m_KCMThinkpadGeneral->tlOff->setText(i18n("Could not write to dev.acpi_ibm.0.volume. " + "Using software volume, required for " + "R30/R31 models, or using a custom volume " + "change step is disabled.")); +#else + QFile nvramFile(m_nvramFile); + if ( nvramFile.open(IO_ReadOnly) ) { + m_nvramReadable = true; + nvramFile.close(); + } + if ( nvramFile.open(IO_WriteOnly) ) { + m_nvramWriteable = true; + nvramFile.close(); + } + + if (!m_nvramReadable) { + setButtons(buttons() & ~Default); + m_KCMThinkpadGeneral->bgGeneral->setEnabled(false); + } else if (!m_nvramWriteable) { + m_KCMThinkpadGeneral->tlOff->setText(i18n("Could not write to %1. " + "To use the software volume, required for " + "R30/R31 models and to use a custom volume " + "change step, set the nvram device to world " + "writeable: <em>chmod 666 " + "/dev/nvram</em>").arg(m_nvramFile)); +#endif + } else { + m_KCMThinkpadGeneral->tlOff->setText(i18n("Thinkpad Buttons KMilo Plugin Ready For Configuration")); + } + + connect( m_KCMThinkpadGeneral, SIGNAL(changed()), SLOT(changed())); + +} + +void KCMThinkpadModule::save() { + if (!m_nvramReadable) { + return; + } + DCOPClient client; + + KConfig config(CONFIG_FILE); + config.setGroup("thinkpad"); + + config.writeEntry("run", m_KCMThinkpadGeneral->mCbRun->isChecked()); + config.writeEntry("softwareVolume", m_KCMThinkpadGeneral->mCbSoftwareVolume->isChecked()); + config.writeEntry("volumeStep", m_KCMThinkpadGeneral->mSpinboxVolumeStep->value()); + config.writeEntry("buttonThinkpad", m_KCMThinkpadGeneral->commandExec->url()); + config.writeEntry("buttonHome", m_KCMThinkpadGeneral->commandExecHome->url()); + config.writeEntry("buttonSearch", m_KCMThinkpadGeneral->commandExecSearch->url()); + config.writeEntry("buttonMail", m_KCMThinkpadGeneral->commandExecMail->url()); + config.writeEntry("buttonZoom", m_KCMThinkpadGeneral->commandExecZoom->url()); + config.sync(); + + if (client.attach()) { + QByteArray data, replyData; + QCString replyType; + + if (!client.call("kded", "kmilod", "reconfigure()", data, replyType, replyData)) { + kdDebug() << "KCMThinkpad::showTextMsg: " + << "there was an error using DCOP on kmilod::reconfigure()." << endl; + } + } else { + kdDebug() << "KCMThinkpadModule: cannot attach to DCOP server, " + << "no automatic config update." << endl; + } +} + +void KCMThinkpadModule::load() { + load( false ); +} + +void KCMThinkpadModule::load(bool useDefaults) { + KConfig config(CONFIG_FILE); + + config.setReadDefaults( useDefaults ); + + config.setGroup("thinkpad"); + + m_KCMThinkpadGeneral->mCbRun->setChecked(config.readBoolEntry("run", false)); + m_KCMThinkpadGeneral->mCbSoftwareVolume->setChecked(config.readBoolEntry("softwareVolume", true)); + m_KCMThinkpadGeneral->mSpinboxVolumeStep->setValue(config.readNumEntry("volumeStep", 14)); + m_KCMThinkpadGeneral->commandExec->setURL(config.readEntry("buttonThinkpad", KDE_BINDIR "/konsole")); + m_KCMThinkpadGeneral->commandExecHome->setURL(config.readEntry("buttonHome", KDE_BINDIR "/konqueror")); + m_KCMThinkpadGeneral->commandExecSearch->setURL(config.readEntry("buttonSearch", KDE_BINDIR "/kfind")); + m_KCMThinkpadGeneral->commandExecMail->setURL(config.readEntry("buttonMail", KDE_BINDIR "/kmail")); + m_KCMThinkpadGeneral->commandExecZoom->setURL(config.readEntry("buttonZoom", KDE_BINDIR "/ksnapshot")); + m_nvramFile = config.readEntry("nvram", "/dev/nvram"); + + emit changed( useDefaults ); +} + +void KCMThinkpadModule::defaults() { + load( true ); +} + diff --git a/kmilo/thinkpad/kcmthinkpad/main.h b/kmilo/thinkpad/kcmthinkpad/main.h new file mode 100644 index 0000000..53534ed --- /dev/null +++ b/kmilo/thinkpad/kcmthinkpad/main.h @@ -0,0 +1,49 @@ +/* + * main.h + * + * Copyright (C) 2004 Jonathan Riddell <jr@jriddell.org> + * + * Based on kcm_kvaio + * Copyright (C) 2003 Mirko Boehm (mirko@kde.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 KCMTHINKPAD_MAIN_H +#define KCMTHINKPAD_MAIN_H + +#include <kcmodule.h> + +class KCMThinkPadGeneral; + +class KCMThinkpadModule : public KCModule { + Q_OBJECT + + public: + KCMThinkpadModule(QWidget* parent, const char* name, const QStringList&); + + void save(); + void load(); + void load(bool useDefaults); + void defaults(); + private: + KCMThinkpadGeneral* m_KCMThinkpadGeneral; + QString m_nvramFile; + bool m_nvramReadable; + bool m_nvramWriteable; +}; + +#endif diff --git a/kmilo/thinkpad/kcmthinkpad/thinkpad.desktop b/kmilo/thinkpad/kcmthinkpad/thinkpad.desktop new file mode 100644 index 0000000..720a69f --- /dev/null +++ b/kmilo/thinkpad/kcmthinkpad/thinkpad.desktop @@ -0,0 +1,145 @@ +[Desktop Entry] +Type=Application +Exec=kcmshell thinkpad +Icon=laptop +DocPath=kcontrol/thinkpad/index.html + +X-KDE-Library=thinkpad +X-KDE-ParentApp=kcontrol + +Name=IBM Thinkpad Laptop +Name[ar]=حاسوب IBM Thinkpad المحمول +Name[bg]=Лаптоп IBM Thinkpad +Name[br]=Hezoug IBM Thinkpad +Name[bs]=IBM Thinkpad laptop +Name[ca]=Portàtil IBM Thinkpad +Name[cy]=Gliniadur IBM Thinkpad +Name[da]=IBM Thinkpad bærbar +Name[de]=IBM Thinkpad Notebook +Name[el]=Φορητός υπολογιστής IBM Thinkpad +Name[es]=Portátil IBM Thinkpad +Name[et]=IBM Thinkpadi sülearvuti +Name[eu]=IBM Thinkpad Magalekoa +Name[fa]=IBM Thinkpad رایانۀ کیفی +Name[fi]=IBM Thinkpad -kannettava +Name[fr]=Portable Thinkpad d'IBM +Name[ga]=Ríomhaire Glúine IBM Thinkpad +Name[he]=מחשב ברכיים מסוג IBM Thinkpad +Name[hu]=IBM Thinkpad noteszgép +Name[is]=IBM ferðavél +Name[it]=Portatile IBM Thinkpad +Name[ja]=IBM シンクパッド ラップトップ +Name[kk]=IBM Thinkpad ноутбугі +Name[km]=កុំព្យូទ័រយួរដៃ IBM Thinkpad +Name[mk]=Лаптоп IBM Thinkpad +Name[nb]=IBM Thinkpad Bærbar PC +Name[nds]=IBM Thinkpad-Klappreekner +Name[ne]=IBM थिङ्कप्याड ल्यापटप +Name[nn]=IBM Thinkpad-bærbar +Name[pa]=IBM Thinkpad ਲੈਪਟਾਪ +Name[pl]=Laptop IBM Thinkpad +Name[pt]=Portátil IBM Thinkpad +Name[pt_BR]=Laptop IBM Thinkpad +Name[ro]=Laptop IBM Thinkpad +Name[ru]=Ноутбук IBM Thinkpad +Name[sk]=IBM Thinkpad +Name[sl]=Prenosnik IBM Thinkpad +Name[sr]=IBM-ов Thinkpad лаптоп +Name[sr@Latn]=IBM-ov Thinkpad laptop +Name[sv]=IBM Thinkpad bärbar dator +Name[ta]=ஐபிஎம் திங்க்பாட் மடிக்கணினி +Name[tr]=IBM Thinkpad Dizüstü +Name[uk]=Лептоп IBM Thinkpad +Name[uz]=IBM Thinkpad laptopi +Name[uz@cyrillic]=IBM Thinkpad лаптопи +Name[zh_CN]=ThinkPad 便携电脑 +Name[zh_TW]=IBM Thinkpad 筆記型電腦 +Comment=Configure the KDE Interface to the IBM Thinkpad Special Controls +Comment[ar]=إعداد واجهة كدى لمُتَحكّمات IBM Thinkpad الخاصة +Comment[bg]=Настройване на IBM Thinkpad +Comment[bs]=Podesite KDE interfejs za IBM Thinkpad posebne kontrole +Comment[ca]=Configura la interfície entre KDE i els controls especials de IBM Thinkpad +Comment[cs]=Nastavení KDE rozhraní ovládání notebooků IBM Thinkpad +Comment[cy]=Ffurfweddu'r Rhyngwyneb KDE i'r Rheolau Arbennig IBM Thinkpad +Comment[da]=Indstil KDE's grænseflade til IBM Thinkpads specielle kontroller +Comment[de]=KDE Schnittstelle zu den Sonderfunktionen von IBM Thinkpads einrichten +Comment[el]=Ρυθμίστε το περιβάλλον χρήσης του KDE για τα ειδικά χειριστήρια του IBM Thinkpad +Comment[es]=Configurar la interfaz de KDE para los controles especiales del IBM Thinkpad +Comment[et]=KDE liides IBM Thinkpadi eriklahvide seadistamiseks +Comment[eu]=IBM Thinkpad-en Aginte Berezientzako KDE Interfazea Konfiguratu +Comment[fa]=پیکربندی واسط KDEدر کلیدهای مهار ویژۀ IBM Thinkpad +Comment[fi]=Aseta KDE:n liityntää IBM Thinkpadin ohjelmoitavalle keskeytysajurille +Comment[fr]=Configuration de l'interface KDE pour le paramètrage des Thinkpad d'IBM +Comment[ga]=Cumraigh comhéadan KDE do Rialtáin Speisialta IBM Thinkpad +Comment[he]=הגדר את המנשק של KDE להתאים למקשים המיוחדים של IBM Thinkpad +Comment[hu]=Az IBM Thinkpad noteszgépek speciális kezelőelemeinek beállítása +Comment[is]=Stilla viðmót KDE á IBM Thinkpad stýringuna +Comment[it]=Configura l'interfaccia KDE ai controlli speciali dei Thinkpad IBM +Comment[ja]=IBM シンクパッド特殊コントロールの KDE インターフェースを設定 +Comment[ka]= KDE ინტერფეისის IBM Thinkpad-ის სპეციალური კონტროლებისთვის კონფიგურაცია +Comment[kk]=IBM Thinkpad арнаулы тетіктерінің KDE интерфейсін баптау +Comment[km]=កំណត់រចនាសម្ព័ន្ធចំណុចប្រទាក់ KDE ទៅការត្រួតពិនិត្យ IBM Thinkpad ពិសេស +Comment[lt]=IBM Thinkpad ypatingiems valdymo moduliams KDE sąsaja +Comment[mk]=Го конфигурира интерфејсот на KDE за спец. контроли на IBM Thinkpad +Comment[nb]=Sett opp KDE-grensesnitt til IBM Thinkpad spesial kontroller +Comment[nds]=KDE-Koppelsteedinstellen för de IBM Thinkpad-Sünnerfunkschonenkuntrull +Comment[ne]=IBM थिङ्कप्याड विशेष नियन्त्रणका लागि KDE इन्टरफेस कन्फिगर गर्नुहोस् +Comment[nl]=Voor het instellen van KDE's communicatie met de IBM Thinkpad Special Controls +Comment[nn]=Set opp KDE-grensesnittet til spesialfunksjonar på IBM Thinkpad +Comment[pa]=IBM ਥਿੰਕਪੈਂਡ ਕੰਟਰੋਲਾਂ ਲਈ KDE ਇੰਟਰਫੇਸ ਸੰਰਚਨਾ +Comment[pl]=Konfiguracja specjalnych funkcji IBM Thinkpad +Comment[pt]=Configurar a Interface para o KDE dos Comandos Especiais do IBM Thinkpad +Comment[pt_BR]=Configura a Interface do KDE para os Controles Especiais do IBM Thinkpad +Comment[ro]=Configurează interfaţa KDE către laptop-uri IBM Thinkpad +Comment[ru]=Настройка интерфейса KDE для специальных клавиш ноутбука IBM Thinkpad +Comment[sk]=Nastavenie rozhrania KDE k špeciálnym ovládacím prvkom notebooku IBM Thinkpad +Comment[sl]=Nastavite vmesnik KDE za posebne kontrole IBM Thinkpada +Comment[sr]=Подесите KDE-ов интерфејс за посебне контроле IBM-ових Thinkpad-ова +Comment[sr@Latn]=Podesite KDE-ov interfejs za posebne kontrole IBM-ovih Thinkpad-ova +Comment[sv]=Anpassa KDE:s gränssnitt till IBM Thinkpads specialstyrning +Comment[ta]=ஐபிஎம் திங்க்பேட் விசேஷ கட்டுப்பாட்டிற்கு கேடிஇ இடைமுகத்தை வடிவமை +Comment[tr]=KDE Arayüzünü Sony IBM Thinkpad Özel Denetimlerine Ayarla +Comment[uk]=Налаштування інтерфейсу KDE до спеціальних функцій IBM Thinkpad +Comment[zh_CN]=配置 KDE 界面使用 ThinkPad 特殊控制 +Comment[zh_TW]=設定 IBM Thinkpad 特殊控制的 KDE 介面 +Keywords=IBM, Thinkpad, brightness, mute, Jog Dial +Keywords[bs]=IBM, Thinkpad, brightness, mute, Jog Dial, svjetlost +Keywords[ca]=IBM, Thinkpad, brillantor, silenci, Jog Dial +Keywords[cs]=IBM,Thinkpad,jas,ztlumení,Jog Dial +Keywords[cy]=IBM,Thinkpad,gloywder, mud, Jog Dial +Keywords[da]=IBM. Thinkpad, lysstyrke, stum, Jog Dial +Keywords[de]=IBM, Thinkpad, Helligkeit, Abschalten, Jog Dial +Keywords[el]=IBM, Thinkpad, φωτεινότητα, κλείσιμο ήχου, Jog Dial +Keywords[es]=IBM, Thinkpad, brillo, mute, Jog Dial +Keywords[et]=IDM, Thinkpad, heledus, tumm, Jog Dial +Keywords[eu]=IBM, Thinkpad, distira, mutu, Jog Dial +Keywords[fa]=IBM، Thinkpad، روشنایی، بدون صدا، Jog Dial +Keywords[fi]=IBM, Thinkpad, kirkkaus, vaimenna, Jog Dial +Keywords[fr]=IBM, Thinkpad, luminosité, sourdine, mute, Jog Dial +Keywords[ga]=IBM, Thinkpad, gile, gan fuaim, Jog Dial +Keywords[hu]=IBM,Thinkpad,fényerő,elnémítás,tárcsagomb +Keywords[it]=IBM,Thinkpad,luminosità,muto,Jog Dial +Keywords[ja]=IBM, シンクパッド, 明るさ, ミュート, ジョグダイアル +Keywords[mk]=IBM, Thinkpad, brightness, mute, Jog Dial, осветленост, пригушување +Keywords[nb]=IBM, Thinkpad, lysstyrke, dempet, Jog Dial +Keywords[nds]=IBM, Thinkpad, Helligkeit, stumm, Jog Dial +Keywords[ne]=IBM, थिङ्कप्याड, चम्किलोपना, चुप लाग्नु, जोग डायल +Keywords[nl]=IBM, Thinkpad, brightness, mute, Jog Dial, Helderheid, dempen +Keywords[nn]=IBM,Thinkpad,lysstyrke,demping,snurrehjul +Keywords[pa]=IBM, Thinkpad, brightness, mute, Jog Dial, ਲੈਪਟਾਪ +Keywords[pl]=IBM, Thinkpad, jasność, wycisz, Jog Dial +Keywords[pt]=IBM, Thinkpad, brilho, sem som, Jog Dial +Keywords[pt_BR]=IBM,Thinkpad,brilho, mudo, Jog Dial +Keywords[ro]=IBM,Thinkpad,strălucire,fără sunet,jog dial +Keywords[ru]=IBM, Thinkpad, brightness, mute, Jog Dial, яркость, звук +Keywords[sk]=IBM, Thinkpad,jas,potichu +Keywords[sl]=IBM, Thinkpad, svetlost, tiho, Jog Dial +Keywords[sr]=Sony, Vaio, kvaio, brightness, mute, Jog Dial, светлина +Keywords[sr@Latn]=Sony, Vaio, kvaio, brightness, mute, Jog Dial, svetlina +Keywords[sv]=IBM, Thinkpad, ljusstyrka, tyst, rullhjul +Keywords[ta]=ஐபிஎம், திங்க்பேட்,ஒளித்தன்மை,ஓசையற்ற,ஜோக் டையல் +Keywords[tr]=IBM, Thinkpad, parlaklık, sessiz, gösterme itmesi +Keywords[uk]=IBM, Thinkpad, яскравість, вимкнення звуку, Jog Dial +Keywords[zh_CN]=IBM, Lenovo, Thinkpad, brightness, mute, Jog Dial,亮度,静音,联想,导航键 + +Categories=Qt;KDE;X-KDE-settings-system; diff --git a/kmilo/thinkpad/kmilo_thinkpad.desktop b/kmilo/thinkpad/kmilo_thinkpad.desktop new file mode 100644 index 0000000..1d957c4 --- /dev/null +++ b/kmilo/thinkpad/kmilo_thinkpad.desktop @@ -0,0 +1,101 @@ +[Desktop Entry] +Type=Service +ServiceTypes=KMilo Plugin +X-KDE-ModuleType=Plugin +Name=Thinkpad Plugin +Name[ar]=ملحق Thinkpad +Name[br]=Lugent Thinkpad +Name[bs]=Thinkpad dodatak +Name[ca]=Connector Thinkpad +Name[cs]=Thinkpad modul +Name[cy]=Ategyn Thinkpad +Name[de]=Thinkpad-Plugin +Name[el]=Πρόσθετο Thinkpad +Name[eo]=Thinkpad-kromaĵo +Name[es]=Extensión para Thinkpad +Name[et]=Thinkpadi plugin +Name[eu]=Thikpad Plugina +Name[fa]=Thinkpad وصلۀ +Name[fi]=Thinkpad-liitännäinen +Name[fr]=Module externe pour les Thinkpad +Name[ga]=Breiseán Thinkpad +Name[he]=תוסף ל-Thinkpad +Name[hu]=Thinkpad bővítőmodul +Name[is]=Thinkpad íforrit +Name[it]=Plugin Thinkpad +Name[ja]=シンクパッド プラグイン +Name[ka]=Thinkpad-ის მოდული +Name[kk]=Thinkpad модулі +Name[km]=កម្មវិធីជំនួយ Thinkpad Plugin +Name[lt]=Thinkpad priedas +Name[mk]=Приклучок за Thinkpad +Name[nb]=Thinkpad tilleggs program +Name[nds]=Thinkpad-Moduul +Name[ne]=थिङ्कप्याड प्लगइन +Name[nn]=Programtillegg for Thinkpad +Name[pa]=Thinkpad ਪਲੱਗਿੰਨ +Name[pl]=Wtyczka Thinkpad +Name[pt]='Plugin' para Thinkpad +Name[pt_BR]=Plugin do Thinkpad +Name[ro]=Modul Thinkpad +Name[ru]=Модуль Thinkpad +Name[sk]=Modul pre Thinkpad +Name[sl]=Vstavek za Thinkpad +Name[sr]=Прикључак за Thinkpad +Name[sr@Latn]=Priključak za Thinkpad +Name[sv]=Thinkpad-insticksprogram +Name[ta]=திங்க்பேட் செருகி +Name[tr]=Thinkpad Eklentisi +Name[uk]=Втулок Thinkpad +Name[uz]=Thinkpad plagini +Name[uz@cyrillic]=Thinkpad плагини +Name[zh_CN]=Thinkpad 插件 +Name[zh_TW]=Thinkpad 外掛程式 +Comment=Enables support for special Thinkpad keys +Comment[ar]=تمكّن الدعم لمفاتيح Thinkpad الخاصة +Comment[bg]=Тази приставка позволява поддръжката на специалните клавиши на IBM Thinkpad +Comment[bs]=Omogućuje podršku za posebne tipke na Thinkpadu +Comment[ca]=Habilita el funcionament per a tecles especials de Thinkpad +Comment[cs]=Umožňuje podporu speciálních kláves Thinkpadu +Comment[cy]=Yn galluogi cynhaliaeth ar gyfer bysyll arbennig Thinkpad +Comment[da]=Aktiverer støtte for specielle Thinkpad taster +Comment[de]=Dieses Plugin aktiviert die Unterstützung für Sondertasten von Thinkpad-Tastaturen +Comment[el]=Ενεργοποιεί την υποστήριξη για ειδικά πλήκτρα του Thinkpad +Comment[es]=Activa el soporte de las teclas especiales del Thinkpad +Comment[et]=See plugin võimaldab kasutada Thinkpadi eriklahve. +Comment[eu]=Thinkpad-en tekla berezientzako euskarria gaitzen du +Comment[fa]=فعالسازی پشتیبانی برای کلیدهای ویژۀ Thinkpad . +Comment[fi]=Tämä liitännäinen mahdollistaa erikoisnäppäinten tuen IBM Thinkpad kannettaville tietokoneille. +Comment[fr]=Ce module active la gestion des touches spéciales des Thinkpad. +Comment[ga]=Tacaigh le heochracha speisialta Thinkpad +Comment[he]=מאפשר תמיכה במקשים מיוחדים של Thinkpad +Comment[hu]=Ez a bővítőmodul lehetővé teszi az IBM Thinkpad noteszgépek speciális billentyűinek használatát +Comment[is]=Virkjar stuðning fyrir sérhnappa Thinkpad véla +Comment[it]=Abilita il supporto per i tasti speciali Thinkpad +Comment[ja]=シンクパッドの特殊キーをサポートします +Comment[ka]=რთავს Thinkpad-ის სპეციალური კლავიშების მხარდაჭერას +Comment[kk]=Thinkpad-тың арнаулы пернелерін қолдауы +Comment[km]=បើកការគាំទ្រសម្រាប់គ្រាប់ចុច Thinkpad ពិសេស +Comment[lt]=įgalina ypatingų Thinkpad raktų paramą +Comment[mk]=Овозможува поддршка за спец. копчиња на Thinkpad +Comment[nb]=Dette programtillegget muliggjør støtte for spesielle taster på alle tastatur og bærbare maskiner +Comment[nds]=Maakt de Sünnertasten-Ünnerstütten för Thinkpads an +Comment[ne]=विशेष थिङ्कप्याड कुञ्जीका लागि समर्थन सक्षम पार्दछ +Comment[nl]=Activeert de ondersteuning voor spciale Thinkpad-toetsen +Comment[nn]=Dette programtillegget gjer det mogleg å bruka spesialtastar på Thinkpad +Comment[pl]=Włącza obsługę specjalnych klawiszy Thinkpada +Comment[pt]=Activa o suporte a teclas especiais do Thinkpad +Comment[pt_BR]=Habilita suporte para teclas especiais no Thinkpad +Comment[ro]=Activează suportul pentru tastele speciale Thinkpad +Comment[ru]=Этот модуль поддерживает специальные клавиши Thinkpad +Comment[sk]=Zapína podporu pre špeciálne klávesy notebookov Thinkpad +Comment[sl]=Omogoči podporo posebnim tipkam Thinkpada +Comment[sr]=Подршку за посебне Thinkpad-ове тастере +Comment[sr@Latn]=Podršku za posebne Thinkpad-ove tastere +Comment[sv]=Aktiverar stöd för speciella Thinkpad-tangenter +Comment[ta]=விசேஷ திங்க்பேட் விசைகளுக்கான ஆதரவை செயல்படுத்துகிறது +Comment[tr]=Özel Thinkpad tuşları için desteği etkinleştirir +Comment[uk]=Уможливлює підтримку спеціальних клавіш для Thinkpad. +Comment[zh_CN]=此插件启用各种键盘和便携电脑的特殊按键 +Comment[zh_TW]=開啟特殊 Thinkpad 按鍵支援 +X-KDE-Library=kmilo_thinkpad diff --git a/kmilo/thinkpad/thinkpad.cpp b/kmilo/thinkpad/thinkpad.cpp new file mode 100644 index 0000000..74770cf --- /dev/null +++ b/kmilo/thinkpad/thinkpad.cpp @@ -0,0 +1,556 @@ +/* + This file is part of the KDE project + + Copyright (c) 2004 Jonathan Riddell <jr@jriddell.org> + + Based on Demo kmilo service by George Staikos + Copyright (c) 2003 George Staikos <staikos@kde.org> + + And tpb by Markus Braun + Copyright (C) 2002,2003 Markus Braun <markus.braun@krawel.de> + + FreeBSD support by Markus Brueffer + Copyright (C) 2005 Markus Brueffer <markus@FreeBSD.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ + +#include <kgenericfactory.h> +#include <kconfig.h> +#include <krun.h> +#include <kurl.h> +#include "kmilointerface.h" + +#ifdef Q_OS_FREEBSD +#include <sys/sysctl.h> +#endif + +#include "thinkpad.h" + +namespace KMilo { + +ThinkPadMonitor::ThinkPadMonitor(QObject* parent, const char* name, const QStringList& args): Monitor(parent, name, args) { + m_progress = 0; + m_volume = 50; //set in retrieveVolume() +} + +ThinkPadMonitor::~ThinkPadMonitor() { +} + +bool ThinkPadMonitor::init() { + + KConfig config("kmilodrc"); + reconfigure(&config); + + if (m_run) { + clearStruct(thinkpad_state); + clearStruct(last_thinkpad_state); + if ( getNvramState(&thinkpad_state) == false ) { + return false; + } + + if (m_softwareVolume || m_volumeStep != defaultVolumeStep) { + kmixClient = new DCOPRef("kmix", "Mixer0"); + kmixWindow = new DCOPRef("kmix", "kmix-mainwindow#1"); + retrieveVolume(); + setNvramVolume(); + } + } + + return m_run; +} + +Monitor::DisplayType ThinkPadMonitor::poll() { + + // save last state and get new one + memcpy(&last_thinkpad_state, &thinkpad_state, sizeof(thinkpad_state_struct)); + getNvramState(&thinkpad_state); + + Monitor::DisplayType pollResult = None; + + // determine the state of the mute button + if (thinkpad_state.mute_toggle != last_thinkpad_state.mute_toggle || + (thinkpad_state.volume_toggle != last_thinkpad_state.volume_toggle + && last_thinkpad_state.mute_toggle == 1)) { + + showToggleMessage(i18n("Mute on"), i18n("Mute off"), thinkpad_state.mute_toggle == 1); + if (m_softwareVolume || m_volumeStep != defaultVolumeStep) { + kmixClient->send("setMasterMute", thinkpad_state.mute_toggle == 1); + } + } + + // determine the state of the Thinkpad button + if (thinkpad_state.thinkpad_toggle != last_thinkpad_state.thinkpad_toggle && + thinkpad_state.hibernate_toggle == last_thinkpad_state.hibernate_toggle) { + _interface->displayText(i18n("Thinkpad Button Pressed")); + + KURL url(m_buttonThinkpad); + (void) new KRun(url, 0, true, true); + } + + // determine the state of ThinkLight + if (thinkpad_state.thinklight_toggle != last_thinkpad_state.thinklight_toggle) { + showToggleMessage(i18n("ThinkLight is on"), i18n("ThinkLight is off"), thinkpad_state.thinklight_toggle == 1); + } + + // determine the state of the volume buttons + if (thinkpad_state.volume_level != last_thinkpad_state.volume_level) { + + pollResult = Volume; + + if (m_volumeStep == defaultVolumeStep && m_softwareVolume == false) { + //no need to write to nvram or set volume in software + m_progress = thinkpad_state.volume_level * 100 / defaultVolumeStep; + } else { + if (thinkpad_state.volume_level > last_thinkpad_state.volume_level) { + m_progress = m_volume + m_volumeStep; + } else { + m_progress = m_volume - m_volumeStep; + } + setVolume(m_progress); + } + + } + + // determine the state of the brightness buttons + if (thinkpad_state.brightness_level != last_thinkpad_state.brightness_level) { + pollResult = Brightness; + m_progress = thinkpad_state.brightness_level * 100 / 7; + } + + // Buttons below here are untested because they do not exist on my R31 + + // determine the state of zoom + if (thinkpad_state.zoom_toggle != last_thinkpad_state.zoom_toggle) { + // showToggleMessage(i18n("Zoom is on"), i18n("Zoom is off"), thinkpad_state.zoom_toggle == 1); + + // Use as button since an Zooming is implemented + _interface->displayText(i18n("Zoom button pressed")); + + KURL url(m_buttonZoom); + (void) new KRun(url, 0, true, true); + } + + // determine the state of the home button + if (thinkpad_state.home_toggle != last_thinkpad_state.home_toggle && + thinkpad_state.hibernate_toggle == last_thinkpad_state.hibernate_toggle) { + _interface->displayText(i18n("Home button pressed")); + KURL url(m_buttonHome); + (void) new KRun(url, 0, true, true); + } + + // determine the state of the search button + if (thinkpad_state.search_toggle != last_thinkpad_state.search_toggle && + thinkpad_state.hibernate_toggle == last_thinkpad_state.hibernate_toggle) { + _interface->displayText(i18n("Search button pressed")); + KURL url(m_buttonSearch); + (void) new KRun(url, 0, true, true); + } + + // determine the state of the mail button + if (thinkpad_state.mail_toggle != last_thinkpad_state.mail_toggle && + thinkpad_state.hibernate_toggle == last_thinkpad_state.hibernate_toggle) { + _interface->displayText(i18n("Mail button pressed")); + KURL url(m_buttonMail); + (void) new KRun(url, 0, true, true); + } + + // determine the state of display + if (thinkpad_state.display_toggle != last_thinkpad_state.display_toggle && + thinkpad_state.hibernate_toggle == last_thinkpad_state.hibernate_toggle) { + + // Some thinkpads have no hardware support to switch lcd/crt. They also + // don't reflect the current state in thinkpad_state.display_state. So, if + // thinkpad_state.display_toggle changes, but thinkpad_state.display_state does + // not change, simulate the display state. + + unsigned int display_state = 1; + if (thinkpad_state.display_state == last_thinkpad_state.display_state) { + display_state = display_state % 3 + 1; + } else { + display_state = thinkpad_state.display_state; + } + + switch (display_state & 0x03) { + case 0x1: + _interface->displayText(i18n("Display changed: LCD on, CRT off")); + break; + + case 0x2: + _interface->displayText(i18n("Display changed: LCD off, CRT on")); + break; + + case 0x3: + _interface->displayText(i18n("Display changed: LCD on, CRT on")); + break; + } + } + + // determine the state of hv expansion + if (thinkpad_state.expand_toggle != last_thinkpad_state.expand_toggle) { + showToggleMessage(i18n("HV Expansion is on"), i18n("HV Expansion is off"), (thinkpad_state.expand_toggle & 0x01) == 1); + } + + // determine power management mode AC + if (thinkpad_state.powermgt_ac != last_thinkpad_state.powermgt_ac) { + switch(thinkpad_state.powermgt_ac) { + case 0x4: + _interface->displayText(i18n("Power management mode AC changed: PM AC high")); + break; + + case 0x2: + _interface->displayText(i18n("Power management mode AC changed: PM AC auto")); + break; + + case 0x1: + _interface->displayText(i18n("Power management mode AC changed: PM AC manual")); + break; + + default: + _interface->displayText(i18n("Power management mode AC changed: PM AC unknown")); + break; + } + } + + // determine power management mode battery + if (thinkpad_state.powermgt_battery != last_thinkpad_state.powermgt_battery) { + switch(thinkpad_state.powermgt_battery) { + case 0x4: + _interface->displayText(i18n("Power management mode battery changed: PM battery high")); + break; + + case 0x2: + _interface->displayText(i18n("Power management mode battery changed: PM battery auto")); + break; + + case 0x1: + _interface->displayText(i18n("Power management mode battery changed: PM battery manual")); + break; + + default: + _interface->displayText(i18n("Power management mode battery changed: PM battery unknown")); + break; + } + } + + // determine the state of wireless lan + if (thinkpad_state.wireless_toggle != last_thinkpad_state.wireless_toggle) { + showToggleMessage(i18n("Wireless LAN is enabled"), i18n("Wireless LAN is disabled"), thinkpad_state.wireless_toggle == 1); + } + + // determine the state of bluetooth + if (thinkpad_state.bluetooth_toggle != last_thinkpad_state.bluetooth_toggle) { + showToggleMessage(i18n("Bluetooth is enabled"), i18n("Bluetooth is disabled"), thinkpad_state.bluetooth_toggle == 1); + } + + return pollResult; +} + + +int ThinkPadMonitor::progress() const { + return m_progress; +} + +QString ThinkPadMonitor::message() const { + //unused + //return i18n("yer maw!"); + return ""; +} + +bool ThinkPadMonitor::getNvramState(thinkpad_state_struct* thinkpad_state) { +#ifndef Q_OS_FREEBSD + int file; + unsigned char buffer[114]; + + // open nvram for reading + // must use open/close because seek is not supported by nvram + if ((file=open(m_nvramFile.latin1(), O_RDONLY|O_NONBLOCK)) == -1) { + kdError() << "Unable to open device: " << m_nvramFile << endl; + return false; + } + + // read nvram + if (read(file, buffer, sizeof(buffer)) != sizeof(buffer)) { + kdError() << "Unable to read from device: " << m_nvramFile << endl; + return false; + } + + // close nvram device + if (close(file) == -1) { + kdError() << "Unable to close device %s: " << m_nvramFile << endl; + return false; + } + + thinkpad_state->thinkpad_toggle + = (thinkpad_state->thinkpad_toggle & ~0x01) | (( buffer[0x57] & 0x08) >> 3); + thinkpad_state->zoom_toggle + = (thinkpad_state->zoom_toggle & ~0x01) | ((~buffer[0x57] & 0x20) >> 5); + thinkpad_state->display_toggle + = (thinkpad_state->display_toggle & ~0x01) | (( buffer[0x57] & 0x40) >> 6); + thinkpad_state->home_toggle + = (thinkpad_state->home_toggle & ~0x01) | (( buffer[0x56] & 0x01) ); + thinkpad_state->search_toggle + = (thinkpad_state->search_toggle & ~0x01) | (( buffer[0x56] & 0x02) >> 1); + thinkpad_state->mail_toggle + = (thinkpad_state->mail_toggle & ~0x01) | (( buffer[0x56] & 0x04) >> 2); + thinkpad_state->thinklight_toggle + = (thinkpad_state->thinklight_toggle & ~0x01) | (( buffer[0x58] & 0x10) >> 4); + thinkpad_state->hibernate_toggle + = (thinkpad_state->hibernate_toggle & ~0x01) | (( buffer[0x58] & 0x01) ); + thinkpad_state->display_state + = (( buffer[0x59] & 0x03) ); + thinkpad_state->expand_toggle + = (thinkpad_state->expand_toggle & ~0x01) | (( buffer[0x59] & 0x10) >> 4); + thinkpad_state->brightness_level + = (( buffer[0x5E] & 0x07) ); + thinkpad_state->brightness_toggle + = (thinkpad_state->brightness_toggle & ~0x01) | (( buffer[0x5E] & 0x20) >> 5); + thinkpad_state->volume_level + = (( buffer[0x60] & 0x0f) ); + thinkpad_state->volume_toggle + = (thinkpad_state->volume_toggle & ~0x01) | (( buffer[0x60] & 0x80) >> 7); + thinkpad_state->mute_toggle + = (thinkpad_state->mute_toggle & ~0x01) | (( buffer[0x60] & 0x40) >> 6); + thinkpad_state->powermgt_ac + = (( buffer[0x39] & 0x07) ); + thinkpad_state->powermgt_battery + = (( buffer[0x39] & 0x38) >> 3); +#else + u_int n = 0; + size_t len = sizeof(n); + + if ( sysctlbyname("dev.acpi_ibm.0.hotkey", &n, &len, NULL, 0) == -1 ) { + kdError() << "Unable to read sysctl: dev.acpi_ibm.0.hotkey" << endl; + return false; + } + + thinkpad_state->thinkpad_toggle + = (thinkpad_state->thinkpad_toggle & ~0x01) | (( n & (1<<3)) >> 3); + thinkpad_state->zoom_toggle + = (thinkpad_state->zoom_toggle & ~0x01) | (( n & (1<<4)) >> 4); + thinkpad_state->display_toggle + = (thinkpad_state->display_toggle & ~0x01) | (( n & (1<<6)) >> 6); + thinkpad_state->home_toggle + = (thinkpad_state->home_toggle & ~0x01) | (( n & (1<<0)) ); + thinkpad_state->search_toggle + = (thinkpad_state->search_toggle & ~0x01) | (( n & (1<<1)) >> 1); + thinkpad_state->mail_toggle + = (thinkpad_state->mail_toggle & ~0x01) | (( n & (1<<2)) >> 2); + thinkpad_state->hibernate_toggle + = (thinkpad_state->hibernate_toggle & ~0x01) | (( n & (1<<7)) >> 7); + thinkpad_state->expand_toggle + = (thinkpad_state->expand_toggle & ~0x01) | (( n & (1<<9)) >> 9); + thinkpad_state->brightness_toggle + = (thinkpad_state->brightness_toggle & ~0x01) | (( n & (1<<10)) >> 10); + thinkpad_state->volume_toggle + = (thinkpad_state->volume_toggle & ~0x01) | (( n & (1<<11)) >> 11); + + // Don't fail if the thinklight sysctl is not present. It is generated dynamically + if ( sysctlbyname("dev.acpi_ibm.0.thinklight", &n, &len, NULL, 0) != -1 ) + thinkpad_state->thinklight_toggle = n; + else + kdWarning() << "Unable to read sysctl: dev.acpi_ibm.0.thinklight" << endl; + + if ( sysctlbyname("dev.acpi_ibm.0.lcd_brightness", &n, &len, NULL, 0) == -1 ) { + kdError() << "Unable to read sysctl: dev.acpi_ibm.0.lcd_brightness" << endl; + return false; + } + thinkpad_state->brightness_level = n; + + if ( sysctlbyname("dev.acpi_ibm.0.volume", &n, &len, NULL, 0) == -1 ) { + kdError() << "Unable to read sysctl: dev.acpi_ibm.0.volume" << endl; + return false; + } + thinkpad_state->volume_level = n; + + if ( sysctlbyname("dev.acpi_ibm.0.mute", &n, &len, NULL, 0) == -1 ) { + kdError() << "Unable to read sysctl: dev.acpi_ibm.0.mute" << endl; + return false; + } + thinkpad_state->mute_toggle = n; + + // Don't fail if wlan or bluetooth sysctls are not present. They are generated dynamically + if ( sysctlbyname("dev.acpi_ibm.0.wlan", &n, &len, NULL, 0) != -1 ) + thinkpad_state->wireless_toggle = n; + else + kdWarning() << "Unable to read sysctl: dev.acpi_ibm.0.wlan" << endl; + + if ( sysctlbyname("dev.acpi_ibm.0.bluetooth", &n, &len, NULL, 0) != -1 ) + thinkpad_state->bluetooth_toggle = n; + else + kdWarning() << "Unable to read sysctl: dev.acpi_ibm.0.bluetooth" << endl; +#endif + return true; +} + +void ThinkPadMonitor::clearStruct(thinkpad_state_struct& thinkpad_state) { + thinkpad_state.thinkpad_toggle = 0; + thinkpad_state.zoom_toggle = 0; + thinkpad_state.display_toggle = 0; + thinkpad_state.home_toggle = 0; + thinkpad_state.search_toggle = 0; + thinkpad_state.mail_toggle = 0; + thinkpad_state.favorites_toggle = 0; + thinkpad_state.reload_toggle = 0; + thinkpad_state.abort_toggle = 0; + thinkpad_state.backward_toggle = 0; + thinkpad_state.forward_toggle = 0; + thinkpad_state.fn_toggle = 0; + thinkpad_state.thinklight_toggle = 0; + thinkpad_state.hibernate_toggle = 0; + thinkpad_state.display_state = 0; + thinkpad_state.expand_toggle = 0; + thinkpad_state.brightness_level = 0; + thinkpad_state.brightness_toggle = 0; + thinkpad_state.volume_level = 0; + thinkpad_state.volume_toggle = 0; + thinkpad_state.mute_toggle = 0; + thinkpad_state.ac_state = 0; + thinkpad_state.powermgt_ac = 0; + thinkpad_state.powermgt_battery = 0; + thinkpad_state.wireless_toggle = 0; + thinkpad_state.bluetooth_toggle = 0; +} + +void ThinkPadMonitor::showToggleMessage(QString onMessage, QString offMessage, bool state) { + QString message; + if (state) { + message = onMessage; + } else { + message = offMessage; + } + _interface->displayText(message); +} + +void ThinkPadMonitor::reconfigure(KConfig* config) { + config->setGroup("thinkpad"); + + m_nvramFile = config->readEntry("nvram", "/dev/nvram"); + m_softwareVolume = config->readBoolEntry("softwareVolume", true); + m_run = config->readBoolEntry("run", false); + m_volumeStep = config->readNumEntry("volumeStep", defaultVolumeStep); + m_buttonThinkpad = config->readEntry("buttonThinkpad", "/usr/bin/konsole"); + m_buttonHome = config->readEntry("buttonHome", "/usr/bin/konqueror"); + m_buttonSearch = config->readEntry("buttonSearch", "/usr/bin/kfind"); + m_buttonMail = config->readEntry("buttonMail", "/usr/bin/kmail"); + m_buttonZoom = config->readEntry("buttonZoom", "/usr/bin/ksnapshot"); +} + +bool ThinkPadMonitor::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: ThinkPadMonitor could not access kmix/Mixer0 via dcop" << endl; + return false; + } else { + return true; + } +} + +void ThinkPadMonitor::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); + + //write back to nvram but only if volume steps is not default + if (m_volumeStep != defaultVolumeStep) { + setNvramVolume(); + } + m_progress = m_volume; +} + +void ThinkPadMonitor::setNvramVolume() { +#ifndef Q_OS_FREEBSD + int file; + char buffer; + + //open nvram + if ((file = open(m_nvramFile.latin1(), O_RDWR|O_NONBLOCK)) == -1) { + kdError() << "Unable to open device " << m_nvramFile << endl; + return; + } + + // jump to volume section + if (lseek(file, 0x60, SEEK_SET) == -1 ) { + kdError() << "Unable to seek device " << m_nvramFile << endl; + return; + } + + // read nvram + if (read(file, &buffer, sizeof(buffer)) != sizeof(buffer)) { + kdError() << "Unable to read from device " << m_nvramFile << endl; + return; + } + + // set volume_level to the value we write back to nvram + // taken from tpb, unfortunatly I'm not sure why it works + thinkpad_state.volume_level = 0x07; + buffer &= 0xf0; + buffer |= thinkpad_state.volume_level; + + // jump to volume section + if (lseek(file, 0x60, SEEK_SET) == -1 ) { + kdError() << "Unable to seek device " << m_nvramFile << endl; + return; + } + + // write std value for volume + if (write(file, &buffer, sizeof(buffer)) != sizeof(buffer)) { + kdError() << "Unable to write to device " << m_nvramFile << endl; + return; + } + + close(file); +#else + u_int n = thinkpad_state.volume_level; + + if (sysctlbyname("dev.acpi_ibm.0.volume", NULL, NULL, &n, sizeof(n))) + kdError() << "Unable to write sysctl: dev.acpi_ibm.0.volume" << endl; +#endif +} + +} + +K_EXPORT_COMPONENT_FACTORY(kmilo_thinkpad, KGenericFactory<KMilo::ThinkPadMonitor>("kmilo_thinkpad")) diff --git a/kmilo/thinkpad/thinkpad.h b/kmilo/thinkpad/thinkpad.h new file mode 100644 index 0000000..f195b2e --- /dev/null +++ b/kmilo/thinkpad/thinkpad.h @@ -0,0 +1,208 @@ +/* + This file is part of the KDE project + + Copyright (c) 2004 Jonathan Riddell <jr@jriddell.org> + + Based on Demo kmilo service by George Staikos + Copyright (c) 2003 George Staikos <staikos@kde.org> + + And tpb by Markus Braun http://www.nongnu.org/tpb/ + Copyright (C) 2002,2003 Markus Braun <markus.braun@krawel.de> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ +#ifndef _THINKPAD_H_ +#define _THINKPAD_H_ + +#include <fcntl.h> +#include <unistd.h> + +#include <kapplication.h> +#include <dcopref.h> + +#include "monitor.h" + +namespace KMilo { + + +const int defaultVolumeStep = 14; + +// all nvram toggle values are stored in bit 0 +// all xevents toggle values are stored in bit 1 +// xevent and apm toggles are not used, kept for compatibility with tpb +typedef struct { + unsigned int thinkpad_toggle; // ThinkPad button + unsigned int zoom_toggle; // zoom toggle + unsigned int display_toggle; // display toggle + unsigned int home_toggle; // Home button + unsigned int search_toggle; // Search button + unsigned int mail_toggle; // Mail button + unsigned int favorites_toggle; // Favorites button (xevent) + unsigned int reload_toggle; // Reload button (xevent) + unsigned int abort_toggle; // Abort button (xevent) + unsigned int backward_toggle; // Backward button (xevent) + unsigned int forward_toggle; // Forward button (xevent) + unsigned int fn_toggle; // Fn button (xevent) + unsigned int thinklight_toggle; // ThinkLight + unsigned int hibernate_toggle; // hibernation/suspend toggle + unsigned int display_state; // display state + unsigned int expand_toggle; // hv expansion state + unsigned int brightness_level; // brightness level + unsigned int brightness_toggle; // brightness toggle + unsigned int volume_level; // volume level + unsigned int volume_toggle; // volume toggle + unsigned int mute_toggle; // mute toggle + unsigned int ac_state; // ac connected (apm) + unsigned int powermgt_ac; // power management mode ac + unsigned int powermgt_battery; // power management mode battery + unsigned int wireless_toggle; // wireless lan toggle + unsigned int bluetooth_toggle; // bluetooth toggle +} thinkpad_state_struct; + +/** + * KMilo plugin for IBM Thinkpads + * Requires read access of nvram: insmod nvram; mknod /dev/nvram c 10 144; chmod 664 /dev/nvram + * + * Models R31 and R30 do not have hardware mixers, other models + * probably want a smaller volume change than thinkpad's default, for + * this you need write access to nvram: chmod 666 /dev/nvram + */ +class ThinkPadMonitor : public Monitor { + public: + ThinkPadMonitor(QObject *parent, const char *name, const QStringList&); + virtual ~ThinkPadMonitor(); + + /** + * Reimplemented from KMilo::Monitor. + * Loads configuration, clears struct, sets volume if necessary. + */ + virtual bool init(); + + /** + * Reimplemented from KMilo::Monitor. + * Called by KMilo, this checks the nvram and acts on any changes + */ + virtual DisplayType poll(); + + /** + * Reimplemented from KMilo::Monitor. + * Called by KMilo if poll() returns a volume or brightness change. + * Returns the new volume or brightness percentage. + */ + virtual int progress() const; + + /** + * Reimplemented from KMilo::Monitor. + * Not used, we just set the message ourselves using _interface->displayText() + */ + virtual QString message() const; + protected: + /** + * Reimplemented from KMilo::Monitor. + * Loads configuration from kmilorc + */ + virtual void reconfigure(KConfig*); + private: + /** + * get the current state from the nvram + */ + bool getNvramState(thinkpad_state_struct* thinkpad_state); + + /** + * get the current state from the nvram + */ + void setNvramVolume(); + + /** + * set all values of thinkpad_state to zero + */ + void clearStruct(thinkpad_state_struct& thinkpad_state); + + /** + * Displays paramater message followed by 'on' or + * 'off' depending on state + */ + void showToggleMessage(QString onMessage, QString offMessage, bool state); + + /** + * Returned by progress() + */ + int m_progress; + + /** + * The file to read data from, default is /dev/nvram + */ + QString m_nvramFile; + + /** + * Some thinkpads change volume in hardware, others we + * have to do it ourselves + */ + bool m_softwareVolume; + + /** + * Config variable determines if this kmilo service is run or not + */ + bool m_run; + + /** + * Amount to change volume by each time, default is 14 + * (as builtin to thinkpads) + */ + int m_volumeStep; + + /** + * Thinkpad button + */ + QString m_buttonThinkpad; + + /** + * Home button + */ + QString m_buttonHome; + + /** + * Search button + */ + QString m_buttonSearch; + + /** + * Mail button + */ + QString m_buttonMail; + + /** + * Zoom button + */ + QString m_buttonZoom; + + /** + * Used for changing the volume if m_softwareVolume is true + */ + void setVolume(int volume); + DCOPRef* kmixClient; + DCOPRef* kmixWindow; + bool retrieveVolume(); + int m_volume, m_oldVolume; + + thinkpad_state_struct thinkpad_state; + thinkpad_state_struct last_thinkpad_state; +}; + +} //close namespace + +#endif |