123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575 |
- # -*- 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
- UserList # pyflakes
- with warnings.catch_warnings():
- warnings.simplefilter('ignore')
- from imp import reload
- 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():
- try:
- name = flag.value_names[-1].replace(modname + '_', '')
- except IndexError:
- # FIXME: this happens for some large flags which do not
- # fit into a long on 32 bit systems
- continue
- 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 import _propertyhelper
- sys.modules['gobject.propertyhelper'] = _propertyhelper
- # gio
- from gi.repository import Gio
- sys.modules['gio'] = Gio
- _unset = object()
- def enable_gtk(version='3.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
- try:
- Gdk.pixbuf_new_from_file_at_scale = GdkPixbuf.Pixbuf.new_from_file_at_scale
- except AttributeError:
- pass
- 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
- orig_gdk_window_get_geometry = Gdk.Window.get_geometry
- def gdk_window_get_geometry(window):
- return orig_gdk_window_get_geometry(window) + (window.get_visual().get_best_depth(),)
- Gdk.Window.get_geometry = gdk_window_get_geometry
- # 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
- try:
- Gtk.clipboard_get = Gtk.Clipboard.get
- except AttributeError:
- pass
- # 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.window = property(fget=Gtk.Widget.get_window)
- 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()
- # TextView
- orig_text_view_scroll_to_mark = Gtk.TextView.scroll_to_mark
- def text_view_scroll_to_mark(self, mark, within_margin,
- use_align=False, xalign=0.5, yalign=0.5):
- return orig_text_view_scroll_to_mark(self, mark, within_margin,
- use_align, xalign, yalign)
- Gtk.TextView.scroll_to_mark = text_view_scroll_to_mark
- # Window
- orig_set_geometry_hints = Gtk.Window.set_geometry_hints
- def set_geometry_hints(self, geometry_widget=None,
- min_width=-1, min_height=-1, max_width=-1, max_height=-1,
- base_width=-1, base_height=-1, width_inc=-1, height_inc=-1,
- min_aspect=-1.0, max_aspect=-1.0):
- geometry = Gdk.Geometry()
- geom_mask = Gdk.WindowHints(0)
- if min_width >= 0 or min_height >= 0:
- geometry.min_width = max(min_width, 0)
- geometry.min_height = max(min_height, 0)
- geom_mask |= Gdk.WindowHints.MIN_SIZE
- if max_width >= 0 or max_height >= 0:
- geometry.max_width = max(max_width, 0)
- geometry.max_height = max(max_height, 0)
- geom_mask |= Gdk.WindowHints.MAX_SIZE
- if base_width >= 0 or base_height >= 0:
- geometry.base_width = max(base_width, 0)
- geometry.base_height = max(base_height, 0)
- geom_mask |= Gdk.WindowHints.BASE_SIZE
- if width_inc >= 0 or height_inc >= 0:
- geometry.width_inc = max(width_inc, 0)
- geometry.height_inc = max(height_inc, 0)
- geom_mask |= Gdk.WindowHints.RESIZE_INC
- if min_aspect >= 0.0 or max_aspect >= 0.0:
- if min_aspect <= 0.0 or max_aspect <= 0.0:
- raise TypeError("aspect ratios must be positive")
- geometry.min_aspect = min_aspect
- geometry.max_aspect = max_aspect
- geom_mask |= Gdk.WindowHints.ASPECT
- return orig_set_geometry_hints(self, geometry_widget, geometry, geom_mask)
- Gtk.Window.set_geometry_hints = set_geometry_hints
- Gtk.window_list_toplevels = Gtk.Window.list_toplevels
- Gtk.window_set_default_icon_name = Gtk.Window.set_default_icon_name
- # gtk.unixprint
- class UnixPrint(object):
- pass
- unixprint = UnixPrint()
- sys.modules['gtkunixprint'] = unixprint
- # gtk.keysyms
- with warnings.catch_warnings():
- warnings.simplefilter('ignore', category=RuntimeWarning)
- from gi.overrides import keysyms
- sys.modules['gtk.keysyms'] = keysyms
- Gtk.keysyms = keysyms
- from . import generictreemodel
- Gtk.GenericTreeModel = generictreemodel.GenericTreeModel
- 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
|