From c91efbf665aad71b69d1f43196b57f01ad631a4e Mon Sep 17 00:00:00 2001 From: C. Scott Ananian Date: Tue, 25 Oct 2011 07:08:15 +0000 Subject: Run automatic conversion to gtk3/gir. This doesn't actually work under gtk3 yet, but it shouldn't break on gtk2. --- diff --git a/TurtleArt/sprites.py b/TurtleArt/sprites.py index 8bd3738..b851be8 100644 --- a/TurtleArt/sprites.py +++ b/TurtleArt/sprites.py @@ -42,7 +42,7 @@ Example usage: return True # Create a new sprite collection for a gtk Drawing Area. - my_drawing_area = gtk.DrawingArea() + my_drawing_area = Gtk.DrawingArea() self.sprite_list = Sprites(my_drawing_area) # Create a "pixbuf" (in this example, from SVG). @@ -70,18 +70,21 @@ Example usage: # method for converting SVG to a gtk pixbuf def svg_str_to_pixbuf(svg_string): - pl = gtk.gdk.PixbufLoader('svg') + pl = GdkPixbuf.PixbufLoader('svg') pl.write(svg_string) pl.close() pixbuf = pl.get_pixbuf() return pixbuf """ -import pygtk -pygtk.require('2.0') -import gtk -import pango +from util.gtkcompat import Gtk, Gdk, GdkPixbuf, Pango, Rectangle +def _is_pixbuf(pb): + if isinstance(pb, GdkPixbuf.Pixbuf): return True + # backwards gtk2 compatibility hack + if hasattr(Gdk, 'Pixbuf'): + if isinstance(pb, Gdk.Pixbuf): return True + return False class Sprites: """ A class for the list of sprites and everything they share in common """ @@ -158,7 +161,7 @@ class Sprite: def __init__(self, sprites, x, y, image): """ Initialize an individual sprite """ self._sprites = sprites - self.rect = gtk.gdk.Rectangle(int(x), int(y), 0, 0) + self.rect = Rectangle(int(x), int(y), 0, 0) self.save_xy = (x, y) # remember initial (x, y) position self._scale = [12] self._rescale = [True] @@ -187,7 +190,7 @@ class Sprite: self.images[i] = image self._dx[i] = dx self._dy[i] = dy - if isinstance(self.images[i], gtk.gdk.Pixbuf): + if _is_pixbuf(self.images[i]): w = self.images[i].get_width() h = self.images[i].get_height() else: @@ -279,7 +282,7 @@ class Sprite: def set_font(self, font): """ Set the font for a label """ - self._fd = pango.FontDescription(font) + self._fd = Pango.FontDescription(font) def set_label_color(self, rgb): """ Set the font color for a label """ @@ -312,7 +315,7 @@ class Sprite: if self._sprites is None: return for i, img in enumerate(self.images): - if isinstance(img, gtk.gdk.Pixbuf): + if _is_pixbuf(img): self._sprites.area.draw_pixbuf(self._sprites.gc, img, 0, 0, self.rect.x + self._dx[i], self.rect.y + self._dy[i]) @@ -347,23 +350,23 @@ class Sprite: my_height = self.rect.height - self._margins[1] - self._margins[3] for i in range(len(self.labels)): pl = self._sprites.canvas.create_pango_layout(str(self.labels[i])) - self._fd.set_size(int(self._scale[i] * pango.SCALE)) + self._fd.set_size(int(self._scale[i] * Pango.SCALE)) pl.set_font_description(self._fd) - w = pl.get_size()[0] / pango.SCALE + w = pl.get_size()[0] / Pango.SCALE if w > my_width: if self._rescale[i]: self._fd.set_size( - int(self._scale[i] * pango.SCALE * my_width / w)) + int(self._scale[i] * Pango.SCALE * my_width / w)) pl.set_font_description(self._fd) - w = pl.get_size()[0] / pango.SCALE + w = pl.get_size()[0] / Pango.SCALE else: j = len(self.labels[i]) - 1 while(w > my_width and j > 0): pl = self._sprites.canvas.create_pango_layout( "…" + self.labels[i][len(self.labels[i]) - j:]) - self._fd.set_size(int(self._scale[i] * pango.SCALE)) + self._fd.set_size(int(self._scale[i] * Pango.SCALE)) pl.set_font_description(self._fd) - w = pl.get_size()[0] / pango.SCALE + w = pl.get_size()[0] / Pango.SCALE j -= 1 if self._horiz_align[i] == "center": x = int(self.rect.x + self._margins[0] + (my_width - w) / 2) @@ -371,7 +374,7 @@ class Sprite: x = int(self.rect.x + self._margins[0]) else: # right x = int(self.rect.x + self.rect.width - w - self._margins[2]) - h = pl.get_size()[1] / pango.SCALE + h = pl.get_size()[1] / Pango.SCALE if self._vert_align[i] == "middle": y = int(self.rect.y + self._margins[1] + (my_height - h) / 2) elif self._vert_align[i] == "top": @@ -386,9 +389,9 @@ class Sprite: max = 0 for i in range(len(self.labels)): pl = self._sprites.canvas.create_pango_layout(self.labels[i]) - self._fd.set_size(int(self._scale[i] * pango.SCALE)) + self._fd.set_size(int(self._scale[i] * Pango.SCALE)) pl.set_font_description(self._fd) - w = pl.get_size()[0] / pango.SCALE + w = pl.get_size()[0] / Pango.SCALE if w > max: max = w return max @@ -410,7 +413,7 @@ class Sprite: x, y = pos x = x - self.rect.x y = y - self.rect.y - if isinstance(self.images[i], gtk.gdk.Pixbuf): + if _is_pixbuf(self.images[i]): if y > self.images[i].get_height() - 1: return(-1, -1, -1, -1) array = self.images[i].get_pixels() diff --git a/TurtleArt/tablock.py b/TurtleArt/tablock.py index d2292b1..8b9b229 100644 --- a/TurtleArt/tablock.py +++ b/TurtleArt/tablock.py @@ -19,7 +19,7 @@ #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN #THE SOFTWARE. -import gtk +from util.gtkcompat import Gtk from gettext import gettext as _ from taconstants import EXPANDABLE, EXPANDABLE_ARGS, OLD_NAMES, CONSTANTS, \ @@ -265,7 +265,7 @@ class Block: if self.spr is None: return if self._image is not None: - tmp = self._image.scale_simple(w, h, gtk.gdk.INTERP_NEAREST) + tmp = self._image.scale_simple(w, h, GdkPixbuf.InterpType.NEAREST) self.spr.set_image(tmp, 1, x, y) def rescale(self, scale): diff --git a/TurtleArt/tacanvas.py b/TurtleArt/tacanvas.py index 59fcb1c..a5bbbb8 100644 --- a/TurtleArt/tacanvas.py +++ b/TurtleArt/tacanvas.py @@ -20,9 +20,8 @@ #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN #THE SOFTWARE. -import gtk +from util.gtkcompat import Gtk, Gdk, Pango, Rectangle from math import sin, cos, pi -import pango import cairo import base64 from gettext import gettext as _ @@ -123,7 +122,7 @@ class TurtleGraphics: self.height = height if self.tw.interactive_mode: self.canvas = Sprite(tw.sprite_list, 0, 0, - gtk.gdk.Pixmap(self.tw.area, self.width * 2, + Gdk.Pixmap(self.tw.area, self.width * 2, self.height * 2, -1)) else: self.canvas = Sprite(None, 0, 0, self.tw.window) @@ -202,7 +201,7 @@ class TurtleGraphics: def clearscreen(self, share=True): """Clear the canvas and reset most graphics attributes to defaults.""" - rect = gtk.gdk.Rectangle(0, 0, self.width * 2, self.height * 2) + rect = Rectangle(0, 0, self.width * 2, self.height * 2) self.gc.set_foreground(self.bgcolor) self.canvas.images[0].draw_rectangle(self.gc, True, *rect) self.invalt(0, 0, self.width, self.height) @@ -399,7 +398,7 @@ class TurtleGraphics: return self.tw.active_turtle.set_pen_size(ps) self.gc.set_line_attributes(int(self.pensize * self.tw.coord_scale), - gtk.gdk.LINE_SOLID, gtk.gdk.CAP_ROUND, gtk.gdk.JOIN_MITER) + Gdk.LINE_SOLID, Gdk.CAP_ROUND, Gdk.JOIN_MITER) self.svg.set_stroke_width(self.pensize) if self.tw.sharing() and share: event = "w|%s" % (data_to_string([self._get_my_nick(), @@ -472,7 +471,7 @@ class TurtleGraphics: oldc, olds = self.color, self.shade self.setcolor(c, False) self.setshade(s, False) - rect = gtk.gdk.Rectangle(0, 0, self.width * 2, self.height * 2) + rect = Rectangle(0, 0, self.width * 2, self.height * 2) self.gc.set_foreground(self.fgcolor) self.bgrgb = self.fgrgb[:] self.canvas.images[0].draw_rectangle(self.gc, True, *rect) @@ -562,9 +561,9 @@ class TurtleGraphics: """ Draw text """ w *= self.tw.coord_scale self.gc.set_foreground(self.fgcolor) - fd = pango.FontDescription('Sans') + fd = Pango.FontDescription('Sans') try: - fd.set_size(int(size * self.tw.coord_scale) * pango.SCALE) + fd.set_size(int(size * self.tw.coord_scale) * Pango.SCALE) except TypeError, ValueError: debug_output("bad value sent to %s" % (__name__), self.tw.running_sugar) @@ -578,7 +577,7 @@ class TurtleGraphics: else: pl = self.tw.window.create_pango_layout(str(label)) pl.set_font_description(fd) - pl.set_width(int(w) * pango.SCALE) + pl.set_width(int(w) * Pango.SCALE) self.canvas.images[0].draw_layout(self.gc, int(x), int(y), pl) w, h = pl.get_pixel_size() self.invalt(x, y, w, h) @@ -658,7 +657,7 @@ class TurtleGraphics: """ Mark a region for refresh """ if self.tw.interactive_mode: self.tw.area.invalidate_rect( - gtk.gdk.Rectangle(int(x + self.cx), int(y + self.cy), + Rectangle(int(x + self.cx), int(y + self.cy), int(w), int(h)), False) def get_color_index(self, r, g, b, a=0): diff --git a/TurtleArt/tacollaboration.py b/TurtleArt/tacollaboration.py index 8316c7a..5fac55d 100644 --- a/TurtleArt/tacollaboration.py +++ b/TurtleArt/tacollaboration.py @@ -23,7 +23,7 @@ from dbus.service import signal from dbus.gobject_service import ExportedGObject import telepathy -import gtk +from util.gtkcompat import GdkPixbuf import base64 from TurtleArt.tautils import data_to_string, data_from_string, get_path, \ @@ -290,7 +290,7 @@ class Collaboration(): else: tmp_path = '/tmp' file_name = base64_to_image(data, tmp_path) - pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(file_name, + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(file_name, width, height) x, y = self._tw.canvas.turtle_to_screen_coordinates(x, y) self._tw.canvas.draw_pixbuf(pixbuf, a, b, x, y, w, h, diff --git a/TurtleArt/taexporthtml.py b/TurtleArt/taexporthtml.py index 843b8b0..8ed2b1f 100644 --- a/TurtleArt/taexporthtml.py +++ b/TurtleArt/taexporthtml.py @@ -18,9 +18,7 @@ #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN #THE SOFTWARE. -import pygtk -pygtk.require('2.0') -import gtk +from util.gtkcompat import GdkPixbuf import os.path from cgi import escape from gettext import gettext as _ @@ -90,7 +88,7 @@ def save_html(self, tw, embed_flag=True): if p.endswith(('.svg')): tmp = imgdata else: - pixbuf = gtk.gdk.pixbuf_new_from_file(p) + pixbuf = GdkPixbuf.Pixbuf.new_from_file(p) imgdata = image_to_base64(pixbuf, get_path(tw.activity, 'instance')) tmp = HTML_GLUE['img2'][0] diff --git a/TurtleArt/tagplay.py b/TurtleArt/tagplay.py index dbce7ed..e264fc9 100644 --- a/TurtleArt/tagplay.py +++ b/TurtleArt/tagplay.py @@ -26,16 +26,12 @@ import logging import os -import pygtk -pygtk.require('2.0') - -import gobject -gobject.threads_init() +from util.gtkcompat import GObject, Gtk +GObject.threads_init() import pygst import gst import gst.interfaces -import gtk import urllib @@ -97,11 +93,11 @@ class Gplay(): self.got_stream_info = False self.currentplaying = 0 - self.bin = gtk.Window() + self.bin = Gtk.Window() self.videowidget = VideoWidget() self.bin.add(self.videowidget) - self.bin.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_NORMAL) + self.bin.set_type_hint(Gdk.WindowTypeHint.NORMAL) self.bin.set_decorated(False) if lc.tw.running_sugar: self.bin.set_transient_for(lc.tw.activity) @@ -170,14 +166,14 @@ class Gplay(): self.player.play() -class GstPlayer(gobject.GObject): +class GstPlayer(GObject.GObject): __gsignals__ = { - 'error': (gobject.SIGNAL_RUN_FIRST, None, [str, str]), - 'eos': (gobject.SIGNAL_RUN_FIRST, None, []), - 'stream-info': (gobject.SIGNAL_RUN_FIRST, None, [object])} + 'error': (GObject.SignalFlags.RUN_FIRST, None, [str, str]), + 'eos': (GObject.SignalFlags.RUN_FIRST, None, []), + 'stream-info': (GObject.SignalFlags.RUN_FIRST, None, [object])} def __init__(self, videowidget): - gobject.GObject.__init__(self) + GObject.GObject.__init__(self) self.playing = False self.error = False @@ -277,14 +273,14 @@ class GstPlayer(gobject.GObject): return self.playing -class VideoWidget(gtk.DrawingArea): +class VideoWidget(Gtk.DrawingArea): def __init__(self): - gtk.DrawingArea.__init__(self) - self.set_events(gtk.gdk.EXPOSURE_MASK) + GObject.GObject.__init__(self) + self.set_events(Gdk.EventMask.EXPOSURE_MASK) self.imagesink = None - self.unset_flags(gtk.DOUBLE_BUFFERED) - self.set_flags(gtk.APP_PAINTABLE) + self.unset_flags(Gtk.DOUBLE_BUFFERED) + self.set_flags(Gtk.APP_PAINTABLE) def do_expose_event(self, event): if self.imagesink: diff --git a/TurtleArt/talogo.py b/TurtleArt/talogo.py index 12be92f..c5a2253 100644 --- a/TurtleArt/talogo.py +++ b/TurtleArt/talogo.py @@ -21,7 +21,7 @@ #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN #THE SOFTWARE. -import gtk +from util.gtkcompat import GdkPixbuf from time import time from operator import isNumberType @@ -578,7 +578,7 @@ class LogoCode: self.filepath is not None and \ self.filepath != '': try: - pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(self.filepath, + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(self.filepath, w, h) except: self.tw.showlabel('nojournal', self.filepath) diff --git a/TurtleArt/tasprite_factory.py b/TurtleArt/tasprite_factory.py index d05902d..19e38ad 100755 --- a/TurtleArt/tasprite_factory.py +++ b/TurtleArt/tasprite_factory.py @@ -20,9 +20,7 @@ #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN #THE SOFTWARE. -import pygtk -pygtk.require('2.0') -import gtk +from util.gtkcompat import GdkPixbuf import os from taconstants import HIT_RED, HIT_GREEN, HIDE_WHITE, SHOW_WHITE @@ -1137,7 +1135,7 @@ if __name__ == "__main__": def svg_str_to_pixbuf(svg_string): """ Load pixbuf from SVG string """ - pl = gtk.gdk.PixbufLoader('svg') + pl = GdkPixbuf.PixbufLoader('svg') pl.write(svg_string) pl.close() pixbuf = pl.get_pixbuf() diff --git a/TurtleArt/tautils.py b/TurtleArt/tautils.py index a47c063..cea1dac 100644 --- a/TurtleArt/tautils.py +++ b/TurtleArt/tautils.py @@ -19,7 +19,7 @@ #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN #THE SOFTWARE. -import gtk +from util.gtkcompat import Gtk import pickle import subprocess import os.path @@ -169,19 +169,19 @@ def json_dump(data): def get_load_name(suffix, load_save_folder): """ Open a load file dialog. """ - _dialog = gtk.FileChooserDialog(_('Load...'), None, - gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_OPEN, gtk.RESPONSE_OK)) - _dialog.set_default_response(gtk.RESPONSE_OK) + _dialog = Gtk.FileChooserDialog(_('Load...'), None, + Gtk.FileChooserAction.OPEN, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN, Gtk.ResponseType.OK)) + _dialog.set_default_response(Gtk.ResponseType.OK) return do_dialog(_dialog, suffix, load_save_folder) def get_save_name(suffix, load_save_folder, save_file_name): """ Open a save file dialog. """ - _dialog = gtk.FileChooserDialog(_('Save...'), None, - gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_SAVE, gtk.RESPONSE_OK)) - _dialog.set_default_response(gtk.RESPONSE_OK) + _dialog = Gtk.FileChooserDialog(_('Save...'), None, + Gtk.FileChooserAction.SAVE, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_SAVE, Gtk.ResponseType.OK)) + _dialog.set_default_response(Gtk.ResponseType.OK) if save_file_name is not None: _dialog.set_current_name(save_file_name + suffix) return do_dialog(_dialog, suffix, load_save_folder) @@ -196,11 +196,11 @@ def chooser(parent_window, filter, action): _chooser = ObjectChooser(parent=parent_window, what_filter=filter) except TypeError: _chooser = ObjectChooser(None, parent_window, - gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT) + Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT) if _chooser is not None: try: result = _chooser.run() - if result == gtk.RESPONSE_ACCEPT: + if result == Gtk.ResponseType.ACCEPT: dsobject = _chooser.get_selected_object() action(dsobject) dsobject.destroy() @@ -247,13 +247,13 @@ def data_to_string(data): def do_dialog(dialog, suffix, load_save_folder): """ Open a file dialog. """ _result = None - file_filter = gtk.FileFilter() + file_filter = Gtk.FileFilter() file_filter.add_pattern('*' + suffix) file_filter.set_name("Turtle Art") dialog.add_filter(file_filter) dialog.set_current_folder(load_save_folder) _response = dialog.run() - if _response == gtk.RESPONSE_OK: + if _response == Gtk.ResponseType.OK: _result = dialog.get_filename() load_save_folder = dialog.get_current_folder() dialog.destroy() @@ -262,7 +262,7 @@ def do_dialog(dialog, suffix, load_save_folder): def save_picture(canvas, file_name=''): """ Save the canvas to a file. """ - _pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, canvas.width, + _pixbuf = GdkPixbuf.Pixbuf(GdkPixbuf.Colorspace.RGB, False, 8, canvas.width, canvas.height) _pixbuf.get_from_drawable(canvas.canvas.images[0], canvas.canvas.images[0].get_colormap(), @@ -282,12 +282,12 @@ def save_svg(string, file_name): def get_pixbuf_from_journal(dsobject, w, h): """ Load a pixbuf from a Journal object. """ try: - _pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(dsobject.file_path, + _pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(dsobject.file_path, int(w), int(h)) except: try: _pixbufloader = \ - gtk.gdk.pixbuf_loader_new_with_mime_type('image/png') + GdkPixbuf.Pixbuf.loader_new_with_mime_type('image/png') _pixbufloader.set_size(min(300, int(w)), min(225, int(h))) _pixbufloader.write(dsobject.metadata['preview']) _pixbufloader.close() diff --git a/TurtleArt/tawindow.py b/TurtleArt/tawindow.py index f1917e8..1a48200 100644 --- a/TurtleArt/tawindow.py +++ b/TurtleArt/tawindow.py @@ -22,10 +22,7 @@ #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN #THE SOFTWARE. -import pygtk -pygtk.require('2.0') -import gtk -import gobject +from util.gtkcompat import Gtk, Gdk, GObject, Rectangle from gettext import gettext as _ try: @@ -86,10 +83,10 @@ class TurtleArtWindow(): self.parent = parent self.send_event = None # method to send events over the network self.gst_available = GST_AVAILABLE - if type(canvas_window) == gtk.DrawingArea: + if type(canvas_window) == Gtk.DrawingArea: self.interactive_mode = True self.window = canvas_window - self.window.set_flags(gtk.CAN_FOCUS) + self.window.set_flags(Gtk.CAN_FOCUS) self.window.show_all() if self.parent is not None: self.parent.show_all() @@ -105,7 +102,7 @@ class TurtleArtWindow(): self.running_sugar) exit() self._setup_events() - elif type(canvas_window) == gtk.gdk.Pixmap: + elif type(canvas_window) == Gdk.Pixmap: self.interactive_mode = False self.window = canvas_window self.running_sugar = False @@ -129,9 +126,9 @@ class TurtleArtWindow(): self.used_block_list = [] # Which blocks has the user used? self.save_folder = None self.save_file_name = None - self.width = gtk.gdk.screen_width() - self.height = gtk.gdk.screen_height() - self.rect = gtk.gdk.Rectangle(0, 0, 0, 0) + self.width = Gdk.Screen.width() + self.height = Gdk.Screen.height() + self.rect = Rectangle(0, 0, 0, 0) self.keypress = '' self.keyvalue = 0 @@ -314,7 +311,7 @@ class TurtleArtWindow(): def _add_plugin_icon_dir(self, dirname): ''' If there is an icon subdir, add it to the search path. ''' - icon_theme = gtk.icon_theme_get_default() + icon_theme = Gtk.IconTheme.get_default() icon_path = os.path.join(dirname, 'icons') if os.path.exists(icon_path): icon_theme.append_search_path(icon_path) @@ -352,10 +349,10 @@ class TurtleArtWindow(): def _setup_events(self): """ Register the events we listen to. """ - self.window.add_events(gtk.gdk.BUTTON_PRESS_MASK) - self.window.add_events(gtk.gdk.BUTTON_RELEASE_MASK) - self.window.add_events(gtk.gdk.POINTER_MOTION_MASK) - self.window.add_events(gtk.gdk.KEY_PRESS_MASK) + self.window.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) + self.window.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK) + self.window.add_events(Gdk.EventMask.POINTER_MOTION_MASK) + self.window.add_events(Gdk.EventMask.KEY_PRESS_MASK) self.window.connect("expose-event", self._expose_cb) self.window.connect("button-press-event", self._buttonpress_cb) self.window.connect("button-release-event", self._buttonrelease_cb) @@ -958,7 +955,7 @@ class TurtleArtWindow(): self.mouse_flag = 1 self.mouse_x = x self.mouse_y = y - self.button_press(event.get_state() & gtk.gdk.CONTROL_MASK, x, y) + self.button_press(event.get_state() & Gdk.EventMask.CONTROL_MASK, x, y) return True def button_press(self, mask, x, y): @@ -1579,7 +1576,7 @@ class TurtleArtWindow(): else: if self.timeout_tag[0] > 0: try: - gobject.source_remove(self.timeout_tag[0]) + GObject.source_remove(self.timeout_tag[0]) self.timeout_tag[0] = 0 except: self.timeout_tag[0] = 0 @@ -1592,14 +1589,14 @@ class TurtleArtWindow(): else: if self.timeout_tag[0] > 0: try: - gobject.source_remove(self.timeout_tag[0]) + GObject.source_remove(self.timeout_tag[0]) self.timeout_tag[0] = 0 except: self.timeout_tag[0] = 0 else: if self.timeout_tag[0] > 0: try: - gobject.source_remove(self.timeout_tag[0]) + GObject.source_remove(self.timeout_tag[0]) self.timeout_tag[0] = 0 except: self.timeout_tag[0] = 0 @@ -1974,7 +1971,7 @@ class TurtleArtWindow(): top = find_top_block(blk) self.lc.run_blocks(top, self.just_blocks(), True) if self.interactive_mode: - gobject.idle_add(self.lc.doevalstep) + GObject.idle_add(self.lc.doevalstep) else: while self.lc.doevalstep(): pass @@ -2147,7 +2144,7 @@ class TurtleArtWindow(): blk.name = 'audio' elif image_media_type(picture): w, h = calc_image_size(blk.spr) - pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(picture, w, h) + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(picture, w, h) else: blk.name = 'description' if pixbuf is not None: @@ -2157,9 +2154,9 @@ class TurtleArtWindow(): def _keypress_cb(self, area, event): """ Keyboard """ - keyname = gtk.gdk.keyval_name(event.keyval) - keyunicode = gtk.gdk.keyval_to_unicode(event.keyval) - if event.get_state() & gtk.gdk.MOD1_MASK: + keyname = Gdk.keyval_name(event.keyval) + keyunicode = Gdk.keyval_to_unicode(event.keyval) + if event.get_state() & Gdk.ModifierType.MOD1_MASK: alt_mask = True alt_flag = 'T' else: @@ -2736,7 +2733,7 @@ class TurtleArtWindow(): except: try: w, h, = calc_image_size(blk.spr) - pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( blk.values[0], w, h) x, y = self._calc_image_offset('', blk.spr) blk.set_image(pixbuf, x, y) @@ -2748,7 +2745,7 @@ class TurtleArtWindow(): if not movie_media_type(blk.values[0][-4:]): try: w, h, = calc_image_size(blk.spr) - pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( blk.values[0], w, h) x, y = self._calc_image_offset('', blk.spr) blk.set_image(pixbuf, x, y) diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py index f5bdd69..92efed4 100644 --- a/TurtleArtActivity.py +++ b/TurtleArtActivity.py @@ -20,10 +20,7 @@ #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN #THE SOFTWARE. -import pygtk -pygtk.require('2.0') -import gtk -import gobject +from util.gtkcompat import Gtk, GObject import dbus import logging @@ -151,7 +148,7 @@ class TurtleArtActivity(activity.Activity): datastore.write(dsobject) dsobject.destroy() - gobject.timeout_add(250, self.save_as_html.set_icon, 'htmloff') + GObject.timeout_add(250, self.save_as_html.set_icon, 'htmloff') self.tw.saved_pictures = [] # Clear queue of pictures we have viewed. return @@ -171,7 +168,7 @@ class TurtleArtActivity(activity.Activity): datastore.write(dsobject) dsobject.destroy() - gobject.timeout_add(250, self.save_as_logo.set_icon, 'logo-saveoff') + GObject.timeout_add(250, self.save_as_logo.set_icon, 'logo-saveoff') return def do_load_ta_project_cb(self, button): @@ -190,7 +187,7 @@ class TurtleArtActivity(activity.Activity): ''' Load Python code from the Journal. ''' self.load_python.set_icon('pippy-openon') self.tw.load_python_code_from_file(fname=None, add_new_block=True) - gobject.timeout_add(250, self.load_python.set_icon, 'pippy-openoff') + GObject.timeout_add(250, self.load_python.set_icon, 'pippy-openoff') def do_save_as_image_cb(self, button): ''' Save the canvas to the Journal. ''' @@ -198,7 +195,7 @@ class TurtleArtActivity(activity.Activity): _logger.debug('saving image to journal') self.tw.save_as_image() - gobject.timeout_add(250, self.save_as_image.set_icon, 'image-saveoff') + GObject.timeout_add(250, self.save_as_image.set_icon, 'image-saveoff') return def do_keep_cb(self, button): @@ -297,28 +294,28 @@ class TurtleArtActivity(activity.Activity): self.eraser_button.set_icon('eraseroff') self.recenter() self.tw.eraser_button() - gobject.timeout_add(250, self.eraser_button.set_icon, 'eraseron') + GObject.timeout_add(250, self.eraser_button.set_icon, 'eraseron') def do_run_cb(self, button): ''' Callback for run button (rabbit) ''' self.run_button.set_icon('run-faston') self.tw.lc.trace = 0 self.tw.run_button(0) - gobject.timeout_add(1000, self.run_button.set_icon, 'run-fastoff') + GObject.timeout_add(1000, self.run_button.set_icon, 'run-fastoff') def do_step_cb(self, button): ''' Callback for step button (turtle) ''' self.step_button.set_icon('run-slowon') self.tw.lc.trace = 1 self.tw.run_button(3) - gobject.timeout_add(1000, self.step_button.set_icon, 'run-slowoff') + GObject.timeout_add(1000, self.step_button.set_icon, 'run-slowoff') def do_debug_cb(self, button): ''' Callback for debug button (bug) ''' self.debug_button.set_icon('debugon') self.tw.lc.trace = 1 self.tw.run_button(9) - gobject.timeout_add(1000, self.debug_button.set_icon, 'debugoff') + GObject.timeout_add(1000, self.debug_button.set_icon, 'debugoff') def do_stop_cb(self, button): ''' Callback for stop button. ''' @@ -462,10 +459,10 @@ class TurtleArtActivity(activity.Activity): def __visibility_notify_cb(self, window, event): ''' Callback method for when the activity's visibility changes. ''' - if event.state == gtk.gdk.VISIBILITY_FULLY_OBSCURED: + if event.get_state() == Gdk.VisibilityState.FULLY_OBSCURED: self.tw.background_plugins() - elif event.state in \ - [gtk.gdk.VISIBILITY_UNOBSCURED, gtk.gdk.VISIBILITY_PARTIAL]: + elif event.get_state() in \ + [Gdk.VISIBILITY_UNOBSCURED, Gdk.VISIBILITY_PARTIAL]: self.tw.foreground_plugins() def _keep_clicked_cb(self, button): @@ -479,18 +476,18 @@ class TurtleArtActivity(activity.Activity): activity_toolbar_button = ActivityToolbarButton(self) - edit_toolbar = gtk.Toolbar() + edit_toolbar = Gtk.Toolbar() edit_toolbar_button = ToolbarButton(label=_('Edit'), page=edit_toolbar, icon_name='toolbar-edit') - view_toolbar = gtk.Toolbar() + view_toolbar = Gtk.Toolbar() view_toolbar_button = ToolbarButton(label=_('View'), page=view_toolbar, icon_name='toolbar-view') - self._palette_toolbar = gtk.Toolbar() + self._palette_toolbar = Gtk.Toolbar() self._palette_toolbar_button = ToolbarButton( page=self._palette_toolbar, icon_name='palette') - self._help_toolbar = gtk.Toolbar() + self._help_toolbar = Gtk.Toolbar() help_toolbar_button = ToolbarButton(label=_('Help'), page=self._help_toolbar, icon_name='help-toolbar') @@ -530,15 +527,15 @@ class TurtleArtActivity(activity.Activity): self._toolbox = activity.ActivityToolbox(self) self.set_toolbox(self._toolbox) - project_toolbar = gtk.Toolbar() + project_toolbar = Gtk.Toolbar() self._toolbox.add_toolbar(_('Project'), project_toolbar) - view_toolbar = gtk.Toolbar() + view_toolbar = Gtk.Toolbar() self._toolbox.add_toolbar(_('View'), view_toolbar) - edit_toolbar = gtk.Toolbar() + edit_toolbar = Gtk.Toolbar() self._toolbox.add_toolbar(_('Edit'), edit_toolbar) - journal_toolbar = gtk.Toolbar() + journal_toolbar = Gtk.Toolbar() self._toolbox.add_toolbar(_('Import/Export'), journal_toolbar) - self._help_toolbar = gtk.Toolbar() + self._help_toolbar = Gtk.Toolbar() self._toolbox.add_toolbar(_('Help'), self._help_toolbar) self._make_palette_buttons(project_toolbar, palette_button=True) @@ -587,10 +584,10 @@ class TurtleArtActivity(activity.Activity): is in use. ''' # FIXME: Temporary work-around gtk problem with XO175 if get_hardware() not in [XO175] and \ - (gtk.gtk_version[0] > 2 or gtk.gtk_version[1] > 16): + (Gtk.gtk_version[0] > 2 or Gtk.gtk_version[1] > 16): self.hover_help_label = self._add_label( _('Move the cursor over the orange palette for help.'), - self._help_toolbar, gtk.gdk.screen_width() - 2 * ICON_SIZE) + self._help_toolbar, Gdk.Screen.width() - 2 * ICON_SIZE) else: self.hover_help_label = self._add_label( _('Move the cursor over the orange palette for help.'), @@ -695,14 +692,14 @@ class TurtleArtActivity(activity.Activity): def _setup_scrolled_window(self): ''' Create a scrolled window to contain the turtle canvas. ''' - self.sw = gtk.ScrolledWindow() + self.sw = Gtk.ScrolledWindow() self.set_canvas(self.sw) - self.sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + self.sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) self.sw.show() - canvas = gtk.DrawingArea() - canvas.set_size_request(gtk.gdk.screen_width() * 2, - gtk.gdk.screen_height() * 2) + canvas = Gtk.DrawingArea() + canvas.set_size_request(Gdk.Screen.width() * 2, + Gdk.Screen.height() * 2) self.sw.add_with_viewport(canvas) hadj = self.sw.get_hadjustment() hadj.connect('value-changed', self._scroll_cb) @@ -723,7 +720,7 @@ class TurtleArtActivity(activity.Activity): vadj = self.sw.get_vadjustment() self.vadj_value = vadj.get_value() if not self.tw.hw in [XO1]: - gobject.idle_add(self.tw.move_palettes, self.hadj_value, + GObject.idle_add(self.tw.move_palettes, self.hadj_value, self.vadj_value) def _setup_canvas(self, canvas_window): @@ -753,7 +750,7 @@ class TurtleArtActivity(activity.Activity): def _setup_visibility_handler(self): ''' Notify me when the visibility state changes. ''' - self.add_events(gtk.gdk.VISIBILITY_NOTIFY_MASK) + self.add_events(Gdk.EventMask.VISIBILITY_NOTIFY_MASK) self.connect('visibility-notify-event', self.__visibility_notify_cb) def write_file(self, file_path): @@ -816,7 +813,7 @@ class TurtleArtActivity(activity.Activity): def _copy_cb(self, button): ''' Copy to the clipboard. ''' - clipboard = gtk.Clipboard() + clipboard = Gtk.Clipboard() _logger.debug('Serialize the project and copy to clipboard.') data = self.tw.assemble_data_to_save(False, False) if data is not []: @@ -826,7 +823,7 @@ class TurtleArtActivity(activity.Activity): def _paste_cb(self, button): ''' Paste from the clipboard. ''' - clipboard = gtk.Clipboard() + clipboard = Gtk.Clipboard() _logger.debug('Paste to the project.') text = clipboard.wait_for_text() if text is not None: @@ -842,12 +839,12 @@ class TurtleArtActivity(activity.Activity): def _add_label(self, string, toolbar, width=None): ''' Add a label to a toolbar. ''' - label = gtk.Label(string) + label = Gtk.Label(label=string) label.set_line_wrap(True) if width is not None: label.set_size_request(width, -1) label.show() - toolitem = gtk.ToolItem() + toolitem = Gtk.ToolItem() toolitem.add(label) toolbar.insert(toolitem, -1) toolitem.show() @@ -855,7 +852,7 @@ class TurtleArtActivity(activity.Activity): def _add_separator(self, toolbar, expand=False, visible=True): ''' Add a separator to a toolbar. ''' - separator = gtk.SeparatorToolItem() + separator = Gtk.SeparatorToolItem() separator.props.draw = visible separator.set_expand(expand) if hasattr(toolbar, 'insert'): diff --git a/collaboration/activity.py b/collaboration/activity.py index bd58e92..b84104a 100644 --- a/collaboration/activity.py +++ b/collaboration/activity.py @@ -26,7 +26,7 @@ from functools import partial import dbus from dbus import PROPERTIES_IFACE -import gobject +from util.gtkcompat import GObject from telepathy.client import Channel from telepathy.interfaces import CHANNEL, \ CHANNEL_INTERFACE_GROUP, \ @@ -46,7 +46,7 @@ CONN_INTERFACE_BUDDY_INFO = 'org.laptop.Telepathy.BuddyInfo' _logger = logging.getLogger('sugar.presence.activity') -class Activity(gobject.GObject): +class Activity(GObject.GObject): """UI interface for an Activity in the presence service Activities in the presence service represent your and other user's @@ -60,24 +60,24 @@ class Activity(gobject.GObject): joined """ __gsignals__ = { - 'buddy-joined': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - ([gobject.TYPE_PYOBJECT])), - 'buddy-left': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - ([gobject.TYPE_PYOBJECT])), - 'new-channel': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - ([gobject.TYPE_PYOBJECT])), - 'joined': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - ([gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT])), + 'buddy-joined': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, + ([GObject.TYPE_PYOBJECT])), + 'buddy-left': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, + ([GObject.TYPE_PYOBJECT])), + 'new-channel': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, + ([GObject.TYPE_PYOBJECT])), + 'joined': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, + ([GObject.TYPE_PYOBJECT, GObject.TYPE_PYOBJECT])), } __gproperties__ = { - 'id': (str, None, None, None, gobject.PARAM_READABLE), - 'name': (str, None, None, None, gobject.PARAM_READWRITE), - 'tags': (str, None, None, None, gobject.PARAM_READWRITE), - 'color': (str, None, None, None, gobject.PARAM_READWRITE), - 'type': (str, None, None, None, gobject.PARAM_READABLE), - 'private': (bool, None, None, True, gobject.PARAM_READWRITE), - 'joined': (bool, None, None, False, gobject.PARAM_READABLE), + 'id': (str, None, None, None, GObject.PARAM_READABLE), + 'name': (str, None, None, None, GObject.PARAM_READWRITE), + 'tags': (str, None, None, None, GObject.PARAM_READWRITE), + 'color': (str, None, None, None, GObject.PARAM_READWRITE), + 'type': (str, None, None, None, GObject.PARAM_READABLE), + 'private': (bool, None, None, True, GObject.PARAM_READWRITE), + 'joined': (bool, None, None, False, GObject.PARAM_READABLE), } def __init__(self, account_path, connection, room_handle=None, @@ -88,7 +88,7 @@ class Activity(gobject.GObject): if properties is None: properties = {} - gobject.GObject.__init__(self) + GObject.GObject.__init__(self) self._account_path = account_path self.telepathy_conn = connection @@ -467,14 +467,14 @@ class Activity(gobject.GObject): self.telepathy_text_chan.Close() -class _BaseCommand(gobject.GObject): +class _BaseCommand(GObject.GObject): __gsignals__ = { - 'finished': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'finished': (GObject.SignalFlags.RUN_FIRST, None, ([object])), } def __init__(self): - gobject.GObject.__init__(self) + GObject.GObject.__init__(self) self.text_channel = None self.text_channel_group_flags = None diff --git a/collaboration/buddy.py b/collaboration/buddy.py index b117940..eedf615 100644 --- a/collaboration/buddy.py +++ b/collaboration/buddy.py @@ -17,8 +17,8 @@ import logging -import gobject -import gconf +from util.gtkcompat import GObject +#from util.gtkcompat import GConf import dbus from telepathy.client import Connection from telepathy.interfaces import CONNECTION @@ -32,7 +32,7 @@ CONNECTION_INTERFACE_BUDDY_INFO = 'org.laptop.Telepathy.BuddyInfo' _owner_instance = None -class BaseBuddyModel(gobject.GObject): +class BaseBuddyModel(GObject.GObject): __gtype_name__ = 'SugarBaseBuddyModel' def __init__(self, **kwargs): @@ -42,7 +42,7 @@ class BaseBuddyModel(gobject.GObject): self._tags = None self._current_activity = None - gobject.GObject.__init__(self, **kwargs) + GObject.GObject.__init__(self, **kwargs) def get_nick(self): return self._nick @@ -50,7 +50,7 @@ class BaseBuddyModel(gobject.GObject): def set_nick(self, nick): self._nick = nick - nick = gobject.property(type=object, getter=get_nick, setter=set_nick) + nick = GObject.property(type=object, getter=get_nick, setter=set_nick) def get_key(self): return self._key @@ -58,7 +58,7 @@ class BaseBuddyModel(gobject.GObject): def set_key(self, key): self._key = key - key = gobject.property(type=object, getter=get_key, setter=set_key) + key = GObject.property(type=object, getter=get_key, setter=set_key) def get_color(self): return self._color @@ -66,12 +66,12 @@ class BaseBuddyModel(gobject.GObject): def set_color(self, color): self._color = color - color = gobject.property(type=object, getter=get_color, setter=set_color) + color = GObject.property(type=object, getter=get_color, setter=set_color) def get_tags(self): return self._tags - tags = gobject.property(type=object, getter=get_tags) + tags = GObject.property(type=object, getter=get_tags) def get_current_activity(self): return self._current_activity @@ -81,7 +81,7 @@ class BaseBuddyModel(gobject.GObject): self._current_activity = current_activity self.notify('current-activity') - current_activity = gobject.property(type=object, + current_activity = GObject.property(type=object, getter=get_current_activity, setter=set_current_activity) @@ -95,7 +95,7 @@ class OwnerBuddyModel(BaseBuddyModel): def __init__(self): BaseBuddyModel.__init__(self) - #client = gconf.client_get_default() + #client = GConf.Client.get_default() #self.props.nick = client.get_string('/desktop/sugar/user/nick') self.props.nick = "rgs" #color = client.get_string('/desktop/sugar/user/color') @@ -212,7 +212,7 @@ class BuddyModel(BaseBuddyModel): def set_account(self, account): self._account = account - account = gobject.property(type=object, getter=get_account, + account = GObject.property(type=object, getter=get_account, setter=set_account) def get_contact_id(self): @@ -221,7 +221,7 @@ class BuddyModel(BaseBuddyModel): def set_contact_id(self, contact_id): self._contact_id = contact_id - contact_id = gobject.property(type=object, getter=get_contact_id, + contact_id = GObject.property(type=object, getter=get_contact_id, setter=set_contact_id) def get_handle(self): @@ -230,5 +230,5 @@ class BuddyModel(BaseBuddyModel): def set_handle(self, handle): self._handle = handle - handle = gobject.property(type=object, getter=get_handle, + handle = GObject.property(type=object, getter=get_handle, setter=set_handle) diff --git a/collaboration/connection_watcher.py b/collaboration/connection_watcher.py index 96af1cf..36fd6b2 100644 --- a/collaboration/connection_watcher.py +++ b/collaboration/connection_watcher.py @@ -21,7 +21,7 @@ import logging import dbus import dbus.mainloop.glib -import gobject +from util.gtkcompat import GObject from telepathy.client import Connection from telepathy.interfaces import CONN_INTERFACE @@ -32,16 +32,16 @@ from telepathy.constants import CONNECTION_STATUS_CONNECTED, \ _instance = None -class ConnectionWatcher(gobject.GObject): +class ConnectionWatcher(GObject.GObject): __gsignals__ = { - 'connection-added': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - ([gobject.TYPE_PYOBJECT])), - 'connection-removed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - ([gobject.TYPE_PYOBJECT])), + 'connection-added': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, + ([GObject.TYPE_PYOBJECT])), + 'connection-removed': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, + ([GObject.TYPE_PYOBJECT])), } def __init__(self, bus=None): - gobject.GObject.__init__(self) + GObject.GObject.__init__(self) if bus is None: self.bus = dbus.Bus() @@ -118,5 +118,5 @@ if __name__ == '__main__': watcher.connect('connection-added', connection_added_cb) watcher.connect('connection-removed', connection_removed_cb) - loop = gobject.MainLoop() + loop = GObject.MainLoop() loop.run() diff --git a/collaboration/neighborhood.py b/collaboration/neighborhood.py index 192b66f..5287b42 100755 --- a/collaboration/neighborhood.py +++ b/collaboration/neighborhood.py @@ -21,8 +21,7 @@ from functools import partial from hashlib import sha1 import traceback -import gobject -import gconf +from util.gtkcompat import GObject, GConf import dbus from dbus import PROPERTIES_IFACE from telepathy.interfaces import ACCOUNT, \ @@ -75,20 +74,20 @@ will be very slow in returning these queries, so just be patient. """ -class ActivityModel(gobject.GObject): +class ActivityModel(GObject.GObject): __gsignals__ = { - 'current-buddy-added': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'current-buddy-added': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([object])), - 'current-buddy-removed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'current-buddy-removed': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([object])), - 'buddy-added': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'buddy-added': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([object])), - 'buddy-removed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'buddy-removed': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([object])), } def __init__(self, activity_id, room_handle): - gobject.GObject.__init__(self) + GObject.GObject.__init__(self) self.activity_id = activity_id self.room_handle = room_handle @@ -105,7 +104,7 @@ class ActivityModel(gobject.GObject): def set_color(self, color): self._color = color - color = gobject.property(type=object, getter=get_color, setter=set_color) + color = GObject.property(type=object, getter=get_color, setter=set_color) def get_bundle(self): return self._bundle @@ -113,7 +112,7 @@ class ActivityModel(gobject.GObject): def set_bundle(self, bundle): self._bundle = bundle - bundle = gobject.property(type=object, getter=get_bundle, + bundle = GObject.property(type=object, getter=get_bundle, setter=set_bundle) def get_name(self): @@ -122,7 +121,7 @@ class ActivityModel(gobject.GObject): def set_name(self, name): self._name = name - name = gobject.property(type=object, getter=get_name, setter=set_name) + name = GObject.property(type=object, getter=get_name, setter=set_name) def is_private(self): return self._private @@ -130,7 +129,7 @@ class ActivityModel(gobject.GObject): def set_private(self, private): self._private = private - private = gobject.property(type=object, getter=is_private, + private = GObject.property(type=object, getter=is_private, setter=set_private) def get_buddies(self): @@ -146,7 +145,7 @@ class ActivityModel(gobject.GObject): self.notify('buddies') self.emit('buddy-removed', buddy) - buddies = gobject.property(type=object, getter=get_buddies) + buddies = GObject.property(type=object, getter=get_buddies) def get_current_buddies(self): return self._current_buddies @@ -161,35 +160,35 @@ class ActivityModel(gobject.GObject): self.notify('current-buddies') self.emit('current-buddy-removed', buddy) - current_buddies = gobject.property(type=object, getter=get_current_buddies) + current_buddies = GObject.property(type=object, getter=get_current_buddies) -class _Account(gobject.GObject): +class _Account(GObject.GObject): __gsignals__ = { - 'activity-added': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'activity-added': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([object, object])), - 'activity-updated': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'activity-updated': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([object, object])), - 'activity-removed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'activity-removed': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([object])), - 'buddy-added': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'buddy-added': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([object, object, object])), - 'buddy-updated': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'buddy-updated': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([object, object])), - 'buddy-removed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'buddy-removed': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([object])), - 'buddy-joined-activity': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'buddy-joined-activity': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([object, object])), - 'buddy-left-activity': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'buddy-left-activity': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([object, object])), - 'current-activity-updated': (gobject.SIGNAL_RUN_FIRST, - gobject.TYPE_NONE, ([object, object])), - 'connected': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])), - 'disconnected': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])), + 'current-activity-updated': (GObject.SignalFlags.RUN_FIRST, + GObject.TYPE_NONE, ([object, object])), + 'connected': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([])), + 'disconnected': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([])), } def __init__(self, account_path): - gobject.GObject.__init__(self) + GObject.GObject.__init__(self) self.object_path = account_path @@ -632,20 +631,20 @@ class _Account(gobject.GObject): -class Neighborhood(gobject.GObject): +class Neighborhood(GObject.GObject): __gsignals__ = { - 'activity-added': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'activity-added': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([object])), - 'activity-removed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'activity-removed': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([object])), - 'buddy-added': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'buddy-added': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([object])), - 'buddy-removed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'buddy-removed': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ([object])), } def __init__(self, params = {}): - gobject.GObject.__init__(self) + GObject.GObject.__init__(self) self._buddies = {None: get_owner_instance()} self._activities = {} @@ -729,7 +728,7 @@ class Neighborhood(gobject.GObject): #print('Still dont have a Salut account, creating one') - client = gconf.client_get_default() + client = GConf.Client.get_default() nick = client.get_string('/desktop/sugar/user/nick') params = { @@ -1042,7 +1041,7 @@ if __name__ == "__main__": params["password"] = "test" params["register"] = True - loop = gobject.MainLoop() + loop = GObject.MainLoop() dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) n = get_neighborhood(params) loop.run() diff --git a/collaboration/presenceservice.py b/collaboration/presenceservice.py index 33caadd..5f4da2d 100644 --- a/collaboration/presenceservice.py +++ b/collaboration/presenceservice.py @@ -22,7 +22,7 @@ STABLE. import logging -import gobject +from util.gtkcompat import GObject import dbus import dbus.exceptions import dbus.glib @@ -50,18 +50,18 @@ ACCOUNT_MANAGER_PATH = '/org/freedesktop/Telepathy/AccountManager' CONN_INTERFACE_ACTIVITY_PROPERTIES = 'org.laptop.Telepathy.ActivityProperties' -class PresenceService(gobject.GObject): +class PresenceService(GObject.GObject): """Provides simplified access to the Telepathy framework to activities""" __gsignals__ = { - 'activity-shared': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - ([gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT, - gobject.TYPE_PYOBJECT])), + 'activity-shared': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, + ([GObject.TYPE_PYOBJECT, GObject.TYPE_PYOBJECT, + GObject.TYPE_PYOBJECT])), } def __init__(self): """Initialise the service and attempt to connect to events """ - gobject.GObject.__init__(self) + GObject.GObject.__init__(self) self._activity_cache = None self._buddy_cache = {} diff --git a/collaboration/test.py b/collaboration/test.py index db7be0d..62bc5e5 100755 --- a/collaboration/test.py +++ b/collaboration/test.py @@ -1,6 +1,5 @@ #!/usr/bin/python -import gobject import dbus import dbus.mainloop import dbus.mainloop.glib diff --git a/collaboration/xocolor.py b/collaboration/xocolor.py index 395e345..6252cb6 100644 --- a/collaboration/xocolor.py +++ b/collaboration/xocolor.py @@ -22,7 +22,7 @@ STABLE. import random import logging -import gconf +from util.gtkcompat import GConf colors = [ ['#B20008', '#FF2B34'], \ @@ -237,7 +237,7 @@ class XoColor: elif not is_valid(color_string): logging.debug('Color string is not valid: %s, ' 'fallback to default', color_string) - client = gconf.client_get_default() + client = GConf.Client.get_default() color_string = client.get_string('/desktop/sugar/user/color') randomize = False else: diff --git a/gnome_plugins/collaboration_plugin.py b/gnome_plugins/collaboration_plugin.py index 4ba98a5..b62cf78 100644 --- a/gnome_plugins/collaboration_plugin.py +++ b/gnome_plugins/collaboration_plugin.py @@ -26,8 +26,7 @@ import os.path import dbus from gettext import gettext as _ -import gobject -import gtk +from util.gtkcompat import GObject, Gtk from plugin import Plugin @@ -53,9 +52,9 @@ CONNECTION_INTERFACE_ACTIVITY_PROPERTIES = \ class Collaboration_plugin(Plugin): __gsignals__ = { - 'joined': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'joined': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ()), - 'shared': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'shared': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ()), } @@ -110,17 +109,17 @@ class Collaboration_plugin(Plugin): self._setup_config_file(self._parent.get_config_home()) def get_menu(self): - menu = gtk.Menu() + menu = Gtk.Menu() MenuBuilder.make_menu_item(menu, _('Enable collaboration'), self._connect_cb) - self._activities_submenu = gtk.Menu() + self._activities_submenu = Gtk.Menu() activities_menu = MenuBuilder.make_sub_menu(self._activities_submenu, _('Activities')) menu.append(activities_menu) - self._buddies_submenu = gtk.Menu() + self._buddies_submenu = Gtk.Menu() buddies_menu = MenuBuilder.make_sub_menu(self._buddies_submenu, _('Buddies')) menu.append(buddies_menu) diff --git a/gnome_plugins/plugin.py b/gnome_plugins/plugin.py index 590c9bc..903be9f 100644 --- a/gnome_plugins/plugin.py +++ b/gnome_plugins/plugin.py @@ -20,12 +20,11 @@ #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN #THE SOFTWARE. -import gobject +from util.gtkcompat import GObject - -class Plugin(gobject.GObject): +class Plugin(GObject.GObject): def __init__(self): - gobject.GObject.__init__(self) + GObject.GObject.__init__(self) def get_menu(self): raise RuntimeError("You need to define get__menu for your plugin.") diff --git a/gnome_plugins/uploader_plugin.py b/gnome_plugins/uploader_plugin.py index 06224fa..b156f71 100644 --- a/gnome_plugins/uploader_plugin.py +++ b/gnome_plugins/uploader_plugin.py @@ -32,7 +32,7 @@ except ImportError, e: _UPLOAD_AVAILABLE = False import os -import gtk +from util.gtkcompat import Gtk from plugin import Plugin from util.menubuilder import MenuBuilder @@ -60,7 +60,7 @@ class Uploader_plugin(Plugin): self.tw = turtleart_window def get_menu(self): - menu = gtk.Menu() + menu = Gtk.Menu() MenuBuilder.make_menu_item(menu, _('Upload to Web'), self.do_upload_to_web) upload_menu = MenuBuilder.make_sub_menu(menu, _('Upload')) @@ -74,32 +74,32 @@ class Uploader_plugin(Plugin): return self.uploading = False - self.pop_up = gtk.Window() + self.pop_up = Gtk.Window() self.pop_up.set_default_size(600, 400) self.pop_up.connect('delete_event', self._stop_uploading) - table = gtk.Table(8, 1, False) + table = Gtk.Table(8, 1, False) self.pop_up.add(table) - login_label = gtk.Label(_('You must have an account at \ + login_label = Gtk.Label(label=_('You must have an account at \ http://turtleartsite.sugarlabs.org to upload your project.')) table.attach(login_label, 0, 1, 0, 1) - self.login_message = gtk.Label('') + self.login_message = Gtk.Label(label='') table.attach(self.login_message, 0, 1, 1, 2) - self.Hbox1 = gtk.HBox() + self.Hbox1 = Gtk.HBox() table.attach(self.Hbox1, 0, 1, 2, 3, xpadding=5, ypadding=3) - self.username_entry = gtk.Entry() - username_label = gtk.Label(_('Username:') + ' ') + self.username_entry = Gtk.Entry() + username_label = Gtk.Label(label=_('Username:') + ' ') username_label.set_size_request(150, 25) username_label.set_alignment(1.0, 0.5) self.username_entry.set_size_request(450, 25) self.Hbox1.add(username_label) self.Hbox1.add(self.username_entry) - self.Hbox2 = gtk.HBox() + self.Hbox2 = Gtk.HBox() table.attach(self.Hbox2, 0, 1, 3, 4, xpadding=5, ypadding=3) - self.password_entry = gtk.Entry() - password_label = gtk.Label(_('Password:') + ' ') + self.password_entry = Gtk.Entry() + password_label = Gtk.Label(label=_('Password:') + ' ') self.password_entry.set_visibility(False) password_label.set_size_request(150, 25) password_label.set_alignment(1.0, 0.5) @@ -107,34 +107,34 @@ http://turtleartsite.sugarlabs.org to upload your project.')) self.Hbox2.add(password_label) self.Hbox2.add(self.password_entry) - self.Hbox3 = gtk.HBox() + self.Hbox3 = Gtk.HBox() table.attach(self.Hbox3, 0, 1, 4, 5, xpadding=5, ypadding=3) - self.title_entry = gtk.Entry() - title_label = gtk.Label(_('Title:') + ' ') + self.title_entry = Gtk.Entry() + title_label = Gtk.Label(label=_('Title:') + ' ') title_label.set_size_request(150, 25) title_label.set_alignment(1.0, 0.5) self.title_entry.set_size_request(450, 25) self.Hbox3.add(title_label) self.Hbox3.add(self.title_entry) - self.Hbox4 = gtk.HBox() + self.Hbox4 = Gtk.HBox() table.attach(self.Hbox4, 0, 1, 5, 6, xpadding=5, ypadding=3) - self.description_entry = gtk.TextView() - description_label = gtk.Label(_('Description:') + ' ') + self.description_entry = Gtk.TextView() + description_label = Gtk.Label(label=_('Description:') + ' ') description_label.set_size_request(150, 25) description_label.set_alignment(1.0, 0.5) - self.description_entry.set_wrap_mode(gtk.WRAP_WORD) + self.description_entry.set_wrap_mode(Gtk.WrapMode.WORD) self.description_entry.set_size_request(450, 50) self.Hbox4.add(description_label) self.Hbox4.add(self.description_entry) - self.Hbox5 = gtk.HBox() + self.Hbox5 = Gtk.HBox() table.attach(self.Hbox5, 0, 1, 6, 7, xpadding=5, ypadding=3) - self.submit_button = gtk.Button(_('Submit to Web')) + self.submit_button = Gtk.Button(_('Submit to Web')) self.submit_button.set_size_request(300, 25) self.submit_button.connect('pressed', self._do_remote_logon) self.Hbox5.add(self.submit_button) - self.cancel_button = gtk.Button(_('Cancel')) + self.cancel_button = Gtk.Button(_('Cancel')) self.cancel_button.set_size_request(300, 25) self.cancel_button.connect('pressed', self._stop_uploading) self.Hbox5.add(self.cancel_button) @@ -204,6 +204,6 @@ if __name__ == "__main__": if u.enabled(): print "Uploader is enabled... trying to upload" u.do_upload_to_web() - gtk.main() + Gtk.main() else: print "Uploader is not enabled... exiting" diff --git a/plugins/camera_sensor/camera_sensor.py b/plugins/camera_sensor/camera_sensor.py index 5bd21ee..927f031 100644 --- a/plugins/camera_sensor/camera_sensor.py +++ b/plugins/camera_sensor/camera_sensor.py @@ -16,7 +16,7 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gst -import gtk +from util.gtkcompat import Gtk from fcntl import ioctl import os from gettext import gettext as _ @@ -236,6 +236,6 @@ is pushed to the stack'), self._video_capture_device.close() self._camera.save_camera_input_to_file() self._camera.stop_camera_input() - return gtk.gdk.pixbuf_new_from_file(self._imagepath) + return GdkPixbuf.Pixbuf.new_from_file(self._imagepath) else: return None diff --git a/plugins/plugin.py b/plugins/plugin.py index 3065129..bdba7aa 100644 --- a/plugins/plugin.py +++ b/plugins/plugin.py @@ -16,12 +16,11 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -import gobject +from util.gtkcompat import GObject - -class Plugin(gobject.GObject): +class Plugin(GObject.GObject): def __init__(self): - gobject.GObject.__init__(self) + GObject.GObject.__init__(self) def setup(self): """ Setup is called once, when the Turtle Window is created. """ diff --git a/plugins/rfid/device.py b/plugins/rfid/device.py index 04a82b2..962a20f 100644 --- a/plugins/rfid/device.py +++ b/plugins/rfid/device.py @@ -1,6 +1,6 @@ -import gobject +from util.gtkcompat import GObject -class RFIDDevice(gobject.GObject): +class RFIDDevice(GObject.GObject): """ Ancestor class for every supported device. The main class for the device driver must be called "RFIDReader". @@ -10,10 +10,10 @@ class RFIDDevice(gobject.GObject): # signal "disconnected" has to be emitted when the device is # unplugged or an error has been detected. __gsignals__ = { - 'tag-read': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, - (gobject.TYPE_STRING,)), - 'disconnected': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, - (gobject.TYPE_STRING,)) + 'tag-read': (GObject.SignalFlags.RUN_LAST, GObject.TYPE_NONE, + (GObject.TYPE_STRING,)), + 'disconnected': (GObject.SignalFlags.RUN_LAST, GObject.TYPE_NONE, + (GObject.TYPE_STRING,)) } def __init__(self): """ diff --git a/plugins/rfid/rfidrweusb.py b/plugins/rfid/rfidrweusb.py index bd12631..6855754 100644 --- a/plugins/rfid/rfidrweusb.py +++ b/plugins/rfid/rfidrweusb.py @@ -2,7 +2,7 @@ from device import RFIDDevice from serial import Serial import dbus from dbus.mainloop.glib import DBusGMainLoop -import gobject +from util.gtkcompat import GObject from time import sleep import utils @@ -81,8 +81,8 @@ class RFIDReader(RFIDDevice): self.ser = Serial(self.device, 9600, timeout=0.1) self._connected = True if self._select_animal_tag: - #gobject.idle_add(self._loop) - gobject.timeout_add(1000, self._loop) + #GObject.idle_add(self._loop) + GObject.timeout_add(1000, self._loop) retval = True except: self._connected = False @@ -196,5 +196,5 @@ class RFIDReader(RFIDDevice): # else: # print "Not connected" # -# mloop = gobject.MainLoop() +# mloop = GObject.MainLoop() # mloop.run() diff --git a/plugins/rfid/tis2000.py b/plugins/rfid/tis2000.py index 91d1991..8f6f925 100644 --- a/plugins/rfid/tis2000.py +++ b/plugins/rfid/tis2000.py @@ -2,7 +2,7 @@ from device import RFIDDevice from serial import Serial import dbus from dbus.mainloop.glib import DBusGMainLoop -import gobject +from util.gtkcompat import GObject import re from time import sleep @@ -71,7 +71,7 @@ class RFIDReader(RFIDDevice): self._escape() self._clear() self._format() - gobject.idle_add(self._loop) + GObject.idle_add(self._loop) retval = True except: self._connected = False @@ -248,5 +248,5 @@ class RFIDReader(RFIDDevice): # else: # print "Not connected" # -# mloop = gobject.MainLoop() +# mloop = GObject.MainLoop() # mloop.run() diff --git a/plugins/turtle_blocks_extras/turtle_blocks_extras.py b/plugins/turtle_blocks_extras/turtle_blocks_extras.py index c3f00b1..8013ea6 100644 --- a/plugins/turtle_blocks_extras/turtle_blocks_extras.py +++ b/plugins/turtle_blocks_extras/turtle_blocks_extras.py @@ -15,7 +15,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -import gtk +from util.gtkcompat import Gtk from time import time import os.path from gettext import gettext as _ @@ -994,7 +994,7 @@ bullets')) return pixbuf = None try: - pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(self.tw.lc.filepath, + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(self.tw.lc.filepath, scale, scale) except: self.tw.showlabel('nojournal', self.tw.lc.filepath) diff --git a/pysamples/grecord.py b/pysamples/grecord.py index 84b1a5c..94599ee 100644 --- a/pysamples/grecord.py +++ b/pysamples/grecord.py @@ -15,11 +15,10 @@ def myblock(tw, arg): import os import time - import gtk + from util.gtkcompat import Gtk, GObject import gst - import gobject - gobject.threads_init() + GObject.threads_init() from TurtleArt.tautils import get_path from TurtleArt.tagplay import play_audio_from_file @@ -139,7 +138,7 @@ def myblock(tw, arg): audioBus.add_signal_watch() self._audio_transcode_handler = audioBus.connect( 'message', self._onMuxedAudioMessageCb, audioline) - self._transcode_id = gobject.timeout_add( + self._transcode_id = GObject.timeout_add( 200, self._transcodeUpdateCb, audioline) audioline.set_state(gst.STATE_PLAYING) @@ -170,9 +169,9 @@ def myblock(tw, arg): if message.type != gst.MESSAGE_EOS: return True - gobject.source_remove(self._audio_transcode_handler) + GObject.source_remove(self._audio_transcode_handler) self._audio_transcode_handler = None - gobject.source_remove(self._transcode_id) + GObject.source_remove(self._transcode_id) self._transcode_id = None pipe.set_state(gst.STATE_NULL) pipe.get_bus().remove_signal_watch() diff --git a/turtleart.py b/turtleart.py index ca9153a..1980e1d 100755 --- a/turtleart.py +++ b/turtleart.py @@ -21,9 +21,7 @@ #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN #THE SOFTWARE. -import pygtk -pygtk.require('2.0') -import gtk +from util.gtkcompat import Gtk, Gdk, GdkPixbuf import getopt import sys @@ -83,9 +81,9 @@ class TurtleMain(): self._plugins = [] if self.output_png: - pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, - gtk.gdk.screen_width(), - gtk.gdk.screen_height()) + pixbuf = GdkPixbuf.Pixbuf(GdkPixbuf.Colorspace.RGB, False, 8, + Gdk.Screen.width(), + Gdk.Screen.height()) self.canvas, mask = pixbuf.render_pixmap_and_mask() self._build_window() self._draw_and_quit() @@ -166,7 +164,7 @@ class TurtleMain(): self.tw.load_start(self.ta_file) self.tw.lc.trace = 0 self.tw.run_button(0) - gtk.main() + Gtk.main() def _draw_and_quit(self): ''' Non-interactive mode: run the project, save it to a file @@ -265,7 +263,7 @@ class TurtleMain(): def _setup_gtk(self): ''' Set up a scrolled window in which to run Turtle Blocks. ''' - win = gtk.Window(gtk.WINDOW_TOPLEVEL) + win = Gtk.Window() win.set_default_size(self.width, self.height) win.move(self.x, self.y) win.maximize() @@ -275,7 +273,7 @@ class TurtleMain(): self._ICON_SUBPATH)) win.connect('delete_event', self._quit_ta) - vbox = gtk.VBox(False, 0) + vbox = Gtk.VBox.new(False, 0) win.add(vbox) vbox.show() @@ -283,16 +281,16 @@ class TurtleMain(): vbox.pack_start(menu_bar, False, False, 2) menu_bar.show() - sw = gtk.ScrolledWindow() - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + sw = Gtk.ScrolledWindow() + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.show() - canvas = gtk.DrawingArea() - width = gtk.gdk.screen_width() * 2 - height = gtk.gdk.screen_height() * 2 + canvas = Gtk.DrawingArea() + width = Gdk.Screen.width() * 2 + height = Gdk.Screen.height() * 2 canvas.set_size_request(width, height) sw.add_with_viewport(canvas) canvas.show() - vbox.pack_end(sw, True, True) + vbox.pack_end(sw, True, True, 0) win.show_all() self.win = win @@ -300,7 +298,7 @@ class TurtleMain(): def _get_menu_bar(self): ''' Instead of Sugar toolbars, use GNOME menus. ''' - menu = gtk.Menu() + menu = Gtk.Menu() MenuBuilder.make_menu_item(menu, _('New'), self._do_new_cb) MenuBuilder.make_menu_item(menu, _('Open'), self._do_open_cb) MenuBuilder.make_menu_item(menu, _('Save'), self._do_save_cb) @@ -314,7 +312,7 @@ class TurtleMain(): MenuBuilder.make_menu_item(menu, _('Quit'), self.destroy) activity_menu = MenuBuilder.make_sub_menu(menu, _('File')) - menu = gtk.Menu() + menu = Gtk.Menu() MenuBuilder.make_menu_item(menu, _('Cartesian coordinates'), self._do_cartesian_cb) MenuBuilder.make_menu_item(menu, _('Polar coordinates'), @@ -329,12 +327,12 @@ class TurtleMain(): self._do_resize_cb, -1) view_menu = MenuBuilder.make_sub_menu(menu, _('View')) - menu = gtk.Menu() + menu = Gtk.Menu() MenuBuilder.make_menu_item(menu, _('Copy'), self._do_copy_cb) MenuBuilder.make_menu_item(menu, _('Paste'), self._do_paste_cb) edit_menu = MenuBuilder.make_sub_menu(menu, _('Edit')) - menu = gtk.Menu() + menu = Gtk.Menu() MenuBuilder.make_menu_item(menu, _('Show palette'), self._do_palette_cb) MenuBuilder.make_menu_item(menu, _('Hide palette'), @@ -343,7 +341,7 @@ class TurtleMain(): self._do_hideshow_cb) tool_menu = MenuBuilder.make_sub_menu(menu, _('Tools')) - menu = gtk.Menu() + menu = Gtk.Menu() MenuBuilder.make_menu_item(menu, _('Clean'), self._do_eraser_cb) MenuBuilder.make_menu_item(menu, _('Run'), self._do_run_cb) MenuBuilder.make_menu_item(menu, _('Step'), self._do_step_cb) @@ -351,7 +349,7 @@ class TurtleMain(): MenuBuilder.make_menu_item(menu, _('Stop'), self._do_stop_cb) turtle_menu = MenuBuilder.make_sub_menu(menu, _('Turtle')) - menu_bar = gtk.MenuBar() + menu_bar = Gtk.MenuBar() menu_bar.append(activity_menu) menu_bar.append(edit_menu) menu_bar.append(view_menu) @@ -372,12 +370,12 @@ class TurtleMain(): else: if self.tw.project_has_changed(): self._show_save_dialog(False) - gtk.main_quit() + Gtk.main_quit() def _show_save_dialog(self, new_project=True): ''' Dialog for save project ''' - dlg = gtk.MessageDialog(parent=None, type=gtk.MESSAGE_INFO, - buttons=gtk.BUTTONS_OK_CANCEL, + dlg = Gtk.MessageDialog(parent=None, type=Gtk.MessageType.INFO, + buttons=Gtk.ButtonsType.OK_CANCEL, message_format=_( 'You have unsaved work. Would you like to save before quitting?')) dlg.set_title(_('Save project?')) @@ -385,7 +383,7 @@ class TurtleMain(): resp = dlg.run() dlg.destroy() - if resp == gtk.RESPONSE_OK: + if resp == Gtk.ResponseType.OK: if new_project: self._save_as() else: @@ -545,7 +543,7 @@ class TurtleMain(): def _do_copy_cb(self, button): ''' Callback for copy button. ''' - clipBoard = gtk.Clipboard() + clipBoard = Gtk.Clipboard() data = self.tw.assemble_data_to_save(False, False) if data is not []: text = data_to_string(data) @@ -553,7 +551,7 @@ class TurtleMain(): def _do_paste_cb(self, button): ''' Callback for paste button. ''' - clipBoard = gtk.Clipboard() + clipBoard = Gtk.Clipboard() text = clipBoard.wait_for_text() if text is not None: if self.tw.selected_blk is not None and\ @@ -576,7 +574,7 @@ class TurtleMain(): def destroy(self, event, data=None): ''' Callback for destroy event. ''' - gtk.main_quit() + Gtk.main_quit() def nick_changed(self, nick): ''' TODO: Rename default turtle in dictionary ''' diff --git a/util/configfile.py b/util/configfile.py index adabb34..8f8e755 100644 --- a/util/configfile.py +++ b/util/configfile.py @@ -16,21 +16,20 @@ # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. -import gobject +from util.gtkcompat import GObject - -class ConfigFile(gobject.GObject): +class ConfigFile(GObject.GObject): """Load/save a simple (key = value) config file""" __gsignals__ = { - 'configuration-loaded': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'configuration-loaded': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ()), - 'configuration-saved': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + 'configuration-saved': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, ()), } def __init__(self, config_file_path, valid_keys={}): - gobject.GObject.__init__(self) + GObject.GObject.__init__(self) self._config_file_path = config_file_path self._valid_keys = valid_keys diff --git a/util/configwizard.py b/util/configwizard.py index 6c66bd1..144f793 100644 --- a/util/configwizard.py +++ b/util/configwizard.py @@ -16,8 +16,7 @@ # Boston, MA 02111-1307, USA. from configfile import ConfigFile -import gtk - +from util.gtkcompat import Gtk class ConfigWizard(): """Simple configuration wizard window.""" @@ -54,10 +53,10 @@ class ConfigWizard(): if self._config_file_obj is None: raise RuntimeError("I need the run time obj") - self._config_popup = gtk.Window() + self._config_popup = Gtk.Window() self._config_popup.set_default_size(200, 200) self._config_popup.connect('delete_event', self._close_config_cb) - table = gtk.Table(12, 1, True) + table = Gtk.Table(12, 1, True) self._config_popup.add(table) row = 1 @@ -66,12 +65,12 @@ class ConfigWizard(): table.attach(hbox, 0, 1, row, row + 1, xpadding=5, ypadding=2) row = row + 1 - hbox = gtk.HBox() - save_button = gtk.Button('Save') + hbox = Gtk.HBox() + save_button = Gtk.Button('Save') save_button.set_size_request(50, 15) save_button.connect('pressed', self._save_config_cb) hbox.add(save_button) - cancel_button = gtk.Button('Cancel') + cancel_button = Gtk.Button('Cancel') cancel_button.set_size_request(50, 15) cancel_button.connect('pressed', self._close_config_cb) hbox.add(cancel_button) @@ -83,8 +82,8 @@ class ConfigWizard(): try: self._do_save_config() except Exception, e: - w = gtk.Window() - l = gtk.Label(e.message) + w = Gtk.Window() + l = Gtk.Label(label=e.message) w.add(l) w.show_all() finally: @@ -94,9 +93,9 @@ class ConfigWizard(): for i in self._config_items: param_name = i["item_name"] v = self._config_entries[param_name] - if v.__class__ is gtk.Entry: + if v.__class__ is Gtk.Entry: value = v.get_text() - elif v.__class__ is gtk.CheckButton: + elif v.__class__ is Gtk.CheckButton: value = v.get_active() else: raise RuntimeError("Don't recognize the class %s" % type(v)) @@ -111,20 +110,20 @@ class ConfigWizard(): param_name = opts["item_name"] with_value = opts["item_with_value"] if "item_with_value" in opts \ else True - hbox = gtk.HBox() + hbox = Gtk.HBox() if opts["item_type"] == "text": - entry = gtk.Entry() + entry = Gtk.Entry() entry.set_size_request(150, 25) if with_value: value = self._config_file_obj.get(param_name, True) entry.set_text(str(value)) elif opts["item_type"] == "boolean": - entry = gtk.CheckButton() + entry = Gtk.CheckButton() if with_value: value = self._config_file_obj.get(param_name, True) entry.set_active(value) self._config_entries[param_name] = entry - label = gtk.Label(opts["item_label"] + ': ') + label = Gtk.Label(label=opts["item_label"] + ': ') label.set_alignment(1.0, 0.5) label.set_size_request(100, 25) hbox.add(label) @@ -215,4 +214,4 @@ def test_wizard_from_config_file_path(test_config_file): if __name__ == "__main__": #test_wizard_from_config_file_obj("/tmp/configwizard.test.0001") test_wizard_from_config_file_path("/tmp/configwizard.test.0002") - gtk.main() + Gtk.main() diff --git a/util/gtkcompat.py b/util/gtkcompat.py new file mode 100644 index 0000000..c60ea73 --- /dev/null +++ b/util/gtkcompat.py @@ -0,0 +1,132 @@ +# Import Gtk and GObject, put include crazy thunks so that old +# code using pygtk and Gtk 2.0 code continues to run. +FORCE_GTK2 = True + +try: + if FORCE_GTK2: raise ValueError("forcing gtk2") + import gi + gi.require_version('Gtk', '3.0') + from gi.repository import Gtk, Gdk, GObject, GdkPixbuf + from gi.repository import Pango + Rectangle = lambda x, y, w, h: (x,y,w,h) + GObject.TYPE_NONE = None # compatibility hack + class GConf: + pass # XXX no more GConf, sigh +except ValueError, ImportError: + # fall back to old pygtk, with various evil hacks + import pygtk + pygtk.require('2.0') + import gtk as Gtk + import gobject as GObject + import gconf + import pango as Pango + Gdk = Gtk.gdk + Rectangle = Gdk.Rectangle + + class GConf: + class Client: + get_default = gconf.client_get_default + + class GObjectSignalFlags: + RUN_FIRST = GObject.SIGNAL_RUN_FIRST + GObject.SignalFlags = GObjectSignalFlags + + class GdkEventMask: + EXPOSURE_MASK = Gdk.EXPOSURE_MASK + BUTTON_PRESS_MASK = Gdk.BUTTON_PRESS_MASK + BUTTON_RELEASE_MASK = Gdk.BUTTON_RELEASE_MASK + POINTER_MOTION_MASK = Gdk.POINTER_MOTION_MASK + KEY_PRESS_MASK = Gdk.KEY_PRESS_MASK + CONTROL_MASK = Gdk.CONTROL_MASK + VISIBILITY_NOTIFY_MASK = Gdk.VISIBILITY_NOTIFY_MASK + Gdk.EventMask = GdkEventMask + + class GdkModifierType: + MOD1_MASK = Gdk.MOD1_MASK + Gdk.ModifierType = GdkModifierType + + class GdkPixbuf: + class InterpType: + NEAREST = Gdk.INTERP_NEAREST + class Colorspace: + RGB = Gdk.COLORSPACE_RGB + class Pixbuf: + # XXX not the same as Gdk.Pixbuf, sadly. don't do instanceof! + new_from_file_at_size = Gdk.pixbuf_new_from_file_at_size + new_from_file = Gdk.pixbuf_new_from_file + loader_new_with_mime_type = Gdk.pixbuf_loader_new_with_mime_type + PixbufLoader = Gdk.PixbufLoader + + class GdkScreen: + width = Gdk.screen_width + height = Gdk.screen_height + Gdk.Screen = GdkScreen + + class GdkVisibilityState: + FULLY_OBSCURED = Gdk.VISIBILITY_FULLY_OBSCURED + Gdk.VisibilityState = GdkVisibilityState + + class GdkWindowTypeHint: + NORMAL = Gdk.WINDOW_TYPE_HINT_NORMAL + Gdk.WindowTypeHint = GdkWindowTypeHint + + class GtkFileChooserAction: + OPEN = Gtk.FILE_CHOOSER_ACTION_OPEN + SAVE = Gtk.FILE_CHOOSER_ACTION_SAVE + Gtk.FileChooserAction = GtkFileChooserAction + + class GtkResponseType: + OK = Gtk.RESPONSE_OK + CANCEL = Gtk.RESPONSE_CANCEL + ACCEPT = Gtk.RESPONSE_ACCEPT + Gtk.ResponseType = GtkResponseType + + class GtkButtonsType: + OK_CANCEL = Gtk.BUTTONS_OK_CANCEL + Gtk.ButtonsType = GtkButtonsType + + class GtkMessageType: + INFO = Gtk.MESSAGE_INFO + Gtk.MessageType = GtkMessageType + + class GtkDialogFlags: + MODAL = Gtk.DIALOG_MODAL + DESTROY_WITH_PARENT = Gtk.DIALOG_DESTROY_WITH_PARENT + Gtk.DialogFlags = GtkDialogFlags + + class GtkIconTheme: + get_default = Gtk.icon_theme_get_default + Gtk.IconTheme = GtkIconTheme + + class GtkPolicyType: + AUTOMATIC = Gtk.POLICY_AUTOMATIC + Gtk.PolicyType = GtkPolicyType + + class GtkWrapMode: + WORD = Gtk.WRAP_WORD + Gtk.WrapMode = GtkWrapMode + + class GtkWindowType: + TOPLEVEL = Gtk.WINDOW_TOPLEVEL + Gtk.WindowType = GtkWindowType + + # hack around named parameter for Gtk.Label + GtkLabel = Gtk.Label + def GtkLabel2(label=''): + return GtkLabel(label) + Gtk.Label = GtkLabel2 + + # hack around named parameters + GtkVBox1 = Gtk.VBox + class GtkVBox2: + @staticmethod + def new(homogenous, spacing): + return GtkVBox1(homogenous, spacing) + Gtk.VBox = GtkVBox2 + + GtkMenuItem1 = Gtk.MenuItem + class GtkMenuItem2: + @staticmethod + def new_with_label(label): + return GtkMenuItem1(label) + Gtk.MenuItem = GtkMenuItem2 diff --git a/util/menubuilder.py b/util/menubuilder.py index 4ee4550..7df065d 100644 --- a/util/menubuilder.py +++ b/util/menubuilder.py @@ -15,14 +15,13 @@ # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. -import gtk - +from util.gtkcompat import Gtk class MenuBuilder(): @classmethod def make_sub_menu(cls, menu, name): """ add a new submenu to the toolbar """ - sub_menu = gtk.MenuItem(name) + sub_menu = Gtk.MenuItem.new_with_label(name) sub_menu.show() sub_menu.set_submenu(menu) return sub_menu @@ -30,7 +29,7 @@ class MenuBuilder(): @classmethod def make_menu_item(cls, menu, tooltip, callback, arg=None): """ add a new item to the submenu """ - menu_items = gtk.MenuItem(tooltip) + menu_items = Gtk.MenuItem.new_with_label(tooltip) menu.append(menu_items) if arg is None: menu_items.connect('activate', callback) -- cgit v0.9.1