<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.sugarlabs.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fdanesse</id>
	<title>Sugar Labs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.sugarlabs.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fdanesse"/>
	<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/go/Special:Contributions/Fdanesse"/>
	<updated>2026-05-14T04:59:38Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting/Record&amp;diff=85055</id>
		<title>Features/GTK3/Porting/Record</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting/Record&amp;diff=85055"/>
		<updated>2012-12-23T13:23:41Z</updated>

		<summary type="html">&lt;p&gt;Fdanesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def getStringFromPixbuf(pixbuf):&lt;br /&gt;
    data = [&amp;quot;&amp;quot;]&lt;br /&gt;
    pixbuf.save_to_callback(_saveDataToBufferCb, &amp;quot;png&amp;quot;, {}, data)&lt;br /&gt;
    return base64.b64encode(str(data[0]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _saveDataToBufferCb(buf, data):&lt;br /&gt;
    data[0] += buf&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def getStringFromPixbuf(pixbuf):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Converts a pixbuf in a string.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    # Save_to_bufferv return: (bool, string)&lt;br /&gt;
    data = pixbuf.save_to_bufferv(&#039;png&#039;, [], [])&lt;br /&gt;
    &lt;br /&gt;
    return base64.b64encode(data[1])&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
thumbImg.save(thumbPath, &amp;quot;jpeg&amp;quot;, {&amp;quot;quality&amp;quot;:&amp;quot;85&amp;quot;} ) &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
thumbImg.savev(thumbPath, &amp;quot;jpeg&amp;quot;, {&amp;quot;quality&amp;quot;:&amp;quot;85&amp;quot;} )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def load_colored_svg(filename, stroke, fill):&lt;br /&gt;
&lt;br /&gt;
    path = os.path.join(constants.GFX_PATH, filename)&lt;br /&gt;
    data = open(path, &#039;r&#039;).read()&lt;br /&gt;
&lt;br /&gt;
    entity = &#039;&amp;lt;!ENTITY fill_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % fill&lt;br /&gt;
    data = re.sub(&#039;&amp;lt;!ENTITY fill_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
&lt;br /&gt;
    entity = &#039;&amp;lt;!ENTITY stroke_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % stroke&lt;br /&gt;
    data = re.sub(&#039;&amp;lt;!ENTITY stroke_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
&lt;br /&gt;
    return rsvg.Handle(data=data).get_pixbuf()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def load_colored_svg(filename, stroke, fill):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Loads an svg, will change the fill and&lt;br /&gt;
    stroke colors and returns the pixbuf.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    path = os.path.join(constants.GFX_PATH, filename)&lt;br /&gt;
    data = open(path, &#039;r&#039;).read()&lt;br /&gt;
&lt;br /&gt;
    entity = &#039;&amp;lt;!ENTITY fill_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % fill&lt;br /&gt;
    data = re.sub(&#039;&amp;lt;!ENTITY fill_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
&lt;br /&gt;
    entity = &#039;&amp;lt;!ENTITY stroke_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % stroke&lt;br /&gt;
    data = re.sub(&#039;&amp;lt;!ENTITY stroke_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
&lt;br /&gt;
    return Rsvg.Handle.new_from_data(data.encode(&#039;utf-8&#039;)).get_pixbuf()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Not implement:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
super(Record, self).close()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Due to:&#039;&#039;&#039; [http://bugs.sugarlabs.org/ticket/4345]&lt;br /&gt;
&lt;br /&gt;
When an application fails and you want to close from the corresponding button occurs:&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
File &amp;quot;/usr/lib/python2.7/site-packages/sugar3/activity/activity.py&amp;quot;, line 890, in _keep_failed_dialog_response_cb&lt;br /&gt;
self.close(skip_save=True)&lt;br /&gt;
TypeError: close() got an unexpected keyword argument &#039;skip_save&#039;&lt;br /&gt;
And the activity is not closed, nor can restart sugar as alert reappears again and again, you need to stop.&lt;br /&gt;
&lt;br /&gt;
This error is caused by the following:&lt;br /&gt;
When a class B inherits from class A, and&lt;br /&gt;
in B is overwritten a function of A,&lt;br /&gt;
A function is no longer running,&lt;br /&gt;
but instead runs the function of the class B,&lt;br /&gt;
even when explicitly call function A from B.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stop using Pixmap instead use Pixbuf:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def _generate_image(self, num):&lt;br /&gt;
        w = 55&lt;br /&gt;
        h = w&lt;br /&gt;
        pixmap = gdk.Pixmap(self.get_window(), w, h, -1)&lt;br /&gt;
        ctx = pixmap.cairo_create()&lt;br /&gt;
        ctx.rectangle(0, 0, w, h)&lt;br /&gt;
        ctx.set_source_rgb(0, 0, 0)&lt;br /&gt;
        ctx.fill()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
    def _generate_image(self, num):&lt;br /&gt;
&lt;br /&gt;
        w = 55&lt;br /&gt;
        h = w&lt;br /&gt;
        &lt;br /&gt;
        x, y = self.get_property(&#039;window&#039;).get_position()&lt;br /&gt;
        rect = self.get_allocation()&lt;br /&gt;
        width, height = rect.width, rect.height&lt;br /&gt;
       &lt;br /&gt;
        thumb_surface = Gdk.Window.create_similar_surface(&lt;br /&gt;
            self.get_property(&#039;window&#039;),&lt;br /&gt;
            cairo.CONTENT_COLOR,&lt;br /&gt;
            width, height)&lt;br /&gt;
       &lt;br /&gt;
        ctx = cairo.Context(thumb_surface)&lt;br /&gt;
        &lt;br /&gt;
        Gdk.cairo_set_source_window(&lt;br /&gt;
            cairo_context,&lt;br /&gt;
            self.get_property(&#039;window&#039;),&lt;br /&gt;
            x, y)&lt;br /&gt;
            &lt;br /&gt;
        ctx.paint()&lt;br /&gt;
        &lt;br /&gt;
        ctx.rectangle(x, y, w, h)&lt;br /&gt;
        ctx.set_source_rgb(0, 0, 0)&lt;br /&gt;
        ctx.fill()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;New Gst.TagList:&lt;br /&gt;
&lt;br /&gt;
Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_AUDIO)&lt;br /&gt;
&lt;br /&gt;
        if self._audio_pixbuf:&lt;br /&gt;
            pixbuf_b64 = utils.getStringFromPixbuf(self._audio_pixbuf)&lt;br /&gt;
            taglist[gst.TAG_EXTENDED_COMMENT] = &amp;quot;coverart=&amp;quot; + pixbuf_b64&lt;br /&gt;
&lt;br /&gt;
        vorbis_enc = audioline.get_by_name(&#039;audioVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, gst.TAG_MERGE_REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_AUDIO)&lt;br /&gt;
        &lt;br /&gt;
        if self._audio_pixbuf:&lt;br /&gt;
            pixbuf_b64 = utils.getStringFromPixbuf(self._audio_pixbuf)&lt;br /&gt;
            &lt;br /&gt;
            taglist.add_value(&lt;br /&gt;
                Gst.TagMergeMode.REPLACE,&lt;br /&gt;
                Gst.TAG_EXTENDED_COMMENT,&lt;br /&gt;
                &amp;quot;coverart=&amp;quot; + pixbuf_b64)&lt;br /&gt;
                &lt;br /&gt;
        vorbis_enc = audioline.get_by_name(&#039;audioVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, Gst.TagMergeMode.REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_VIDEO)&lt;br /&gt;
        vorbis_enc = muxline.get_by_name(&#039;muxVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, gst.TAG_MERGE_REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_VIDEO)&lt;br /&gt;
        vorbis_enc = muxline.get_by_name(&#039;muxVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, Gst.TagMergeMode.REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def _get_tags(self, type):&lt;br /&gt;
&lt;br /&gt;
        tl = gst.TagList()&lt;br /&gt;
        tl[gst.TAG_ARTIST] = self.model.get_nickname()&lt;br /&gt;
        tl[gst.TAG_COMMENT] = &amp;quot;olpc&amp;quot;&lt;br /&gt;
        tl[gst.TAG_ALBUM] = &amp;quot;olpc&amp;quot;&lt;br /&gt;
        tl[gst.TAG_DATE] = utils.getDateString(int(time.time()))&lt;br /&gt;
        stringType = constants.MEDIA_INFO[type][&#039;istr&#039;]&lt;br /&gt;
        &lt;br /&gt;
        tl[gst.TAG_TITLE] = _(&#039;%(type)s by %(name)s&#039;) % {&#039;type&#039;: stringType,&lt;br /&gt;
                &#039;name&#039;: self.model.get_nickname()}&lt;br /&gt;
        return tl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def _get_tags(self, type):&lt;br /&gt;
        &lt;br /&gt;
        taglist = Gst.TagList.new_empty()&lt;br /&gt;
        &lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_ARTIST,&lt;br /&gt;
            self.model.get_nickname())&lt;br /&gt;
            &lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_COMMENT,&lt;br /&gt;
            &amp;quot;olpc&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_ALBUM,&lt;br /&gt;
            &amp;quot;olpc&amp;quot;) #self.ca.metadata[&#039;title&#039;]&lt;br /&gt;
&lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_DATE,&lt;br /&gt;
            utils.getDateString(int(time.time())))&lt;br /&gt;
            &lt;br /&gt;
        stringType = constants.MEDIA_INFO[type][&#039;istr&#039;]&lt;br /&gt;
            &lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_TITLE,&lt;br /&gt;
            _(&#039;%(type)s by %(name)s&#039;) % {&#039;type&#039;: stringType,&lt;br /&gt;
                &#039;name&#039;: self.model.get_nickname()})&lt;br /&gt;
                &lt;br /&gt;
        return taglist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GObject.get_data() and set_data() are deprecated. Use normal Python attributes instead&lt;br /&gt;
button.set_data(&#039;handler-ids&#039;, (clicked_handler, remove_handler, clipboard_handler))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No joint implementation:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
self.connect(&#039;size_allocate&#039;, self._size_allocate_cb)&lt;br /&gt;
def _size_allocate_cb(self, widget, requisition):&lt;br /&gt;
. . .&lt;br /&gt;
&lt;br /&gt;
 and&lt;br /&gt;
&lt;br /&gt;
def do_size_allocate(self, allocation):&lt;br /&gt;
. . .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
taglist.add_value( &lt;br /&gt;
       Gst.TagMergeMode.REPLACE, &lt;br /&gt;
       Gst.TAG_DATE, &lt;br /&gt;
       utils.getDateString(int(time.time()))) &lt;br /&gt;
&lt;br /&gt;
def getDateString( when ):&lt;br /&gt;
    &lt;br /&gt;
    return strftime( &amp;quot;%c&amp;quot;, time.localtime(when) )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
datetime = GLib.DateTime.new_now_local()&lt;br /&gt;
date = GLib.Date()&lt;br /&gt;
date.set_day(datetime.get_day_of_month())&lt;br /&gt;
date.set_month(datetime.get_month())&lt;br /&gt;
date.set_year(datetime.get_year())&lt;br /&gt;
 &lt;br /&gt;
taglist.add_value(&lt;br /&gt;
      Gst.TagMergeMode.REPLACE,&lt;br /&gt;
      Gst.TAG_DATE,&lt;br /&gt;
      date)&lt;/div&gt;</summary>
		<author><name>Fdanesse</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting/Record&amp;diff=84994</id>
		<title>Features/GTK3/Porting/Record</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting/Record&amp;diff=84994"/>
		<updated>2012-12-19T14:41:57Z</updated>

		<summary type="html">&lt;p&gt;Fdanesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def getStringFromPixbuf(pixbuf):&lt;br /&gt;
    data = [&amp;quot;&amp;quot;]&lt;br /&gt;
    pixbuf.save_to_callback(_saveDataToBufferCb, &amp;quot;png&amp;quot;, {}, data)&lt;br /&gt;
    return base64.b64encode(str(data[0]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _saveDataToBufferCb(buf, data):&lt;br /&gt;
    data[0] += buf&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def getStringFromPixbuf(pixbuf):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Converts a pixbuf in a string.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    # Save_to_bufferv return: (bool, string)&lt;br /&gt;
    data = pixbuf.save_to_bufferv(&#039;png&#039;, [], [])&lt;br /&gt;
    &lt;br /&gt;
    return base64.b64encode(data[1])&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
thumbImg.save(thumbPath, &amp;quot;jpeg&amp;quot;, {&amp;quot;quality&amp;quot;:&amp;quot;85&amp;quot;} ) &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
thumbImg.savev(thumbPath, &amp;quot;jpeg&amp;quot;, {&amp;quot;quality&amp;quot;:&amp;quot;85&amp;quot;} )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def load_colored_svg(filename, stroke, fill):&lt;br /&gt;
&lt;br /&gt;
    path = os.path.join(constants.GFX_PATH, filename)&lt;br /&gt;
    data = open(path, &#039;r&#039;).read()&lt;br /&gt;
&lt;br /&gt;
    entity = &#039;&amp;lt;!ENTITY fill_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % fill&lt;br /&gt;
    data = re.sub(&#039;&amp;lt;!ENTITY fill_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
&lt;br /&gt;
    entity = &#039;&amp;lt;!ENTITY stroke_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % stroke&lt;br /&gt;
    data = re.sub(&#039;&amp;lt;!ENTITY stroke_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
&lt;br /&gt;
    return rsvg.Handle(data=data).get_pixbuf()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def load_colored_svg(filename, stroke, fill):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Loads an svg, will change the fill and&lt;br /&gt;
    stroke colors and returns the pixbuf.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    path = os.path.join(constants.GFX_PATH, filename)&lt;br /&gt;
    data = open(path, &#039;r&#039;).read()&lt;br /&gt;
&lt;br /&gt;
    entity = &#039;&amp;lt;!ENTITY fill_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % fill&lt;br /&gt;
    data = re.sub(&#039;&amp;lt;!ENTITY fill_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
&lt;br /&gt;
    entity = &#039;&amp;lt;!ENTITY stroke_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % stroke&lt;br /&gt;
    data = re.sub(&#039;&amp;lt;!ENTITY stroke_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
&lt;br /&gt;
    return Rsvg.Handle.new_from_data(data.encode(&#039;utf-8&#039;)).get_pixbuf()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Not implement:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
super(Record, self).close()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Due to:&#039;&#039;&#039; [http://bugs.sugarlabs.org/ticket/4345]&lt;br /&gt;
&lt;br /&gt;
When an application fails and you want to close from the corresponding button occurs:&lt;br /&gt;
&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
File &amp;quot;/usr/lib/python2.7/site-packages/sugar3/activity/activity.py&amp;quot;, line 890, in _keep_failed_dialog_response_cb&lt;br /&gt;
self.close(skip_save=True)&lt;br /&gt;
TypeError: close() got an unexpected keyword argument &#039;skip_save&#039;&lt;br /&gt;
And the activity is not closed, nor can restart sugar as alert reappears again and again, you need to stop.&lt;br /&gt;
&lt;br /&gt;
This error is caused by the following:&lt;br /&gt;
When a class B inherits from class A, and&lt;br /&gt;
in B is overwritten a function of A,&lt;br /&gt;
A function is no longer running,&lt;br /&gt;
but instead runs the function of the class B,&lt;br /&gt;
even when explicitly call function A from B.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stop using Pixmap instead use Pixbuf:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def _generate_image(self, num):&lt;br /&gt;
        w = 55&lt;br /&gt;
        h = w&lt;br /&gt;
        pixmap = gdk.Pixmap(self.get_window(), w, h, -1)&lt;br /&gt;
        ctx = pixmap.cairo_create()&lt;br /&gt;
        ctx.rectangle(0, 0, w, h)&lt;br /&gt;
        ctx.set_source_rgb(0, 0, 0)&lt;br /&gt;
        ctx.fill()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
    def _generate_image(self, num):&lt;br /&gt;
&lt;br /&gt;
        w = 55&lt;br /&gt;
        h = w&lt;br /&gt;
        &lt;br /&gt;
        x, y = self.get_property(&#039;window&#039;).get_position()&lt;br /&gt;
        rect = self.get_allocation()&lt;br /&gt;
        width, height = rect.width, rect.height&lt;br /&gt;
       &lt;br /&gt;
        thumb_surface = Gdk.Window.create_similar_surface(&lt;br /&gt;
            self.get_property(&#039;window&#039;),&lt;br /&gt;
            cairo.CONTENT_COLOR,&lt;br /&gt;
            width, height)&lt;br /&gt;
       &lt;br /&gt;
        ctx = cairo.Context(thumb_surface)&lt;br /&gt;
        &lt;br /&gt;
        Gdk.cairo_set_source_window(&lt;br /&gt;
            cairo_context,&lt;br /&gt;
            self.get_property(&#039;window&#039;),&lt;br /&gt;
            x, y)&lt;br /&gt;
            &lt;br /&gt;
        ctx.paint()&lt;br /&gt;
        &lt;br /&gt;
        ctx.rectangle(x, y, w, h)&lt;br /&gt;
        ctx.set_source_rgb(0, 0, 0)&lt;br /&gt;
        ctx.fill()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;New Gst.TagList:&lt;br /&gt;
&lt;br /&gt;
Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_AUDIO)&lt;br /&gt;
&lt;br /&gt;
        if self._audio_pixbuf:&lt;br /&gt;
            pixbuf_b64 = utils.getStringFromPixbuf(self._audio_pixbuf)&lt;br /&gt;
            taglist[gst.TAG_EXTENDED_COMMENT] = &amp;quot;coverart=&amp;quot; + pixbuf_b64&lt;br /&gt;
&lt;br /&gt;
        vorbis_enc = audioline.get_by_name(&#039;audioVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, gst.TAG_MERGE_REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_AUDIO)&lt;br /&gt;
        &lt;br /&gt;
        if self._audio_pixbuf:&lt;br /&gt;
            pixbuf_b64 = utils.getStringFromPixbuf(self._audio_pixbuf)&lt;br /&gt;
            &lt;br /&gt;
            taglist.add_value(&lt;br /&gt;
                Gst.TagMergeMode.REPLACE,&lt;br /&gt;
                Gst.TAG_EXTENDED_COMMENT,&lt;br /&gt;
                &amp;quot;coverart=&amp;quot; + pixbuf_b64)&lt;br /&gt;
                &lt;br /&gt;
        vorbis_enc = audioline.get_by_name(&#039;audioVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, Gst.TagMergeMode.REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_VIDEO)&lt;br /&gt;
        vorbis_enc = muxline.get_by_name(&#039;muxVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, gst.TAG_MERGE_REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_VIDEO)&lt;br /&gt;
        vorbis_enc = muxline.get_by_name(&#039;muxVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, Gst.TagMergeMode.REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def _get_tags(self, type):&lt;br /&gt;
&lt;br /&gt;
        tl = gst.TagList()&lt;br /&gt;
        tl[gst.TAG_ARTIST] = self.model.get_nickname()&lt;br /&gt;
        tl[gst.TAG_COMMENT] = &amp;quot;olpc&amp;quot;&lt;br /&gt;
        tl[gst.TAG_ALBUM] = &amp;quot;olpc&amp;quot;&lt;br /&gt;
        tl[gst.TAG_DATE] = utils.getDateString(int(time.time()))&lt;br /&gt;
        stringType = constants.MEDIA_INFO[type][&#039;istr&#039;]&lt;br /&gt;
        &lt;br /&gt;
        tl[gst.TAG_TITLE] = _(&#039;%(type)s by %(name)s&#039;) % {&#039;type&#039;: stringType,&lt;br /&gt;
                &#039;name&#039;: self.model.get_nickname()}&lt;br /&gt;
        return tl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def _get_tags(self, type):&lt;br /&gt;
        &lt;br /&gt;
        taglist = Gst.TagList.new_empty()&lt;br /&gt;
        &lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_ARTIST,&lt;br /&gt;
            self.model.get_nickname())&lt;br /&gt;
            &lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_COMMENT,&lt;br /&gt;
            &amp;quot;olpc&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_ALBUM,&lt;br /&gt;
            &amp;quot;olpc&amp;quot;) #self.ca.metadata[&#039;title&#039;]&lt;br /&gt;
&lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_DATE,&lt;br /&gt;
            utils.getDateString(int(time.time())))&lt;br /&gt;
            &lt;br /&gt;
        stringType = constants.MEDIA_INFO[type][&#039;istr&#039;]&lt;br /&gt;
            &lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_TITLE,&lt;br /&gt;
            _(&#039;%(type)s by %(name)s&#039;) % {&#039;type&#039;: stringType,&lt;br /&gt;
                &#039;name&#039;: self.model.get_nickname()})&lt;br /&gt;
                &lt;br /&gt;
        return taglist&lt;/div&gt;</summary>
		<author><name>Fdanesse</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting/Record&amp;diff=84993</id>
		<title>Features/GTK3/Porting/Record</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting/Record&amp;diff=84993"/>
		<updated>2012-12-19T14:38:22Z</updated>

		<summary type="html">&lt;p&gt;Fdanesse: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fdanesse</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting/Record&amp;diff=84992</id>
		<title>Features/GTK3/Porting/Record</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting/Record&amp;diff=84992"/>
		<updated>2012-12-19T14:31:36Z</updated>

		<summary type="html">&lt;p&gt;Fdanesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Some changes =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 def getStringFromPixbuf(pixbuf):&lt;br /&gt;
     data = [&amp;quot;&amp;quot;]&lt;br /&gt;
     pixbuf.save_to_callback(_saveDataToBufferCb, &amp;quot;png&amp;quot;, {}, data)&lt;br /&gt;
     return base64.b64encode(str(data[0]))&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 def _saveDataToBufferCb(buf, data):&lt;br /&gt;
     data[0] += buf&lt;br /&gt;
     return True&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;With:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 def getStringFromPixbuf(pixbuf):&lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;Converts a pixbuf in a string.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
     # Save_to_bufferv return: (bool, string)&lt;br /&gt;
     data = pixbuf.save_to_bufferv(&#039;png&#039;, [], [])&lt;br /&gt;
    &lt;br /&gt;
     return base64.b64encode(data[1])&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 thumbImg.save(thumbPath, &amp;quot;jpeg&amp;quot;, {&amp;quot;quality&amp;quot;:&amp;quot;85&amp;quot;} )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;With:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 thumbImg.savev(thumbPath, &amp;quot;jpeg&amp;quot;, {&amp;quot;quality&amp;quot;:&amp;quot;85&amp;quot;} )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 def load_colored_svg(filename, stroke, fill):&lt;br /&gt;
     path = os.path.join(constants.GFX_PATH, filename)&lt;br /&gt;
     data = open(path, &#039;r&#039;).read()&lt;br /&gt;
 &lt;br /&gt;
     entity = &#039;&amp;lt;!ENTITY fill_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % fill&lt;br /&gt;
     data = re.sub(&#039;&amp;lt;!ENTITY fill_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
 &lt;br /&gt;
     entity = &#039;&amp;lt;!ENTITY stroke_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % stroke&lt;br /&gt;
     data = re.sub(&#039;&amp;lt;!ENTITY stroke_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;return rsvg.Handle(data=data).get_pixbuf()&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;With:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 def load_colored_svg(filename, stroke, fill):&lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;Loads an svg, will change the fill and&lt;br /&gt;
     stroke colors and returns the pixbuf.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
     path = os.path.join(constants.GFX_PATH, filename)&lt;br /&gt;
     data = open(path, &#039;r&#039;).read()&lt;br /&gt;
 &lt;br /&gt;
     entity = &#039;&amp;lt;!ENTITY fill_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % fill&lt;br /&gt;
     data = re.sub(&#039;&amp;lt;!ENTITY fill_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
 &lt;br /&gt;
     entity = &#039;&amp;lt;!ENTITY stroke_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % stroke&lt;br /&gt;
     data = re.sub(&#039;&amp;lt;!ENTITY stroke_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;return Rsvg.Handle.new_from_data(data.encode(&#039;utf-8&#039;)).get_pixbuf()&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Not implement:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 super(Record, self).close()&lt;br /&gt;
&lt;br /&gt;
Due to: [http://bugs.sugarlabs.org/ticket/4345 SL#4345]&lt;br /&gt;
&lt;br /&gt;
New Gst.TagList:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_AUDIO)&lt;br /&gt;
&lt;br /&gt;
        if self._audio_pixbuf:&lt;br /&gt;
            pixbuf_b64 = utils.getStringFromPixbuf(self._audio_pixbuf)&lt;br /&gt;
            taglist[gst.TAG_EXTENDED_COMMENT] = &amp;quot;coverart=&amp;quot; + pixbuf_b64&lt;br /&gt;
&lt;br /&gt;
        vorbis_enc = audioline.get_by_name(&#039;audioVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, gst.TAG_MERGE_REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;With:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_AUDIO)&lt;br /&gt;
        &lt;br /&gt;
        if self._audio_pixbuf:&lt;br /&gt;
            pixbuf_b64 = utils.getStringFromPixbuf(self._audio_pixbuf)&lt;br /&gt;
            &lt;br /&gt;
            taglist.add_value(&lt;br /&gt;
                Gst.TagMergeMode.REPLACE,&lt;br /&gt;
                Gst.TAG_EXTENDED_COMMENT,&lt;br /&gt;
                &amp;quot;coverart=&amp;quot; + pixbuf_b64)&lt;br /&gt;
                &lt;br /&gt;
        vorbis_enc = audioline.get_by_name(&#039;audioVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, Gst.TagMergeMode.REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_VIDEO)&lt;br /&gt;
        vorbis_enc = muxline.get_by_name(&#039;muxVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, gst.TAG_MERGE_REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;With:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_VIDEO)&lt;br /&gt;
        vorbis_enc = muxline.get_by_name(&#039;muxVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, Gst.TagMergeMode.REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def _get_tags(self, type):&lt;br /&gt;
        tl = gst.TagList()&lt;br /&gt;
        tl[gst.TAG_ARTIST] = self.model.get_nickname()&lt;br /&gt;
        tl[gst.TAG_COMMENT] = &amp;quot;olpc&amp;quot;&lt;br /&gt;
        #this is unfortunately, unreliable&lt;br /&gt;
        #record.Record.log.debug(&amp;quot;self.ca.metadata[&#039;title&#039;]-&amp;gt;&amp;quot; + str(self.ca.metadata[&#039;title&#039;]) )&lt;br /&gt;
        tl[gst.TAG_ALBUM] = &amp;quot;olpc&amp;quot; #self.ca.metadata[&#039;title&#039;]&lt;br /&gt;
        tl[gst.TAG_DATE] = utils.getDateString(int(time.time()))&lt;br /&gt;
        stringType = constants.MEDIA_INFO[type][&#039;istr&#039;]&lt;br /&gt;
        &lt;br /&gt;
        # Translators: photo by photographer, e.g. &amp;quot;Photo by Mary&amp;quot;&lt;br /&gt;
        tl[gst.TAG_TITLE] = _(&#039;%(type)s by %(name)s&#039;) % {&#039;type&#039;: stringType,&lt;br /&gt;
                &#039;name&#039;: self.model.get_nickname()}&lt;br /&gt;
        return tl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;With:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def _get_tags(self, type):&lt;br /&gt;
        &lt;br /&gt;
        taglist = Gst.TagList.new_empty()&lt;br /&gt;
        &lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_ARTIST,&lt;br /&gt;
            self.model.get_nickname())&lt;br /&gt;
            &lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_COMMENT,&lt;br /&gt;
            &amp;quot;olpc&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
        #this is unfortunately, unreliable&lt;br /&gt;
        #record.Record.log.debug(&amp;quot;self.ca.metadata[&#039;title&#039;]-&amp;gt;&amp;quot; + str(self.ca.metadata[&#039;title&#039;]) )&lt;br /&gt;
&lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_ALBUM,&lt;br /&gt;
            &amp;quot;olpc&amp;quot;) #self.ca.metadata[&#039;title&#039;]&lt;br /&gt;
&lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_DATE,&lt;br /&gt;
            utils.getDateString(int(time.time())))&lt;br /&gt;
            &lt;br /&gt;
        stringType = constants.MEDIA_INFO[type][&#039;istr&#039;] #self.ca.metadata[&#039;title&#039;]&lt;br /&gt;
            &lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_TITLE,&lt;br /&gt;
            _(&#039;%(type)s by %(name)s&#039;) % {&#039;type&#039;: stringType,&lt;br /&gt;
                &#039;name&#039;: self.model.get_nickname()})&lt;br /&gt;
                &lt;br /&gt;
        return taglist&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def getStringFromPixbuf(pixbuf):&lt;br /&gt;
    data = [&amp;quot;&amp;quot;]&lt;br /&gt;
    pixbuf.save_to_callback(_saveDataToBufferCb, &amp;quot;png&amp;quot;, {}, data)&lt;br /&gt;
    return base64.b64encode(str(data[0]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _saveDataToBufferCb(buf, data):&lt;br /&gt;
    data[0] += buf&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def getStringFromPixbuf(pixbuf):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Converts a pixbuf in a string.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    # Save_to_bufferv return: (bool, string)&lt;br /&gt;
    data = pixbuf.save_to_bufferv(&#039;png&#039;, [], [])&lt;br /&gt;
    &lt;br /&gt;
    return base64.b64encode(data[1])&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
thumbImg.save(thumbPath, &amp;quot;jpeg&amp;quot;, {&amp;quot;quality&amp;quot;:&amp;quot;85&amp;quot;} ) &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
thumbImg.savev(thumbPath, &amp;quot;jpeg&amp;quot;, {&amp;quot;quality&amp;quot;:&amp;quot;85&amp;quot;} )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def load_colored_svg(filename, stroke, fill):&lt;br /&gt;
    path = os.path.join(constants.GFX_PATH, filename)&lt;br /&gt;
    data = open(path, &#039;r&#039;).read()&lt;br /&gt;
&lt;br /&gt;
    entity = &#039;&amp;lt;!ENTITY fill_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % fill&lt;br /&gt;
    data = re.sub(&#039;&amp;lt;!ENTITY fill_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
&lt;br /&gt;
    entity = &#039;&amp;lt;!ENTITY stroke_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % stroke&lt;br /&gt;
    data = re.sub(&#039;&amp;lt;!ENTITY stroke_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
&lt;br /&gt;
    return rsvg.Handle(data=data).get_pixbuf()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def load_colored_svg(filename, stroke, fill):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Loads an svg, will change the fill and&lt;br /&gt;
    stroke colors and returns the pixbuf.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    path = os.path.join(constants.GFX_PATH, filename)&lt;br /&gt;
    data = open(path, &#039;r&#039;).read()&lt;br /&gt;
&lt;br /&gt;
    entity = &#039;&amp;lt;!ENTITY fill_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % fill&lt;br /&gt;
    data = re.sub(&#039;&amp;lt;!ENTITY fill_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
&lt;br /&gt;
    entity = &#039;&amp;lt;!ENTITY stroke_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % stroke&lt;br /&gt;
    data = re.sub(&#039;&amp;lt;!ENTITY stroke_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
&lt;br /&gt;
    return Rsvg.Handle.new_from_data(data.encode(&#039;utf-8&#039;)).get_pixbuf()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Not implement:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
super(Record, self).close()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Due to:&#039;&#039;&#039; http://bugs.sugarlabs.org/ticket/4345&lt;br /&gt;
&lt;br /&gt;
When an application fails and you want to close from the corresponding button occurs:&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
File &amp;quot;/usr/lib/python2.7/site-packages/sugar3/activity/activity.py&amp;quot;, line 890, in _keep_failed_dialog_response_cb&lt;br /&gt;
self.close(skip_save=True)&lt;br /&gt;
TypeError: close() got an unexpected keyword argument &#039;skip_save&#039;&lt;br /&gt;
And the activity is not closed, nor can restart sugar as alert reappears again and again, you need to stop.&lt;br /&gt;
&lt;br /&gt;
This error is caused by the following:&lt;br /&gt;
When a class B inherits from class A, and&lt;br /&gt;
in B is overwritten a function of A,&lt;br /&gt;
A function is no longer running,&lt;br /&gt;
but instead runs the function of the class B,&lt;br /&gt;
even when explicitly call function A from B.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stop using Pixmap instead use Pixbuf:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def _generate_image(self, num):&lt;br /&gt;
        w = 55&lt;br /&gt;
        h = w&lt;br /&gt;
        pixmap = gdk.Pixmap(self.get_window(), w, h, -1)&lt;br /&gt;
        ctx = pixmap.cairo_create()&lt;br /&gt;
        ctx.rectangle(0, 0, w, h)&lt;br /&gt;
        ctx.set_source_rgb(0, 0, 0)&lt;br /&gt;
        ctx.fill()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
    def _generate_image(self, num):&lt;br /&gt;
&lt;br /&gt;
        w = 55&lt;br /&gt;
        h = w&lt;br /&gt;
        &lt;br /&gt;
        x, y = self.get_property(&#039;window&#039;).get_position()&lt;br /&gt;
        rect = self.get_allocation()&lt;br /&gt;
        width, height = rect.width, rect.height&lt;br /&gt;
       &lt;br /&gt;
        thumb_surface = Gdk.Window.create_similar_surface(&lt;br /&gt;
            self.get_property(&#039;window&#039;),&lt;br /&gt;
            cairo.CONTENT_COLOR,&lt;br /&gt;
            width, height)&lt;br /&gt;
       &lt;br /&gt;
        ctx = cairo.Context(thumb_surface)&lt;br /&gt;
        &lt;br /&gt;
        Gdk.cairo_set_source_window(&lt;br /&gt;
            cairo_context,&lt;br /&gt;
            self.get_property(&#039;window&#039;),&lt;br /&gt;
            x, y)&lt;br /&gt;
            &lt;br /&gt;
        ctx.paint()&lt;br /&gt;
        &lt;br /&gt;
        ctx.rectangle(x, y, w, h)&lt;br /&gt;
        ctx.set_source_rgb(0, 0, 0)&lt;br /&gt;
        ctx.fill()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;New Gst.TagList:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_AUDIO)&lt;br /&gt;
&lt;br /&gt;
        if self._audio_pixbuf:&lt;br /&gt;
            pixbuf_b64 = utils.getStringFromPixbuf(self._audio_pixbuf)&lt;br /&gt;
            taglist[gst.TAG_EXTENDED_COMMENT] = &amp;quot;coverart=&amp;quot; + pixbuf_b64&lt;br /&gt;
&lt;br /&gt;
        vorbis_enc = audioline.get_by_name(&#039;audioVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, gst.TAG_MERGE_REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_AUDIO)&lt;br /&gt;
        &lt;br /&gt;
        if self._audio_pixbuf:&lt;br /&gt;
            pixbuf_b64 = utils.getStringFromPixbuf(self._audio_pixbuf)&lt;br /&gt;
            &lt;br /&gt;
            taglist.add_value(&lt;br /&gt;
                Gst.TagMergeMode.REPLACE,&lt;br /&gt;
                Gst.TAG_EXTENDED_COMMENT,&lt;br /&gt;
                &amp;quot;coverart=&amp;quot; + pixbuf_b64)&lt;br /&gt;
                &lt;br /&gt;
        vorbis_enc = audioline.get_by_name(&#039;audioVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, Gst.TagMergeMode.REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_VIDEO)&lt;br /&gt;
        vorbis_enc = muxline.get_by_name(&#039;muxVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, gst.TAG_MERGE_REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_VIDEO)&lt;br /&gt;
        vorbis_enc = muxline.get_by_name(&#039;muxVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, Gst.TagMergeMode.REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def _get_tags(self, type):&lt;br /&gt;
        tl = gst.TagList()&lt;br /&gt;
        tl[gst.TAG_ARTIST] = self.model.get_nickname()&lt;br /&gt;
        tl[gst.TAG_COMMENT] = &amp;quot;olpc&amp;quot;&lt;br /&gt;
        #this is unfortunately, unreliable&lt;br /&gt;
        #record.Record.log.debug(&amp;quot;self.ca.metadata[&#039;title&#039;]-&amp;gt;&amp;quot; + str(self.ca.metadata[&#039;title&#039;]) )&lt;br /&gt;
        tl[gst.TAG_ALBUM] = &amp;quot;olpc&amp;quot; #self.ca.metadata[&#039;title&#039;]&lt;br /&gt;
        tl[gst.TAG_DATE] = utils.getDateString(int(time.time()))&lt;br /&gt;
        stringType = constants.MEDIA_INFO[type][&#039;istr&#039;]&lt;br /&gt;
        &lt;br /&gt;
        # Translators: photo by photographer, e.g. &amp;quot;Photo by Mary&amp;quot;&lt;br /&gt;
        tl[gst.TAG_TITLE] = _(&#039;%(type)s by %(name)s&#039;) % {&#039;type&#039;: stringType,&lt;br /&gt;
                &#039;name&#039;: self.model.get_nickname()}&lt;br /&gt;
        return tl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def _get_tags(self, type):&lt;br /&gt;
        &lt;br /&gt;
        taglist = Gst.TagList.new_empty()&lt;br /&gt;
        &lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_ARTIST,&lt;br /&gt;
            self.model.get_nickname())&lt;br /&gt;
            &lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_COMMENT,&lt;br /&gt;
            &amp;quot;olpc&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
        #this is unfortunately, unreliable&lt;br /&gt;
        #record.Record.log.debug(&amp;quot;self.ca.metadata[&#039;title&#039;]-&amp;gt;&amp;quot; + str(self.ca.metadata[&#039;title&#039;]) )&lt;br /&gt;
&lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_ALBUM,&lt;br /&gt;
            &amp;quot;olpc&amp;quot;) #self.ca.metadata[&#039;title&#039;]&lt;br /&gt;
&lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_DATE,&lt;br /&gt;
            utils.getDateString(int(time.time())))&lt;br /&gt;
            &lt;br /&gt;
        stringType = constants.MEDIA_INFO[type][&#039;istr&#039;] #self.ca.metadata[&#039;title&#039;]&lt;br /&gt;
            &lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_TITLE,&lt;br /&gt;
            _(&#039;%(type)s by %(name)s&#039;) % {&#039;type&#039;: stringType,&lt;br /&gt;
                &#039;name&#039;: self.model.get_nickname()})&lt;br /&gt;
                &lt;br /&gt;
        return taglist&lt;/div&gt;</summary>
		<author><name>Fdanesse</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting/Record&amp;diff=84991</id>
		<title>Features/GTK3/Porting/Record</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting/Record&amp;diff=84991"/>
		<updated>2012-12-19T14:26:04Z</updated>

		<summary type="html">&lt;p&gt;Fdanesse: /* Some changes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Some changes =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 def getStringFromPixbuf(pixbuf):&lt;br /&gt;
     data = [&amp;quot;&amp;quot;]&lt;br /&gt;
     pixbuf.save_to_callback(_saveDataToBufferCb, &amp;quot;png&amp;quot;, {}, data)&lt;br /&gt;
     return base64.b64encode(str(data[0]))&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 def _saveDataToBufferCb(buf, data):&lt;br /&gt;
     data[0] += buf&lt;br /&gt;
     return True&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;With:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 def getStringFromPixbuf(pixbuf):&lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;Converts a pixbuf in a string.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
     # Save_to_bufferv return: (bool, string)&lt;br /&gt;
     data = pixbuf.save_to_bufferv(&#039;png&#039;, [], [])&lt;br /&gt;
    &lt;br /&gt;
     return base64.b64encode(data[1])&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 thumbImg.save(thumbPath, &amp;quot;jpeg&amp;quot;, {&amp;quot;quality&amp;quot;:&amp;quot;85&amp;quot;} )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;With:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 thumbImg.savev(thumbPath, &amp;quot;jpeg&amp;quot;, {&amp;quot;quality&amp;quot;:&amp;quot;85&amp;quot;} )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 def load_colored_svg(filename, stroke, fill):&lt;br /&gt;
     path = os.path.join(constants.GFX_PATH, filename)&lt;br /&gt;
     data = open(path, &#039;r&#039;).read()&lt;br /&gt;
 &lt;br /&gt;
     entity = &#039;&amp;lt;!ENTITY fill_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % fill&lt;br /&gt;
     data = re.sub(&#039;&amp;lt;!ENTITY fill_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
 &lt;br /&gt;
     entity = &#039;&amp;lt;!ENTITY stroke_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % stroke&lt;br /&gt;
     data = re.sub(&#039;&amp;lt;!ENTITY stroke_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;return rsvg.Handle(data=data).get_pixbuf()&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;With:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 def load_colored_svg(filename, stroke, fill):&lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;Loads an svg, will change the fill and&lt;br /&gt;
     stroke colors and returns the pixbuf.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
     path = os.path.join(constants.GFX_PATH, filename)&lt;br /&gt;
     data = open(path, &#039;r&#039;).read()&lt;br /&gt;
 &lt;br /&gt;
     entity = &#039;&amp;lt;!ENTITY fill_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % fill&lt;br /&gt;
     data = re.sub(&#039;&amp;lt;!ENTITY fill_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
 &lt;br /&gt;
     entity = &#039;&amp;lt;!ENTITY stroke_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % stroke&lt;br /&gt;
     data = re.sub(&#039;&amp;lt;!ENTITY stroke_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
 &lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;return Rsvg.Handle.new_from_data(data.encode(&#039;utf-8&#039;)).get_pixbuf()&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Not implement:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 super(Record, self).close()&lt;br /&gt;
&lt;br /&gt;
Due to: [http://bugs.sugarlabs.org/ticket/4345 SL#4345]&lt;br /&gt;
&lt;br /&gt;
New Gst.TagList:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_AUDIO)&lt;br /&gt;
&lt;br /&gt;
        if self._audio_pixbuf:&lt;br /&gt;
            pixbuf_b64 = utils.getStringFromPixbuf(self._audio_pixbuf)&lt;br /&gt;
            taglist[gst.TAG_EXTENDED_COMMENT] = &amp;quot;coverart=&amp;quot; + pixbuf_b64&lt;br /&gt;
&lt;br /&gt;
        vorbis_enc = audioline.get_by_name(&#039;audioVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, gst.TAG_MERGE_REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;With:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_AUDIO)&lt;br /&gt;
        &lt;br /&gt;
        if self._audio_pixbuf:&lt;br /&gt;
            pixbuf_b64 = utils.getStringFromPixbuf(self._audio_pixbuf)&lt;br /&gt;
            &lt;br /&gt;
            taglist.add_value(&lt;br /&gt;
                Gst.TagMergeMode.REPLACE,&lt;br /&gt;
                Gst.TAG_EXTENDED_COMMENT,&lt;br /&gt;
                &amp;quot;coverart=&amp;quot; + pixbuf_b64)&lt;br /&gt;
                &lt;br /&gt;
        vorbis_enc = audioline.get_by_name(&#039;audioVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, Gst.TagMergeMode.REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_VIDEO)&lt;br /&gt;
        vorbis_enc = muxline.get_by_name(&#039;muxVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, gst.TAG_MERGE_REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;With:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        taglist = self._get_tags(constants.TYPE_VIDEO)&lt;br /&gt;
        vorbis_enc = muxline.get_by_name(&#039;muxVorbisenc&#039;)&lt;br /&gt;
        vorbis_enc.merge_tags(taglist, Gst.TagMergeMode.REPLACE_ALL)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def _get_tags(self, type):&lt;br /&gt;
        tl = gst.TagList()&lt;br /&gt;
        tl[gst.TAG_ARTIST] = self.model.get_nickname()&lt;br /&gt;
        tl[gst.TAG_COMMENT] = &amp;quot;olpc&amp;quot;&lt;br /&gt;
        #this is unfortunately, unreliable&lt;br /&gt;
        #record.Record.log.debug(&amp;quot;self.ca.metadata[&#039;title&#039;]-&amp;gt;&amp;quot; + str(self.ca.metadata[&#039;title&#039;]) )&lt;br /&gt;
        tl[gst.TAG_ALBUM] = &amp;quot;olpc&amp;quot; #self.ca.metadata[&#039;title&#039;]&lt;br /&gt;
        tl[gst.TAG_DATE] = utils.getDateString(int(time.time()))&lt;br /&gt;
        stringType = constants.MEDIA_INFO[type][&#039;istr&#039;]&lt;br /&gt;
        &lt;br /&gt;
        # Translators: photo by photographer, e.g. &amp;quot;Photo by Mary&amp;quot;&lt;br /&gt;
        tl[gst.TAG_TITLE] = _(&#039;%(type)s by %(name)s&#039;) % {&#039;type&#039;: stringType,&lt;br /&gt;
                &#039;name&#039;: self.model.get_nickname()}&lt;br /&gt;
        return tl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;With:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def _get_tags(self, type):&lt;br /&gt;
        &lt;br /&gt;
        taglist = Gst.TagList.new_empty()&lt;br /&gt;
        &lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_ARTIST,&lt;br /&gt;
            self.model.get_nickname())&lt;br /&gt;
            &lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_COMMENT,&lt;br /&gt;
            &amp;quot;olpc&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
        #this is unfortunately, unreliable&lt;br /&gt;
        #record.Record.log.debug(&amp;quot;self.ca.metadata[&#039;title&#039;]-&amp;gt;&amp;quot; + str(self.ca.metadata[&#039;title&#039;]) )&lt;br /&gt;
&lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_ALBUM,&lt;br /&gt;
            &amp;quot;olpc&amp;quot;) #self.ca.metadata[&#039;title&#039;]&lt;br /&gt;
&lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_DATE,&lt;br /&gt;
            utils.getDateString(int(time.time())))&lt;br /&gt;
            &lt;br /&gt;
        stringType = constants.MEDIA_INFO[type][&#039;istr&#039;] #self.ca.metadata[&#039;title&#039;]&lt;br /&gt;
            &lt;br /&gt;
        taglist.add_value(&lt;br /&gt;
            Gst.TagMergeMode.REPLACE,&lt;br /&gt;
            Gst.TAG_TITLE,&lt;br /&gt;
            _(&#039;%(type)s by %(name)s&#039;) % {&#039;type&#039;: stringType,&lt;br /&gt;
                &#039;name&#039;: self.model.get_nickname()})&lt;br /&gt;
                &lt;br /&gt;
        return taglist&lt;br /&gt;
&lt;br /&gt;
=From Pixmap to Pixbuf=&lt;br /&gt;
When an application fails and you want to close from the corresponding button occurs:&lt;br /&gt;
 Traceback (most recent call last):&lt;br /&gt;
 File &amp;quot;/usr/lib/python2.7/site-packages/sugar3/activity/activity.py&amp;quot;, line 890, in _keep_failed_dialog_response_cb&lt;br /&gt;
 self.close(skip_save=True)&lt;br /&gt;
 TypeError: close() got an unexpected keyword argument &#039;skip_save&#039;&lt;br /&gt;
 And the activity is not closed, nor can restart sugar as alert reappears again and again, you need to stop.&lt;br /&gt;
&lt;br /&gt;
==This error is caused because:==&lt;br /&gt;
When a class B inherits from class A, and&lt;br /&gt;
in B is overwritten a function of A,&lt;br /&gt;
A function is no longer running,&lt;br /&gt;
but instead runs the function of the class B,&lt;br /&gt;
even when explicitly call function A from B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The solution is in using Pixbuf instead of Pixmap:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def _generate_image(self, num):&lt;br /&gt;
        w = 55&lt;br /&gt;
        h = w&lt;br /&gt;
        pixmap = gdk.Pixmap(self.get_window(), w, h, -1)&lt;br /&gt;
        ctx = pixmap.cairo_create()&lt;br /&gt;
        ctx.rectangle(0, 0, w, h)&lt;br /&gt;
        ctx.set_source_rgb(0, 0, 0)&lt;br /&gt;
        ctx.fill()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
    def _generate_image(self, num):&lt;br /&gt;
 &lt;br /&gt;
        w = 55&lt;br /&gt;
        h = w&lt;br /&gt;
        &lt;br /&gt;
        x, y = self.get_property(&#039;window&#039;).get_position()&lt;br /&gt;
        rect = self.get_allocation()&lt;br /&gt;
        width, height = rect.width, rect.height&lt;br /&gt;
       &lt;br /&gt;
        thumb_surface = Gdk.Window.create_similar_surface(&lt;br /&gt;
            self.get_property(&#039;window&#039;),&lt;br /&gt;
            cairo.CONTENT_COLOR,&lt;br /&gt;
            width, height)&lt;br /&gt;
       &lt;br /&gt;
        ctx = cairo.Context(thumb_surface)&lt;br /&gt;
        &lt;br /&gt;
        Gdk.cairo_set_source_window(&lt;br /&gt;
            cairo_context,&lt;br /&gt;
            self.get_property(&#039;window&#039;),&lt;br /&gt;
            x, y)&lt;br /&gt;
            &lt;br /&gt;
        ctx.paint()&lt;br /&gt;
        &lt;br /&gt;
        ctx.rectangle(x, y, w, h)&lt;br /&gt;
        ctx.set_source_rgb(0, 0, 0)&lt;br /&gt;
        ctx.fill()&lt;/div&gt;</summary>
		<author><name>Fdanesse</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting/Record&amp;diff=84986</id>
		<title>Features/GTK3/Porting/Record</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting/Record&amp;diff=84986"/>
		<updated>2012-12-19T01:09:29Z</updated>

		<summary type="html">&lt;p&gt;Fdanesse: Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;Replace:&amp;#039;&amp;#039;&amp;#039;  def getStringFromPixbuf(pixbuf):     data = [&amp;quot;&amp;quot;]     pixbuf.save_to_callback(_saveDataToBufferCb, &amp;quot;png&amp;quot;, {}, data)     return base64.b64encode(str(data[0]))   ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def getStringFromPixbuf(pixbuf):&lt;br /&gt;
    data = [&amp;quot;&amp;quot;]&lt;br /&gt;
    pixbuf.save_to_callback(_saveDataToBufferCb, &amp;quot;png&amp;quot;, {}, data)&lt;br /&gt;
    return base64.b64encode(str(data[0]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _saveDataToBufferCb(buf, data):&lt;br /&gt;
    data[0] += buf&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def getStringFromPixbuf(pixbuf):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Converts a pixbuf in a string.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    # Save_to_bufferv return: (bool, string)&lt;br /&gt;
    data = pixbuf.save_to_bufferv(&#039;png&#039;, [], [])&lt;br /&gt;
    &lt;br /&gt;
    return base64.b64encode(data[1])&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
thumbImg.save(thumbPath, &amp;quot;jpeg&amp;quot;, {&amp;quot;quality&amp;quot;:&amp;quot;85&amp;quot;} )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
thumbImg.savev(thumbPath, &amp;quot;jpeg&amp;quot;, {&amp;quot;quality&amp;quot;:&amp;quot;85&amp;quot;} )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def load_colored_svg(filename, stroke, fill):&lt;br /&gt;
    path = os.path.join(constants.GFX_PATH, filename)&lt;br /&gt;
    data = open(path, &#039;r&#039;).read()&lt;br /&gt;
&lt;br /&gt;
    entity = &#039;&amp;lt;!ENTITY fill_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % fill&lt;br /&gt;
    data = re.sub(&#039;&amp;lt;!ENTITY fill_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
&lt;br /&gt;
    entity = &#039;&amp;lt;!ENTITY stroke_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % stroke&lt;br /&gt;
    data = re.sub(&#039;&amp;lt;!ENTITY stroke_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
&lt;br /&gt;
    &#039;&#039;&#039;return rsvg.Handle(data=data).get_pixbuf()&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
def load_colored_svg(filename, stroke, fill):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Loads an svg, will change the fill and&lt;br /&gt;
    stroke colors and returns the pixbuf.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    path = os.path.join(constants.GFX_PATH, filename)&lt;br /&gt;
    data = open(path, &#039;r&#039;).read()&lt;br /&gt;
&lt;br /&gt;
    entity = &#039;&amp;lt;!ENTITY fill_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % fill&lt;br /&gt;
    data = re.sub(&#039;&amp;lt;!ENTITY fill_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
&lt;br /&gt;
    entity = &#039;&amp;lt;!ENTITY stroke_color &amp;quot;%s&amp;quot;&amp;gt;&#039; % stroke&lt;br /&gt;
    data = re.sub(&#039;&amp;lt;!ENTITY stroke_color .*&amp;gt;&#039;, entity, data)&lt;br /&gt;
&lt;br /&gt;
    &#039;&#039;&#039;return Rsvg.Handle.new_from_data(data.encode(&#039;utf-8&#039;)).get_pixbuf()&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Not implement:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
super(Record, self).close()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Due to:&#039;&#039;&#039; [http://bugs.sugarlabs.org/ticket/4345]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When an application fails and you want to close from the corresponding button occurs:&#039;&#039;&#039;&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
File &amp;quot;/usr/lib/python2.7/site-packages/sugar3/activity/activity.py&amp;quot;, line 890, in _keep_failed_dialog_response_cb&lt;br /&gt;
self.close(skip_save=True)&lt;br /&gt;
TypeError: close() got an unexpected keyword argument &#039;skip_save&#039;&lt;br /&gt;
And the activity is not closed, nor can restart sugar as alert reappears again and again, you need to stop.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This error is caused by the following:&#039;&#039;&#039;&lt;br /&gt;
When a class B inherits from class A, and&lt;br /&gt;
in B is overwritten a function of A,&lt;br /&gt;
A function is no longer running,&lt;br /&gt;
but instead runs the function of the class B,&lt;br /&gt;
even when explicitly call function A from B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stop using Pixmap instead use Pixbuf:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Replace:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    def _generate_image(self, num):&lt;br /&gt;
        w = 55&lt;br /&gt;
        h = w&lt;br /&gt;
        pixmap = gdk.Pixmap(self.get_window(), w, h, -1)&lt;br /&gt;
        ctx = pixmap.cairo_create()&lt;br /&gt;
        ctx.rectangle(0, 0, w, h)&lt;br /&gt;
        ctx.set_source_rgb(0, 0, 0)&lt;br /&gt;
        ctx.fill()&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;By:&#039;&#039;&#039;&lt;br /&gt;
    def _generate_image(self, num):&lt;br /&gt;
&lt;br /&gt;
        w = 55&lt;br /&gt;
        h = w&lt;br /&gt;
        &lt;br /&gt;
        x, y = self.get_property(&#039;window&#039;).get_position()&lt;br /&gt;
        rect = self.get_allocation()&lt;br /&gt;
        width, height = rect.width, rect.height&lt;br /&gt;
       &lt;br /&gt;
        thumb_surface = Gdk.Window.create_similar_surface(&lt;br /&gt;
            self.get_property(&#039;window&#039;),&lt;br /&gt;
            cairo.CONTENT_COLOR,&lt;br /&gt;
            width, height)&lt;br /&gt;
       &lt;br /&gt;
        ctx = cairo.Context(thumb_surface)&lt;br /&gt;
        &lt;br /&gt;
        Gdk.cairo_set_source_window(&lt;br /&gt;
            cairo_context,&lt;br /&gt;
            self.get_property(&#039;window&#039;),&lt;br /&gt;
            x, y)&lt;br /&gt;
            &lt;br /&gt;
        ctx.paint()&lt;br /&gt;
        &lt;br /&gt;
        ctx.rectangle(x, y, w, h)&lt;br /&gt;
        ctx.set_source_rgb(0, 0, 0)&lt;br /&gt;
        ctx.fill()&lt;/div&gt;</summary>
		<author><name>Fdanesse</name></author>
	</entry>
</feed>