[Sugar-devel] [PATCH 1/3] Touchpad extension for the frame
Walter Bender
walter.bender at gmail.com
Thu Jul 8 12:23:37 EDT 2010
---
extensions/deviceicon/touchpad.py | 152 +++++++++++++++++++++++++++++++++++++
1 files changed, 152 insertions(+), 0 deletions(-)
create mode 100644 extensions/deviceicon/touchpad.py
diff --git a/extensions/deviceicon/touchpad.py
b/extensions/deviceicon/touchpad.py
new file mode 100644
index 0000000..a182d9c
--- /dev/null
+++ b/extensions/deviceicon/touchpad.py
@@ -0,0 +1,152 @@
+# Copyright (C) 2010, Walter Bender, Sugar Labs
+#
+# 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+from gettext import gettext as _
+
+import gtk
+import gconf
+from os import system, path, remove
+
+from sugar.graphics.tray import TrayIcon
+from sugar.graphics.xocolor import XoColor
+from sugar.graphics.palette import Palette
+from jarabe.frame.frameinvoker import FrameWidgetInvoker
+
+_STATUS_TEXT = {'capacitive': _('finger'), 'resistive': _('stylus')}
+_CAPACITIVE_ICON_NAME = 'touchpad-capacitive'
+_RESISTIVE_ICON_NAME = 'touchpad-resistive'
+_FLAG_PATH = '/home/olpc/.olpc-pentablet-mode'
+_NODE_PATH = '/sys/devices/platform/i8042/serio1/ptmode'
+
+
+class DeviceView(TrayIcon):
+ """ Manage the touchpad mode from the device palette on the Frame """
+
+ FRAME_POSITION_RELATIVE = 500
+
+ def __init__(self):
+ """ Create the touchpad palette and display it on Frame """
+
+ # Only appears when the device exisits
+ if not path.exists(_NODE_PATH):
+ return
+
+ if get_touchpad() == 'resistive':
+ icon_name = _RESISTIVE_ICON_NAME
+ else:
+ icon_name = _CAPACITIVE_ICON_NAME
+
+ client = gconf.client_get_default()
+ color = XoColor(client.get_string('/desktop/sugar/user/color'))
+ TrayIcon.__init__(self, icon_name=icon_name, xo_color=color)
+ self.set_palette_invoker(FrameWidgetInvoker(self))
+ self.connect('button-release-event', self.__button_release_event_cb)
+ self.connect('expose-event', self.__expose_event_cb)
+
+ def create_palette(self):
+ """ On create, set the current mode """
+ self.palette = ResourcePalette(_('My touchpad'), self.icon)
+ self.palette.set_group_id('frame')
+ return self.palette
+
+ def __button_release_event_cb(self, widget, event):
+ """ On button release, switch modes """
+ self.palette.toggle_mode()
+ return True
+
+ def __expose_event_cb(self, *args):
+ pass
+
+
+class ResourcePalette(Palette):
+ """ Query the current state of the touchpad and update the display """
+
+ def __init__(self, primary_text, icon):
+ """ Get the status """
+ Palette.__init__(self, label=primary_text)
+
+ self._icon = icon
+
+ self.connect('popup', self.__popup_cb)
+ self.connect('popdown', self.__popdown_cb)
+
+ self.updating = False
+
+ vbox = gtk.VBox()
+ self.set_content(vbox)
+
+ self._status_text = gtk.Label()
+ vbox.pack_start(self._status_text, padding=10)
+ self._status_text.show()
+
+ vbox.show()
+
+ self._mode = get_touchpad()
+ self.set_mode_graphics()
+
+ def set_mode_graphics(self):
+ """ Set the label and icon based on the current mode """
+ self._status_text.set_label(_STATUS_TEXT[self._mode])
+ if self._mode == 'resistive':
+ self._icon.props.icon_name = _RESISTIVE_ICON_NAME
+ else:
+ self._icon.props.icon_name = _CAPACITIVE_ICON_NAME
+
+ def toggle_mode(self):
+ """ On mouse click, toggle the mode """
+ if self._mode == 'capacitive':
+ self._mode = 'resistive'
+ else:
+ self._mode = 'capacitive'
+
+ set_touchpad(self._mode)
+ self.set_mode_graphics()
+
+ def __popup_cb(self, gobject):
+ self.updating = True
+
+ def __popdown_cb(self, gobject):
+ self.updating = False
+
+
+def setup(tray):
+ tray.add_device(DeviceView())
+
+
+def get_touchpad():
+ """ Get the touchpad mode. """
+ _file_handle = open(_NODE_PATH, "r")
+ _text = _file_handle.read()
+ _file_handle.close()
+
+ if _text[0] == '1':
+ return 'resistive'
+ else:
+ return 'capacitive'
+
+
+def set_touchpad(touchpad):
+ """ Set the touchpad mode. """
+ if touchpad == 'capacitive':
+ if path.exists(_FLAG_PATH):
+ remove(_FLAG_PATH)
+ system("echo 0 > %s" % (_NODE_PATH))
+ else:
+ _file_handle = open(_FLAG_PATH, "w")
+ _file_handle.close()
+ system("echo 1 > %s" % (_NODE_PATH))
+ return
--
1.7.0.4
--
Walter Bender
Sugar Labs
http://www.sugarlabs.org
More information about the Sugar-devel
mailing list