diff options
Diffstat (limited to 'pygtkcompat/pygtkcompat.py')
-rw-r--r-- | pygtkcompat/pygtkcompat.py | 501 |
1 files changed, 501 insertions, 0 deletions
diff --git a/pygtkcompat/pygtkcompat.py b/pygtkcompat/pygtkcompat.py new file mode 100644 index 0000000..7b37599 --- /dev/null +++ b/pygtkcompat/pygtkcompat.py @@ -0,0 +1,501 @@ +# -*- Mode: Python; py-indent-offset: 4 -*- +# vim: tabstop=4 shiftwidth=4 expandtab +# +# Copyright (C) 2011-2012 Johan Dahlin <johan@gnome.org> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 +# USA + +""" +PyGTK compatibility layer. + +This modules goes a little bit longer to maintain PyGTK compatibility than +the normal overrides system. + +It is recommended to not depend on this layer, but only use it as an +intermediate step when porting your application to PyGI. + +Compatibility might never be 100%, but the aim is to make it possible to run +a well behaved PyGTK application mostly unmodified on top of PyGI. + +""" + +import sys +import warnings + +try: + # Python 3 + from collections import UserList + from imp import reload + UserList # pyflakes +except ImportError: + # Python 2 ships that in a different module + from UserList import UserList + UserList # pyflakes + +import gi +from gi.repository import GObject + + +def _install_enums(module, dest=None, strip=''): + if dest is None: + dest = module + modname = dest.__name__.rsplit('.', 1)[1].upper() + for attr in dir(module): + try: + obj = getattr(module, attr, None) + except: + continue + try: + if issubclass(obj, GObject.GEnum): + for value, enum in obj.__enum_values__.items(): + name = enum.value_name + name = name.replace(modname + '_', '') + if strip and name.startswith(strip): + name = name[len(strip):] + setattr(dest, name, enum) + except TypeError: + continue + try: + if issubclass(obj, GObject.GFlags): + for value, flag in obj.__flags_values__.items(): + name = flag.value_names[-1].replace(modname + '_', '') + setattr(dest, name, flag) + except TypeError: + continue + + +def enable(): + # gobject + from gi.repository import GLib + sys.modules['glib'] = GLib + + # gobject + from gi.repository import GObject + sys.modules['gobject'] = GObject + from gi._gobject import propertyhelper + sys.modules['gobject.propertyhelper'] = propertyhelper + + # gio + from gi.repository import Gio + sys.modules['gio'] = Gio + +_unset = object() + + +def enable_gtk(version='2.0'): + # set the default encoding like PyGTK + reload(sys) + if sys.version_info < (3, 0): + sys.setdefaultencoding('utf-8') + + # atk + gi.require_version('Atk', '1.0') + from gi.repository import Atk + sys.modules['atk'] = Atk + _install_enums(Atk) + + # pango + gi.require_version('Pango', '1.0') + from gi.repository import Pango + sys.modules['pango'] = Pango + _install_enums(Pango) + + # pangocairo + gi.require_version('PangoCairo', '1.0') + from gi.repository import PangoCairo + sys.modules['pangocairo'] = PangoCairo + + # gdk + gi.require_version('Gdk', version) + gi.require_version('GdkPixbuf', '2.0') + from gi.repository import Gdk + from gi.repository import GdkPixbuf + sys.modules['gtk.gdk'] = Gdk + _install_enums(Gdk) + _install_enums(GdkPixbuf, dest=Gdk) + Gdk._2BUTTON_PRESS = 5 + Gdk.BUTTON_PRESS = 4 + + Gdk.screen_get_default = Gdk.Screen.get_default + Gdk.Pixbuf = GdkPixbuf.Pixbuf + Gdk.PixbufLoader = GdkPixbuf.PixbufLoader.new_with_type + Gdk.pixbuf_new_from_data = GdkPixbuf.Pixbuf.new_from_data + Gdk.pixbuf_new_from_file = GdkPixbuf.Pixbuf.new_from_file + Gdk.pixbuf_new_from_file_at_scale = GdkPixbuf.Pixbuf.new_from_file_at_scale + Gdk.pixbuf_new_from_file_at_size = GdkPixbuf.Pixbuf.new_from_file_at_size + Gdk.pixbuf_new_from_inline = GdkPixbuf.Pixbuf.new_from_inline + Gdk.pixbuf_new_from_stream = GdkPixbuf.Pixbuf.new_from_stream + Gdk.pixbuf_new_from_stream_at_scale = GdkPixbuf.Pixbuf.new_from_stream_at_scale + Gdk.pixbuf_new_from_xpm_data = GdkPixbuf.Pixbuf.new_from_xpm_data + Gdk.pixbuf_get_file_info = GdkPixbuf.Pixbuf.get_file_info + + orig_get_formats = GdkPixbuf.Pixbuf.get_formats + + def get_formats(): + formats = orig_get_formats() + result = [] + + def make_dict(format_): + result = {} + result['description'] = format_.get_description() + result['name'] = format_.get_name() + result['mime_types'] = format_.get_mime_types() + result['extensions'] = format_.get_extensions() + return result + + for format_ in formats: + result.append(make_dict(format_)) + return result + + Gdk.pixbuf_get_formats = get_formats + + orig_get_frame_extents = Gdk.Window.get_frame_extents + + def get_frame_extents(window): + try: + try: + rect = Gdk.Rectangle(0, 0, 0, 0) + except TypeError: + rect = Gdk.Rectangle() + orig_get_frame_extents(window, rect) + except TypeError: + rect = orig_get_frame_extents(window) + return rect + Gdk.Window.get_frame_extents = get_frame_extents + + orig_get_origin = Gdk.Window.get_origin + + def get_origin(self): + return orig_get_origin(self)[1:] + Gdk.Window.get_origin = get_origin + + Gdk.screen_width = Gdk.Screen.width + Gdk.screen_height = Gdk.Screen.height + + # gtk + gi.require_version('Gtk', version) + from gi.repository import Gtk + sys.modules['gtk'] = Gtk + Gtk.gdk = Gdk + + Gtk.pygtk_version = (2, 99, 0) + + Gtk.gtk_version = (Gtk.MAJOR_VERSION, + Gtk.MINOR_VERSION, + Gtk.MICRO_VERSION) + _install_enums(Gtk) + + # Action + + def set_tool_item_type(menuaction, gtype): + warnings.warn('set_tool_item_type() is not supported', + gi.PyGIDeprecationWarning, stacklevel=2) + Gtk.Action.set_tool_item_type = classmethod(set_tool_item_type) + + # Alignment + + orig_Alignment = Gtk.Alignment + + class Alignment(orig_Alignment): + def __init__(self, xalign=0.0, yalign=0.0, xscale=0.0, yscale=0.0): + orig_Alignment.__init__(self) + self.props.xalign = xalign + self.props.yalign = yalign + self.props.xscale = xscale + self.props.yscale = yscale + + Gtk.Alignment = Alignment + + # Box + + orig_pack_end = Gtk.Box.pack_end + + def pack_end(self, child, expand=True, fill=True, padding=0): + orig_pack_end(self, child, expand, fill, padding) + Gtk.Box.pack_end = pack_end + + orig_pack_start = Gtk.Box.pack_start + + def pack_start(self, child, expand=True, fill=True, padding=0): + orig_pack_start(self, child, expand, fill, padding) + Gtk.Box.pack_start = pack_start + + # TreeViewColumn + + orig_tree_view_column_pack_end = Gtk.TreeViewColumn.pack_end + + def tree_view_column_pack_end(self, cell, expand=True): + orig_tree_view_column_pack_end(self, cell, expand) + Gtk.TreeViewColumn.pack_end = tree_view_column_pack_end + + orig_tree_view_column_pack_start = Gtk.TreeViewColumn.pack_start + + def tree_view_column_pack_start(self, cell, expand=True): + orig_tree_view_column_pack_start(self, cell, expand) + Gtk.TreeViewColumn.pack_start = tree_view_column_pack_start + + # CellLayout + + orig_cell_pack_end = Gtk.CellLayout.pack_end + + def cell_pack_end(self, cell, expand=True): + orig_cell_pack_end(self, cell, expand) + Gtk.CellLayout.pack_end = cell_pack_end + + orig_cell_pack_start = Gtk.CellLayout.pack_start + + def cell_pack_start(self, cell, expand=True): + orig_cell_pack_start(self, cell, expand) + Gtk.CellLayout.pack_start = cell_pack_start + + orig_set_cell_data_func = Gtk.CellLayout.set_cell_data_func + + def set_cell_data_func(self, cell, func, user_data=_unset): + def callback(*args): + if args[-1] == _unset: + args = args[:-1] + return func(*args) + orig_set_cell_data_func(self, cell, callback, user_data) + Gtk.CellLayout.set_cell_data_func = set_cell_data_func + + # CellRenderer + + class GenericCellRenderer(Gtk.CellRenderer): + pass + Gtk.GenericCellRenderer = GenericCellRenderer + + # ComboBox + + orig_combo_row_separator_func = Gtk.ComboBox.set_row_separator_func + + def combo_row_separator_func(self, func, user_data=_unset): + def callback(*args): + if args[-1] == _unset: + args = args[:-1] + return func(*args) + orig_combo_row_separator_func(self, callback, user_data) + Gtk.ComboBox.set_row_separator_func = combo_row_separator_func + + # ComboBoxEntry + + class ComboBoxEntry(Gtk.ComboBox): + def __init__(self, **kwds): + Gtk.ComboBox.__init__(self, has_entry=True, **kwds) + + def set_text_column(self, text_column): + self.set_entry_text_column(text_column) + + def get_text_column(self): + return self.get_entry_text_column() + Gtk.ComboBoxEntry = ComboBoxEntry + + def combo_box_entry_new(): + return Gtk.ComboBoxEntry() + Gtk.combo_box_entry_new = combo_box_entry_new + + def combo_box_entry_new_with_model(model): + return Gtk.ComboBoxEntry(model=model) + Gtk.combo_box_entry_new_with_model = combo_box_entry_new_with_model + + # Container + + def install_child_property(container, flag, pspec): + warnings.warn('install_child_property() is not supported', + gi.PyGIDeprecationWarning, stacklevel=2) + Gtk.Container.install_child_property = classmethod(install_child_property) + + def new_text(): + combo = Gtk.ComboBox() + model = Gtk.ListStore(str) + combo.set_model(model) + combo.set_entry_text_column(0) + return combo + Gtk.combo_box_new_text = new_text + + def append_text(self, text): + model = self.get_model() + model.append([text]) + Gtk.ComboBox.append_text = append_text + Gtk.expander_new_with_mnemonic = Gtk.Expander.new_with_mnemonic + Gtk.icon_theme_get_default = Gtk.IconTheme.get_default + Gtk.image_new_from_pixbuf = Gtk.Image.new_from_pixbuf + Gtk.image_new_from_stock = Gtk.Image.new_from_stock + Gtk.image_new_from_animation = Gtk.Image.new_from_animation + Gtk.image_new_from_icon_set = Gtk.Image.new_from_icon_set + Gtk.image_new_from_file = Gtk.Image.new_from_file + Gtk.settings_get_default = Gtk.Settings.get_default + Gtk.window_set_default_icon = Gtk.Window.set_default_icon + Gtk.clipboard_get = Gtk.Clipboard.get + + #AccelGroup + Gtk.AccelGroup.connect_group = Gtk.AccelGroup.connect + + #StatusIcon + Gtk.status_icon_position_menu = Gtk.StatusIcon.position_menu + Gtk.StatusIcon.set_tooltip = Gtk.StatusIcon.set_tooltip_text + + # Scale + + orig_HScale = Gtk.HScale + orig_VScale = Gtk.VScale + + class HScale(orig_HScale): + def __init__(self, adjustment=None): + orig_HScale.__init__(self, adjustment=adjustment) + Gtk.HScale = HScale + + class VScale(orig_VScale): + def __init__(self, adjustment=None): + orig_VScale.__init__(self, adjustment=adjustment) + Gtk.VScale = VScale + + Gtk.stock_add = lambda items: None + + # Widget + + Gtk.widget_get_default_direction = Gtk.Widget.get_default_direction + orig_size_request = Gtk.Widget.size_request + + def size_request(widget): + class SizeRequest(UserList): + def __init__(self, req): + self.height = req.height + self.width = req.width + UserList.__init__(self, [self.width, self.height]) + return SizeRequest(orig_size_request(widget)) + Gtk.Widget.size_request = size_request + Gtk.Widget.hide_all = Gtk.Widget.hide + + class BaseGetter(object): + def __init__(self, context): + self.context = context + + def __getitem__(self, state): + color = self.context.get_background_color(state) + return Gdk.Color(red=int(color.red * 65535), + green=int(color.green * 65535), + blue=int(color.blue * 65535)) + + class Styles(object): + def __init__(self, widget): + context = widget.get_style_context() + self.base = BaseGetter(context) + self.black = Gdk.Color(red=0, green=0, blue=0) + + class StyleDescriptor(object): + def __get__(self, instance, class_): + return Styles(instance) + Gtk.Widget.style = StyleDescriptor() + + # gtk.unixprint + + class UnixPrint(object): + pass + unixprint = UnixPrint() + sys.modules['gtkunixprint'] = unixprint + + # gtk.keysyms + + class Keysyms(object): + pass + keysyms = Keysyms() + sys.modules['gtk.keysyms'] = keysyms + Gtk.keysyms = keysyms + for name in dir(Gdk): + if name.startswith('KEY_'): + target = name[4:] + if target[0] in '0123456789': + target = '_' + target + value = getattr(Gdk, name) + setattr(keysyms, target, value) + + +def enable_vte(): + gi.require_version('Vte', '0.0') + from gi.repository import Vte + sys.modules['vte'] = Vte + + +def enable_poppler(): + gi.require_version('Poppler', '0.18') + from gi.repository import Poppler + sys.modules['poppler'] = Poppler + Poppler.pypoppler_version = (1, 0, 0) + + +def enable_webkit(version='1.0'): + gi.require_version('WebKit', version) + from gi.repository import WebKit + sys.modules['webkit'] = WebKit + WebKit.WebView.get_web_inspector = WebKit.WebView.get_inspector + + +def enable_gudev(): + gi.require_version('GUdev', '1.0') + from gi.repository import GUdev + sys.modules['gudev'] = GUdev + + +def enable_gst(): + gi.require_version('Gst', '0.10') + from gi.repository import Gst + sys.modules['gst'] = Gst + _install_enums(Gst) + Gst.registry_get_default = Gst.Registry.get_default + Gst.element_register = Gst.Element.register + Gst.element_factory_make = Gst.ElementFactory.make + Gst.caps_new_any = Gst.Caps.new_any + Gst.get_pygst_version = lambda: (0, 10, 19) + Gst.get_gst_version = lambda: (0, 10, 40) + + from gi.repository import GstInterfaces + sys.modules['gst.interfaces'] = GstInterfaces + _install_enums(GstInterfaces) + + from gi.repository import GstAudio + sys.modules['gst.audio'] = GstAudio + _install_enums(GstAudio) + + from gi.repository import GstVideo + sys.modules['gst.video'] = GstVideo + _install_enums(GstVideo) + + from gi.repository import GstBase + sys.modules['gst.base'] = GstBase + _install_enums(GstBase) + + Gst.BaseTransform = GstBase.BaseTransform + Gst.BaseSink = GstBase.BaseSink + + from gi.repository import GstController + sys.modules['gst.controller'] = GstController + _install_enums(GstController, dest=Gst) + + from gi.repository import GstPbutils + sys.modules['gst.pbutils'] = GstPbutils + _install_enums(GstPbutils) + + +def enable_goocanvas(): + gi.require_version('GooCanvas', '2.0') + from gi.repository import GooCanvas + sys.modules['goocanvas'] = GooCanvas + _install_enums(GooCanvas, strip='GOO_CANVAS_') + GooCanvas.ItemSimple = GooCanvas.CanvasItemSimple + GooCanvas.Item = GooCanvas.CanvasItem + GooCanvas.Image = GooCanvas.CanvasImage + GooCanvas.Group = GooCanvas.CanvasGroup + GooCanvas.Rect = GooCanvas.CanvasRect |