|
Packit |
3ff832 |
# vim:set et sts=4 sw=4:
|
|
Packit |
3ff832 |
#
|
|
Packit |
3ff832 |
# ibus - The Input Bus
|
|
Packit |
3ff832 |
#
|
|
Packit |
3ff832 |
# Copyright (c) 2007-2010 Peng Huang <shawn.p.huang@gmail.com>
|
|
Packit |
3ff832 |
# Copyright (c) 2007-2010 Red Hat, Inc.
|
|
Packit |
3ff832 |
#
|
|
Packit |
3ff832 |
# This library is free software; you can redistribute it and/or
|
|
Packit |
3ff832 |
# modify it under the terms of the GNU Lesser General Public
|
|
Packit |
3ff832 |
# License as published by the Free Software Foundation; either
|
|
Packit |
3ff832 |
# version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
3ff832 |
#
|
|
Packit |
3ff832 |
# This library is distributed in the hope that it will be useful,
|
|
Packit |
3ff832 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
3ff832 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
3ff832 |
# Lesser General Public License for more details.
|
|
Packit |
3ff832 |
#
|
|
Packit |
3ff832 |
# You should have received a copy of the GNU Lesser General Public
|
|
Packit |
3ff832 |
# License along with this library; if not, write to the Free Software
|
|
Packit |
3ff832 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
|
Packit |
3ff832 |
# USA
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
__all__ = (
|
|
Packit |
3ff832 |
"PROP_TYPE_NORMAL",
|
|
Packit |
3ff832 |
"PROP_TYPE_TOGGLE",
|
|
Packit |
3ff832 |
"PROP_TYPE_RADIO",
|
|
Packit |
3ff832 |
"PROP_TYPE_SEPARATOR",
|
|
Packit |
3ff832 |
"PROP_TYPE_MENU",
|
|
Packit |
3ff832 |
"PROP_STATE_UNCHECKED",
|
|
Packit |
3ff832 |
"PROP_STATE_CHECKED",
|
|
Packit |
3ff832 |
"PROP_STATE_INCONSISTENT",
|
|
Packit |
3ff832 |
"Property",
|
|
Packit |
3ff832 |
"PropList",
|
|
Packit |
3ff832 |
)
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
import dbus
|
|
Packit |
3ff832 |
from text import Text
|
|
Packit |
3ff832 |
from serializable import *
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
PROP_TYPE_NORMAL = 0
|
|
Packit |
3ff832 |
PROP_TYPE_TOGGLE = 1
|
|
Packit |
3ff832 |
PROP_TYPE_RADIO = 2
|
|
Packit |
3ff832 |
PROP_TYPE_MENU = 3
|
|
Packit |
3ff832 |
PROP_TYPE_SEPARATOR = 4
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
PROP_STATE_UNCHECKED = 0
|
|
Packit |
3ff832 |
PROP_STATE_CHECKED = 1
|
|
Packit |
3ff832 |
PROP_STATE_INCONSISTENT = 2
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def _to_unicode(text):
|
|
Packit |
3ff832 |
if isinstance(text, unicode):
|
|
Packit |
3ff832 |
return text
|
|
Packit |
3ff832 |
if isinstance(text, str):
|
|
Packit |
3ff832 |
return unicode(text, "utf8")
|
|
Packit |
3ff832 |
raise TypeError("text must be instance of unicode or str")
|
|
Packit |
3ff832 |
def _to_text(text):
|
|
Packit |
3ff832 |
if isinstance(text, Text):
|
|
Packit |
3ff832 |
return text
|
|
Packit |
3ff832 |
text = _to_unicode(text)
|
|
Packit |
3ff832 |
return Text(text)
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
class Property(Serializable):
|
|
Packit |
3ff832 |
__gtype_name__ = "PYIBusProperty"
|
|
Packit |
3ff832 |
__NAME__ = "IBusProperty"
|
|
Packit |
3ff832 |
def __init__(self, key="", type=PROP_TYPE_NORMAL, label=u"", icon=u"", tooltip=u"",
|
|
Packit |
3ff832 |
sensitive=True, visible=True, state=PROP_STATE_UNCHECKED,
|
|
Packit |
3ff832 |
symbol=u""):
|
|
Packit |
3ff832 |
super(Property, self).__init__()
|
|
Packit |
3ff832 |
self.__key = _to_unicode(key)
|
|
Packit |
3ff832 |
self.__type = type
|
|
Packit |
3ff832 |
self.label = label
|
|
Packit |
3ff832 |
self.symbol = symbol
|
|
Packit |
3ff832 |
self.icon = icon
|
|
Packit |
3ff832 |
self.tooltip = tooltip
|
|
Packit |
3ff832 |
self.sensitive = sensitive
|
|
Packit |
3ff832 |
self.visible = visible
|
|
Packit |
3ff832 |
self.state = state
|
|
Packit |
3ff832 |
self.sub_props = PropList()
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def set_sub_props(self, props):
|
|
Packit |
3ff832 |
self.__sub_props = props
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def get_sub_props(self):
|
|
Packit |
3ff832 |
return self.__sub_props
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def get_key(self):
|
|
Packit |
3ff832 |
return self.__key
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def get_type(self):
|
|
Packit |
3ff832 |
return self.__type
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def set_label(self, label):
|
|
Packit |
3ff832 |
self.__label = _to_text(label)
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def get_label(self):
|
|
Packit |
3ff832 |
return self.__label
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def set_symbol(self, symbol):
|
|
Packit |
3ff832 |
self.__symbol = _to_text(symbol)
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def get_symbol(self):
|
|
Packit |
3ff832 |
return self.__symbol
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def set_icon(self, icon):
|
|
Packit |
3ff832 |
self.__icon = _to_unicode(icon)
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def get_icon(self):
|
|
Packit |
3ff832 |
return self.__icon
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def set_tooltip(self, tooltip):
|
|
Packit |
3ff832 |
self.__tooltip = _to_text(tooltip)
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def get_tooltip(self):
|
|
Packit |
3ff832 |
return self.__tooltip
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def set_state(self, state):
|
|
Packit |
3ff832 |
self.__state = state
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def get_state(self):
|
|
Packit |
3ff832 |
return self.__state
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def set_sensitive(self, sensitive):
|
|
Packit |
3ff832 |
self.__sensitive = sensitive
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def get_sensitive(self):
|
|
Packit |
3ff832 |
return self.__sensitive
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def set_visible(self, visible):
|
|
Packit |
3ff832 |
self.__visible = visible
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def get_visible(self):
|
|
Packit |
3ff832 |
return self.__visible
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
key = property(get_key)
|
|
Packit |
3ff832 |
type = property(get_type)
|
|
Packit |
3ff832 |
label = property(get_label, set_label)
|
|
Packit |
3ff832 |
symbol = property(get_symbol, set_symbol)
|
|
Packit |
3ff832 |
icon = property(get_icon, set_icon)
|
|
Packit |
3ff832 |
tooltip = property(get_tooltip, set_tooltip)
|
|
Packit |
3ff832 |
state = property(get_state, set_state)
|
|
Packit |
3ff832 |
sensitive = property(get_sensitive, set_sensitive)
|
|
Packit |
3ff832 |
visible = property(get_visible, set_visible)
|
|
Packit |
3ff832 |
sub_props = property(get_sub_props, set_sub_props)
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def is_same(self, prop, test_all = True):
|
|
Packit |
3ff832 |
if self.__name != prop.__name or self.__type != prop.__type:
|
|
Packit |
3ff832 |
return False
|
|
Packit |
3ff832 |
if not test_all:
|
|
Packit |
3ff832 |
return True
|
|
Packit |
3ff832 |
if self.__label != prop.__label or \
|
|
Packit |
3ff832 |
self.__symbol != prop.__symbol or \
|
|
Packit |
3ff832 |
self.__icon != prop.__icon or \
|
|
Packit |
3ff832 |
self.__tooltip != prop.__tooltip or \
|
|
Packit |
3ff832 |
self.__sensitive != prop.__sensitive or \
|
|
Packit |
3ff832 |
self.__visible != prop.__visible or \
|
|
Packit |
3ff832 |
self.__state != prop.__state:
|
|
Packit |
3ff832 |
return False
|
|
Packit |
3ff832 |
return self.__sub_props.is_same(prop.__sub_props, test_all)
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def serialize(self, struct):
|
|
Packit |
3ff832 |
super(Property, self).serialize(struct)
|
|
Packit |
3ff832 |
struct.append(dbus.String(self.__key))
|
|
Packit |
3ff832 |
struct.append(dbus.UInt32(self.__type))
|
|
Packit |
3ff832 |
struct.append(serialize_object(self.__label))
|
|
Packit |
3ff832 |
struct.append(dbus.String(self.__icon))
|
|
Packit |
3ff832 |
struct.append(serialize_object(self.__tooltip))
|
|
Packit |
3ff832 |
struct.append(dbus.Boolean(self.__sensitive))
|
|
Packit |
3ff832 |
struct.append(dbus.Boolean(self.__visible))
|
|
Packit |
3ff832 |
struct.append(dbus.UInt32(self.__state))
|
|
Packit |
3ff832 |
sub_props = serialize_object(self.__sub_props)
|
|
Packit |
3ff832 |
struct.append(sub_props)
|
|
Packit |
3ff832 |
struct.append(serialize_object(self.__symbol))
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def deserialize(self, struct):
|
|
Packit |
3ff832 |
super(Property, self).deserialize(struct)
|
|
Packit |
3ff832 |
self.__key = struct.pop(0)
|
|
Packit |
3ff832 |
self.__type = struct.pop(0)
|
|
Packit |
3ff832 |
self.__label = deserialize_object(struct.pop(0))
|
|
Packit |
3ff832 |
self.__icon = struct.pop(0)
|
|
Packit |
3ff832 |
self.__tooltip = deserialize_object(struct.pop(0))
|
|
Packit |
3ff832 |
self.__sensitive = deserialize_object(struct.pop(0))
|
|
Packit |
3ff832 |
self.__visible = struct.pop(0)
|
|
Packit |
3ff832 |
self.__state = struct.pop(0)
|
|
Packit |
3ff832 |
props = struct.pop(0)
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
self.__sub_props = deserialize_object(props)
|
|
Packit |
3ff832 |
self.__symbol = deserialize_object(struct.pop(0))
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
class PropList(Serializable):
|
|
Packit |
3ff832 |
__gtype_name__ = "PYIBusPropList"
|
|
Packit |
3ff832 |
__NAME__ = "IBusPropList"
|
|
Packit |
3ff832 |
def __init__(self):
|
|
Packit |
3ff832 |
super(PropList, self).__init__()
|
|
Packit |
3ff832 |
self.__props = []
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def append(self, prop):
|
|
Packit |
3ff832 |
self.__props.append(prop)
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def prepend(self, prop):
|
|
Packit |
3ff832 |
self.__props.insert(0, prop)
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def insert(self, index, prop):
|
|
Packit |
3ff832 |
self.__props.insert(index, prop)
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def get_properties(self):
|
|
Packit |
3ff832 |
return self.__props[:]
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def is_same(self, props, test_all = True):
|
|
Packit |
3ff832 |
if len(props.get_properties()) != len(self.get_properties()):
|
|
Packit |
3ff832 |
return False
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
for a, b in zip(self.get_properties(), props.get_properties()):
|
|
Packit |
3ff832 |
if not a.is_same(b, test_all):
|
|
Packit |
3ff832 |
return False
|
|
Packit |
3ff832 |
return False
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def serialize(self, struct):
|
|
Packit |
3ff832 |
super(PropList, self).serialize(struct)
|
|
Packit |
3ff832 |
props = map(lambda p: serialize_object(p), self.__props)
|
|
Packit |
3ff832 |
struct.append (dbus.Array(props, signature = "v"))
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def deserialize(self, struct):
|
|
Packit |
3ff832 |
super(PropList, self).deserialize(struct)
|
|
Packit |
3ff832 |
props = map(lambda v: deserialize_object(v), struct.pop(0))
|
|
Packit |
3ff832 |
self.__props = props
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def __iter__(self):
|
|
Packit |
3ff832 |
return self.__props.__iter__()
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def __getitem__(self, i):
|
|
Packit |
3ff832 |
return self.__props.__getitem__(i)
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
def test():
|
|
Packit |
3ff832 |
props = PropList()
|
|
Packit |
3ff832 |
props.append(Property(u"a"))
|
|
Packit |
3ff832 |
props.append(Property(u"b"))
|
|
Packit |
3ff832 |
props.append(Property(u"c"))
|
|
Packit |
3ff832 |
props.append(Property(u"d"))
|
|
Packit |
3ff832 |
value = serialize_object(props)
|
|
Packit |
3ff832 |
props = deserialize_object(value)
|
|
Packit |
3ff832 |
print props
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
if __name__ == "__main__":
|
|
Packit |
3ff832 |
test()
|