diff options
Diffstat (limited to 'kmilo/thinkpad/thinkpad.h')
-rw-r--r-- | kmilo/thinkpad/thinkpad.h | 208 |
1 files changed, 208 insertions, 0 deletions
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 |