<?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=Pro-panda</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=Pro-panda"/>
	<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/go/Special:Contributions/Pro-panda"/>
	<updated>2026-04-28T17:18:38Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Gsoc-2018-cross-version-python-support&amp;diff=103789</id>
		<title>Gsoc-2018-cross-version-python-support</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Gsoc-2018-cross-version-python-support&amp;diff=103789"/>
		<updated>2020-10-30T21:31:38Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Pro-panda moved page Gsoc-2018-cross-version-python-support to User:Pro-panda:gsoc-project&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[User:Pro-panda:gsoc-project]]&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=User:Pro-panda:gsoc-project&amp;diff=103788</id>
		<title>User:Pro-panda:gsoc-project</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=User:Pro-panda:gsoc-project&amp;diff=103788"/>
		<updated>2020-10-30T21:31:38Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Pro-panda moved page Gsoc-2018-cross-version-python-support to User:Pro-panda:gsoc-project&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=User:Pro-panda:gsoc-project&amp;diff=103787</id>
		<title>User:Pro-panda:gsoc-project</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=User:Pro-panda:gsoc-project&amp;diff=103787"/>
		<updated>2020-10-30T21:30:56Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=User:Pro-panda/GSoC_2018_Project&amp;diff=103786</id>
		<title>User:Pro-panda/GSoC 2018 Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=User:Pro-panda/GSoC_2018_Project&amp;diff=103786"/>
		<updated>2020-10-30T21:28:57Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Pro-panda moved page User:Pro-panda/GSoC 2018 Project to Gsoc-2018-cross-version-python-support&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Gsoc-2018-cross-version-python-support]]&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=User:Pro-panda:gsoc-project&amp;diff=103785</id>
		<title>User:Pro-panda:gsoc-project</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=User:Pro-panda:gsoc-project&amp;diff=103785"/>
		<updated>2020-10-30T21:28:57Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Pro-panda moved page User:Pro-panda/GSoC 2018 Project to Gsoc-2018-cross-version-python-support&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Project details ===&lt;br /&gt;
Implement Cross Version Python Support for Sugar&lt;br /&gt;
Project summary and progress can be seen https://wiki.sugarlabs.org/go/Python_2to3&lt;br /&gt;
&lt;br /&gt;
=== Work Completed ===&lt;br /&gt;
Pro-Panda&#039;s overall code contribution can be found [https://github.com/search?l=&amp;amp;o=desc&amp;amp;q=org%3Asugarlabs++author%3APro-Panda&amp;amp;s=&amp;amp;type=Issues here].&lt;br /&gt;
&lt;br /&gt;
==== Summary of my work GSoC work: ====&lt;br /&gt;
* Port Sugar Artwork to Python 3&lt;br /&gt;
* Port Sugar Toolkit to six&lt;br /&gt;
* Port Sugar Datastore to Python 3&lt;br /&gt;
* Port Sugar to Python 3 [WIP to some extent]&lt;br /&gt;
* Make Debian Packages for the core components&lt;br /&gt;
* Port 20 activities to Python 3, complete almost the entire fructose set&lt;br /&gt;
* Port Telepathy Bindings for 9 activities&lt;br /&gt;
* Port smaller components like sugargame, sugar-iconify, etc&lt;br /&gt;
* Make corresponding relevant changes in the documentation&lt;br /&gt;
* Working on general issues of improving activities or the core modules; outside of the GSoC Project&lt;br /&gt;
* Reviewing, Testing and merging Pull requests; outside of the GSoC Project&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=User:Pro-panda:gsoc-project&amp;diff=103774</id>
		<title>User:Pro-panda:gsoc-project</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=User:Pro-panda:gsoc-project&amp;diff=103774"/>
		<updated>2020-10-27T17:00:15Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Project details ===&lt;br /&gt;
Implement Cross Version Python Support for Sugar&lt;br /&gt;
Project summary and progress can be seen https://wiki.sugarlabs.org/go/Python_2to3&lt;br /&gt;
&lt;br /&gt;
=== Work Completed ===&lt;br /&gt;
Pro-Panda&#039;s overall code contribution can be found [https://github.com/search?l=&amp;amp;o=desc&amp;amp;q=org%3Asugarlabs++author%3APro-Panda&amp;amp;s=&amp;amp;type=Issues here].&lt;br /&gt;
&lt;br /&gt;
==== Summary of my work GSoC work: ====&lt;br /&gt;
* Port Sugar Artwork to Python 3&lt;br /&gt;
* Port Sugar Toolkit to six&lt;br /&gt;
* Port Sugar Datastore to Python 3&lt;br /&gt;
* Port Sugar to Python 3 [WIP to some extent]&lt;br /&gt;
* Make Debian Packages for the core components&lt;br /&gt;
* Port 20 activities to Python 3, complete almost the entire fructose set&lt;br /&gt;
* Port Telepathy Bindings for 9 activities&lt;br /&gt;
* Port smaller components like sugargame, sugar-iconify, etc&lt;br /&gt;
* Make corresponding relevant changes in the documentation&lt;br /&gt;
* Working on general issues of improving activities or the core modules; outside of the GSoC Project&lt;br /&gt;
* Reviewing, Testing and merging Pull requests; outside of the GSoC Project&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=User:Pro-panda&amp;diff=103773</id>
		<title>User:Pro-panda</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=User:Pro-panda&amp;diff=103773"/>
		<updated>2020-10-27T16:58:53Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2019-2021-candidates/Rahul_Bothra&amp;diff=103560</id>
		<title>Oversight Board/2019-2021-candidates/Rahul Bothra</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2019-2021-candidates/Rahul_Bothra&amp;diff=103560"/>
		<updated>2020-01-05T11:44:32Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Rahul Bothra =&lt;br /&gt;
&lt;br /&gt;
== Bio ==&lt;br /&gt;
I work as a full time Software Engineer, working on products enabling enterprise cloud services. I try to volunteer my time for Sugar Labs, although I haven&#039;t been much active recently. I originally started working with Sugar Labs as a Student Developer with the GSoC program.&lt;br /&gt;
&lt;br /&gt;
; Motivation&lt;br /&gt;
I perceive Sugar Labs&#039; mission as part of a larger cause I&#039;m inclined towards - to make learning tools more accessible to everyone. I&#039;m happy that the tools we build serve this purpose, although our recent work on Sugar is not improving lives, if at all reaching its users.&lt;br /&gt;
&lt;br /&gt;
; Code&lt;br /&gt;
https://github.com/search?q=org%3Asugarlabs+author%3Apro-panda&lt;br /&gt;
&lt;br /&gt;
== Goals ==&lt;br /&gt;
The goals are borrowed and edited from what James Cameron suggested in his agenda for SLOB elections in 2018. I intend to abide by these, &lt;br /&gt;
* we will continue to maintain Sugar and the activities,&lt;br /&gt;
* we will forego or remove any unused mailing lists, committees, boards or offices, in order to improve our collaboration,&lt;br /&gt;
* we will reduce the resources spent on other software such as web site, social media, or infrastructure for developers, as these are either mostly static or provided for free by others,&lt;br /&gt;
* we will require new members to have made a non-trivial and accepted contribution to the Software,&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Email: rrbothra [at] gmail [dot] com&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2019-2021-candidates/Rahul_Bothra&amp;diff=103552</id>
		<title>Oversight Board/2019-2021-candidates/Rahul Bothra</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2019-2021-candidates/Rahul_Bothra&amp;diff=103552"/>
		<updated>2020-01-04T14:15:37Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Rahul Bothra =&lt;br /&gt;
&lt;br /&gt;
== Bio ==&lt;br /&gt;
I work as a full time Software Engineer, working on products enabling enterprise cloud services. I try to volunteer my time for Sugar Labs, although I haven&#039;t been much active recently. I originally started working with Sugar Labs as a Student Developer with the GSoC program.&lt;br /&gt;
&lt;br /&gt;
; Motivation&lt;br /&gt;
I perceive Sugar Labs&#039; mission as part of a larger cause I&#039;m inclined towards - to make learning tools more accessible to everyone. I&#039;m happy that the tools we build serve this purpose, although our recent work on Sugar is not improving lives, if at all reaching its users.&lt;br /&gt;
&lt;br /&gt;
; Code&lt;br /&gt;
https://github.com/search?q=org%3Asugarlabs+author%3Apro-panda&lt;br /&gt;
&lt;br /&gt;
== Goals ==&lt;br /&gt;
The goals are borrowed and edited from what James Cameron suggested in his agenda for SLOB elections in 2018. I intend abide by these, &lt;br /&gt;
* we will continue to maintain Sugar and the activities,&lt;br /&gt;
* we will forego or remove any unused mailing lists, committees, boards or offices, in order to improve our collaboration,&lt;br /&gt;
* we will reduce the resources spent on other software such as web site, social media, or infrastructure for developers, as these are either mostly static or provided for free by others,&lt;br /&gt;
* we will require new members to have made a non-trivial and accepted contribution to the Software,&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Email: rrbothra [at] gmail [dot] com&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2019-2021-candidates/Rahul_Bothra&amp;diff=103550</id>
		<title>Oversight Board/2019-2021-candidates/Rahul Bothra</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2019-2021-candidates/Rahul_Bothra&amp;diff=103550"/>
		<updated>2020-01-04T11:25:05Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Created page with &amp;quot;= Rahul Bothra =  == Bio == I work as a full time Software Engineer, working on products enabling enterprise cloud services. I try to volunteer my time for Sugar Labs, althoug...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Rahul Bothra =&lt;br /&gt;
&lt;br /&gt;
== Bio ==&lt;br /&gt;
I work as a full time Software Engineer, working on products enabling enterprise cloud services. I try to volunteer my time for Sugar Labs, although I haven&#039;t been much active recently. I originally started working with Sugar Labs as a Student Developer with the GSoC program in 2018. I was a mentor in GSoC and GCI 2018. I also acted as a liason to Google for GSoC 2018 with Walter Bender and James Cameron.&lt;br /&gt;
&lt;br /&gt;
; Motivation&lt;br /&gt;
I perceive Sugar Labs&#039; mission as part of a larger cause I&#039;m inclined towards - to make learning tools more accessible to everyone. I&#039;m happy that the tools we build serve this purpose, although our recent work on Sugar is not reaching improving lives, if at all reaching users.&lt;br /&gt;
&lt;br /&gt;
; Code&lt;br /&gt;
https://github.com/search?q=org%3Asugarlabs+author%3Apro-panda&lt;br /&gt;
&lt;br /&gt;
== Goals ==&lt;br /&gt;
The goals are borrowed and edited from what James Cameron suggested in his agenda for SLOB elections in 2018. I intend abide by these, &lt;br /&gt;
* we will continue to maintain Sugar and the activities,&lt;br /&gt;
* we will forego or remove any unused mailing lists, committees, boards or offices, in order to improve our collaboration,&lt;br /&gt;
* we will reduce the resources spent on other software such as web site, social media, or infrastructure for developers, as these are either mostly static or provided for free by others,&lt;br /&gt;
* we will require new members to have made a non-trivial and accepted contribution to the Software,&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Email: rrbothra [at] gmail [dot] com&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Vacancies&amp;diff=102728</id>
		<title>Vacancies</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Vacancies&amp;diff=102728"/>
		<updated>2019-03-18T14:36:13Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Sugar_Labs/Getting_Involved&amp;diff=102727</id>
		<title>Sugar Labs/Getting Involved</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Sugar_Labs/Getting_Involved&amp;diff=102727"/>
		<updated>2019-03-18T14:20:24Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: /* Join Sugar Labs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Translations | [[Sugar_Labs/Getting_Involved|english]] &amp;amp;#124; [[Sugar_Labs/Getting_Involved/lang-es|español]]}}{{TeamHeader|Sugar Labs|home=Community Home|meeting_link=Events|meeting_label=Events Calendar}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
&#039;&#039;&#039;We need your help in improving how computers are used in education&#039;&#039;&#039;. &#039;&#039;You&#039;&#039; can take an active hand in making Sugar realize its [[Archive/Current_Events/2009-03-17#What_are_our_objectives.3F | &#039;&#039;&#039;vision&#039;&#039;&#039;]]. Making [[What is Sugar?|&#039;&#039;&#039;Sugar&#039;&#039;&#039;]] depends on volunteers who love to engage in authentic activities&amp;amp;mdash;activities that help fulfill the potentials they individually see in Sugar&#039;s vision. What do you want to see happen? What roles could you fill? Click the role of your choice in the grid below, and then, after selecting a Team or project link, follow the &#039;&#039;&#039;Join&#039;&#039;&#039; links at the top of the Team or project page (in the green or yellow linkbar) to learn how you can &#039;&#039;&#039;Join In&#039;&#039;&#039;.  We depend on &#039;&#039;you&#039;&#039; getting involved!&lt;br /&gt;
Apply for membership [[Sugar_Labs/Members|here]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;noborder&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; width=100% style=&amp;quot;background:#eeeeff;border:5px solid white;text-align:center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;TOP&amp;quot; width=33% style=&amp;quot;border:5px solid white;&amp;quot;|&amp;lt;span class=&amp;quot;linkgroup&amp;quot;&amp;gt;[[File:Join_Educator.png|link=#Educator]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[#Educator | Educator]]&lt;br /&gt;
&lt;br /&gt;
|valign=&amp;quot;TOP&amp;quot; width=33% style=&amp;quot;border:5px solid white;&amp;quot; |&amp;lt;span class=&amp;quot;linkgroup&amp;quot;&amp;gt;[[File:Join_ContentDeveloper.png|link=#Content Writer]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[#Content_Writer | Content Writer]]&lt;br /&gt;
&lt;br /&gt;
|valign=&amp;quot;TOP&amp;quot; width=33% style=&amp;quot;border:5px solid white;&amp;quot;|&amp;lt;span class=&amp;quot;linkgroup&amp;quot;&amp;gt;[[File:Join_PeoplePerson.png|link=#People Person]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[#People_Person | People Person]]&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;TOP&amp;quot; width=33% style=&amp;quot;border:5px solid white;&amp;quot;|&amp;lt;span class=&amp;quot;linkgroup&amp;quot;&amp;gt;[[File:Join_Developer.png|link=#Developer]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[#Developer | Developer]]&lt;br /&gt;
&lt;br /&gt;
|valign=&amp;quot;TOP&amp;quot; width=33% style=&amp;quot;border:5px solid white;&amp;quot;|&amp;lt;span class=&amp;quot;linkgroup&amp;quot;&amp;gt;[[File:Join_Designer.png|link=#Designer]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[#Designer | Designer]]&lt;br /&gt;
&lt;br /&gt;
|valign=&amp;quot;TOP&amp;quot; width=33% style=&amp;quot;border:5px solid white;&amp;quot;|&amp;lt;span class=&amp;quot;linkgroup&amp;quot;&amp;gt;[[File:Join_Translator.png|link=#Translator]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[#Translator | Translator]]&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;TOP&amp;quot; colspan=&amp;quot;3&amp;quot; style=&amp;quot;border:5px solid white;&amp;quot;|&lt;br /&gt;
&#039;&#039;&#039;[[What could I do in an hour?]]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;TOP&amp;quot; colspan=&amp;quot;3&amp;quot; style=&amp;quot;border:5px solid white;&amp;quot;| &lt;br /&gt;
Financial contributions are discussed on the [[Sugar Labs/Donate]] page.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Learn more====&lt;br /&gt;
&lt;br /&gt;
Help us understand and improve the ability for people to contribute and become deeply involved with Sugar. &lt;br /&gt;
{{Iframe|See [http://planet.sugarlabs.org Planet Sugar Labs], our blog aggregator |http://planet.sugarlabs.org|900|600|1}}&lt;br /&gt;
* Sugar Labs [[Sugar Labs/Communication channels|Communication channels]], [[:Category:Participate |Participation pages]], [[Sugar Labs/Volunteer Funnel|Volunteer Funnel]], &amp;amp; [[Vacancies]],&lt;br /&gt;
* The One Laptop per Child [[olpc:Participate | Participation page]].&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color:#a0ff93; border:1px solid #cdf; padding:6px 14px;&amp;quot;&amp;gt;&lt;br /&gt;
The Sugar community is made of individuals, teams, and relationships.&lt;br /&gt;
&lt;br /&gt;
We all share one thing in common: &#039;&#039;&#039;We want to improve how computers are used in education&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Join us in discussing the project on the [http://lists.sugarlabs.org/listinfo/iaep  It&#039;s an Education Project] mailing list. [http://wiki.sugarlabs.org/index.php?title=Special:OpenIDLogin&amp;amp;returnto=Special:UserLogin Open a wiki account here] and edit this site.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Anchor | Educator}}&lt;br /&gt;
&lt;br /&gt;
== Educator ==&lt;br /&gt;
[[Image:Join_Educator_BW.png|link=]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description of this role:&#039;&#039;&#039; Focus on Sugar&#039;s learners educational needs.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Skills you possess or want to learn&#039;&#039;&#039;:&lt;br /&gt;
* Explaining complex ideas well, people skills, teaching through digital media, understanding of educational theories and obstacles, paedagogy, ability to communicate with and influence developers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teams/projects associated with this role&#039;&#039;&#039;:&lt;br /&gt;
* | [[Education Team]] | [[Activity Team]] | [[Deployment Team]] | [[Local Labs]] |&lt;br /&gt;
* | [[Math4Team]] | [[Sugar on a Stick]] | [[Replacing Textbooks]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tasks typical in this role&#039;&#039;&#039;:&lt;br /&gt;
* Tasks typical in this role: Lesson plans, teacher guides, text book templates/samples, articles, leverage Sugar as an ideal platform for learning, provide guidance and feedback to those working on technical aspects of Sugar, setting educational goals, educational activities.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Real person to help you get started&#039;&#039;&#039;:&lt;br /&gt;
* If you are an educator who would like to help with Sugar, please subscribe and contact [http://lists.sugarlabs.org/listinfo/iaep iaep] at sugarlabs dot org. iaep it&#039;s an acronym of &amp;quot;It&#039;s an Education Project&amp;quot; and it is the main emails list supported by Sugar labs Systems team. IAEP helps Educators, learners, designers and programmers interact while learning the how to&#039;s to develop and sharing of their projects.  &lt;br /&gt;
&lt;br /&gt;
{{Anchor|ContentWriter}}&lt;br /&gt;
&lt;br /&gt;
== Content Writer ==&lt;br /&gt;
[[Image:Join_ContentDeveloper_BW.png|link=]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description of this role:&#039;&#039;&#039; Communicate through words.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Skills you possess or want to learn&#039;&#039;&#039;:&lt;br /&gt;
* Writing, editing, grammar, wordsmithing, proof-reading, explaining complex ideas well, teaching, wiki markup, technical knowledge (specific and general).&lt;br /&gt;
&#039;&#039;&#039;Teams associated with this role&#039;&#039;&#039;:&lt;br /&gt;
* | [[Documentation Team]] | [[Marketing Team]] | [[Wiki Team]] | [[Deployment Team]] | [[Local Labs]] |&lt;br /&gt;
* | [[Math4Team]] | [[Replacing Textbooks]]&lt;br /&gt;
&#039;&#039;&#039;Tasks typical in this role&#039;&#039;&#039;:&lt;br /&gt;
* Write, edit, illustrate, or program an Open Education Resource on any subject for any age in the Sugar Labs [[Replace Textbooks]] project.&lt;br /&gt;
* Write a [http://booki.flossmanuals.net FLOSS Manual] for your favorite activity, guides, how-tos, FAQs, knowledge base, lesson plans, teacher guides, text book templates/samples, articles, marketing material, process/methodology documents, editing, release notes.&lt;br /&gt;
&#039;&#039;&#039;Real person to help you get started&#039;&#039;&#039;:&lt;br /&gt;
* If you are a content writer please subscribe and contact [http://lists.sugarlabs.org/listinfo/iaep iaep] at sugarlabs dot org. iaep it&#039;s an acronym of &amp;quot;It&#039;s an Education Project&amp;quot; and it is the main emails list supported by Sugar labs Systems team. IAEP helps Educators, learners, designers and programmers interact while learning the how to&#039;s to develop and sharing of their projects.&lt;br /&gt;
&lt;br /&gt;
{{Anchor|PeoplePerson}}&lt;br /&gt;
&lt;br /&gt;
== People Person ==&lt;br /&gt;
[[Image:Join_PeoplePerson_BW.png|link=]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description of this role:&#039;&#039;&#039; Communicate through one-on-one contact.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Skills you possess or want to learn&#039;&#039;&#039;:&lt;br /&gt;
* People skills, public relations, event organization, customer service/support, enthusiasm.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teams/projects associated with this role&#039;&#039;&#039;:&lt;br /&gt;
* | [[Marketing Team]] | [[Documentation Team]] | [[Deployment Team]] | [[Local Labs]] |&lt;br /&gt;
* | [[Sugar on a Stick]] |&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tasks typical in this role&#039;&#039;&#039;:&lt;br /&gt;
* Conferences, press releases, local events, organizing events, community management, Sugar Labs forum/IRC help/support tech, send out media/spread Sugar, encourage others to participate, cat herding.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Real person to help you get started&#039;&#039;&#039;:&lt;br /&gt;
* If you are a people person who would like to help with Sugar Labs Project Management, please contact slobs at sugarlabs dot org.&lt;br /&gt;
&lt;br /&gt;
{{Anchor|Developer}}&lt;br /&gt;
&lt;br /&gt;
== Developer ==&lt;br /&gt;
[[Image:Join_Developer_BW.png|link=]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description of this role:&#039;&#039;&#039; Communicate through code.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Skills you possess or want to learn&#039;&#039;&#039;:&lt;br /&gt;
* Python, C, GTK+, git, packaging, bug filing, tracking and testing, JavaScript, web app development, GNU/Linux system administration&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teams/projects associated with this role&#039;&#039;&#039;:&lt;br /&gt;
* See https://github.com/sugarlabs/sugar-docs for the most current information.&lt;br /&gt;
* | [[Development Team]] | [[Activity Team]] | [[Platform Team]] | [[BugSquad|Testing Team]] | [[Infrastructure Team]] |&lt;br /&gt;
* | [[Summer of Code | Google Summer of Code]] | [[Math4Team]] | [[Development Team/Project Ideas | Project Ideas]] | [[Sugar on a Stick]] |&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tasks typical in this role&#039;&#039;&#039;:&lt;br /&gt;
* Get the source code, test &amp;amp; break Sugar, design &amp;amp; build Sugar, file bugs, fix bugs, build packages, develop new features, test, design, develop &amp;amp; help maintain activities, toolchain, scripts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Real people to help you get started&#039;&#039;&#039;:&lt;br /&gt;
* [[Mentors]]&lt;br /&gt;
* If you are a developer who would like to help with Sugar, please introduce yourself at the [http://lists.sugarlabs.org/listinfo/sugar-devel sugar devel mailing list] &lt;br /&gt;
&lt;br /&gt;
{{Anchor|Designer}}&lt;br /&gt;
&lt;br /&gt;
== Designer ==&lt;br /&gt;
[[Image:Join_Designer_BW.png|link=]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description of this role:&#039;&#039;&#039; Communicate through images.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Skills you possess or want to learn&#039;&#039;&#039;:&lt;br /&gt;
* Inkscape, GIMP, other vector &amp;amp; raster graphics tools, OpenOffice, design, usability/interaction.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teams/projects associated with this role&#039;&#039;&#039;:&lt;br /&gt;
* | [[Design Team|Design Team]] | [[Marketing Team]] | [[Documentation Team]] |&lt;br /&gt;
* | [[Math4Team]] |&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Tasks typical in this role&#039;&#039;&#039;:&lt;br /&gt;
* Sugar art work (SVG activity icons, toolbar icons), Activity image content, user interface design, publication design, web design, icons, design mock-ups, conference banners/flyers, logos, materials (t-shirts, CD covers, etc.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Real person to help you get started&#039;&#039;&#039;:&lt;br /&gt;
* If you are a designer who would like to help with Sugar, please subscribe and contact [http://lists.sugarlabs.org/listinfo/iaep iaep] at sugarlabs dot org. iaep it&#039;s an acronym of &amp;quot;It&#039;s an Education Project&amp;quot; and it is the main emails list supported by Sugar labs Systems team. IAEP helps Educators, learners, designers and programmers interact while learning the how to&#039;s to develop and sharing of their projects.&lt;br /&gt;
&lt;br /&gt;
== Translator ==&lt;br /&gt;
[[Image:Join_Translator_BW.png|link=]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description of this role:&#039;&#039;&#039; Communicate through interpretation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Skills you possess or want to learn&#039;&#039;&#039;:&lt;br /&gt;
* English, Non-English native language, technical knowledge, Pootle, PO, translation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teams/projects associated with this role&#039;&#039;&#039;:&lt;br /&gt;
* | [[Translation Team]] | [[Documentation Team]] | [[Wiki Team | Wiki Team]] | [[Local Labs]] | [[Replacing Textbooks]]&lt;br /&gt;
&#039;&#039;&#039;Tasks typical in this role&#039;&#039;&#039;:&lt;br /&gt;
* Activity and Sugar user interface string translation, localization (l10n), internationalization (i18n), marketing materials, documents, OERs, websites, providing cultural specific feedback to other teams.&lt;br /&gt;
* &#039;&#039;&#039;Real person to help you get started&#039;&#039;&#039;:  If you are a translator who would like to help with translating Sugar, please contact translate at sugarlabs dot org.&lt;br /&gt;
&lt;br /&gt;
[[Category:Participate]]&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Outreachy&amp;diff=102726</id>
		<title>Outreachy</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Outreachy&amp;diff=102726"/>
		<updated>2019-03-17T17:47:17Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Replaced content with &amp;quot;Sugar Labs is currently not participating in the Outreachy Programme&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sugar Labs is currently not participating in the Outreachy Programme&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Outreachy&amp;diff=102623</id>
		<title>Outreachy</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Outreachy&amp;diff=102623"/>
		<updated>2019-01-04T09:50:37Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Remove GSoC 2017 details from outreachy page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains information specific to the May 30 to August 30, 2017 round of [https://www.gnome.org/outreachy/ Outreachy] internships.&lt;br /&gt;
&lt;br /&gt;
== About Sugar Labs ==&lt;br /&gt;
&lt;br /&gt;
At Sugar Labs, we make tools that learners use to explore, discover, create, and reflect. We encourage our users to appropriate them, taking ownership and responsibility for their learning.&lt;br /&gt;
&lt;br /&gt;
Sugar Labs, a volunteer-driven, non-profit organization, had its origins in the One Laptop Per Child project and is has been a member project of the Software Freedom Conservancy since 2008.&lt;br /&gt;
&lt;br /&gt;
Sugar is both a desktop and a collection of Activities. Activities, as the name implies, are Apps that involve active engagement from the learner. Activities automatically save results to a journal, where reflections are recorded. Activity instances can be shared between learners; many support real-time collaboration.&lt;br /&gt;
&lt;br /&gt;
* Sugar facilitates sharing and collaboration: Children can write, share books, or make music together with a single mouse-click.&lt;br /&gt;
* Activities, not applications: Sugar activities are applicable beyond the scope of the classroom and even Sugar itself.&lt;br /&gt;
* Automatic backup of Activity work; no worrying about files or folders. Sugar’s Journal makes it almost impossible to lose any data.&lt;br /&gt;
* The Sugar Journal records everything you do: It is a place to reflect upon and evaluate your work.&lt;br /&gt;
* Sugar runs on most computer hardware, including slower machines.&lt;br /&gt;
* Sugar is Free (Libre) Software: It is written in the Python language and easily customized.&lt;br /&gt;
* Sugar is documented by its users: It is easy to use and teachers worldwide have created a wealth of pedagogical materials for it.&lt;br /&gt;
* Sugar is largely written and maintained by its users.&lt;br /&gt;
* Sugarizer is a fork of Sugar available for tablets and phones.&lt;br /&gt;
&lt;br /&gt;
Our primary FOSS License is GNU General Public License version 3.0 (GPL-3.0).&lt;br /&gt;
&lt;br /&gt;
=== About Our Community ===&lt;br /&gt;
&lt;br /&gt;
As mentioned above, our community is composed 100% by volunteers. May (most) of are contributors are youth who use (of have used) Sugar in school. We have participated in Google Code-in and Google Summer of Code for many years, which have also been a source of contributions to the project.&lt;br /&gt;
&lt;br /&gt;
Our community members span the globe&amp;amp;mdash;and while we have never had a commit from Antarctica, Sugar has been used on every continent. Contributors bring many skills: Python and JavaScript programming; graphic design; marketing and communication; documentation; user-interface design; game design; pedagogy; research into best practices; and, perhaps most important, using Sugar as a tool for learning.&lt;br /&gt;
&lt;br /&gt;
Our mentors are:&lt;br /&gt;
&lt;br /&gt;
* walter AT sugarlabs DOT com&lt;br /&gt;
* devin AT devinulibarri DOT com&lt;br /&gt;
&lt;br /&gt;
=== Getting Started ===&lt;br /&gt;
&lt;br /&gt;
These days there are a number of different paths to getting started with Sugar. You can:&lt;br /&gt;
* follow the instructions for setting up our developer environment [https://developer.sugarlabs.org/];&lt;br /&gt;
* try Sugarizer [http://sugarizer.org/]; or&lt;br /&gt;
* explore some of our stand-alone activities such as Music Blocks [http://walterbender.github.io/musicblocks/].&lt;br /&gt;
&lt;br /&gt;
We have lots of open issues in our various GitHub repositories: [https://github.com/sugarlabs] and [https://github.com/walterbender/musicblocks], some of which involve some coding, but many of which involve testing and documentation.&lt;br /&gt;
&lt;br /&gt;
== About Outreachy ==&lt;br /&gt;
&lt;br /&gt;
=== Sponsors ===&lt;br /&gt;
Outreachy is hosted by [https://sfconservancy.org Software Freedom Conservancy] with the special support from [https://www.redhat.com Red Hat] and the [https://www.gnome.org/foundation/ GNOME Foundation].&lt;br /&gt;
&lt;br /&gt;
=== Schedule ===&lt;br /&gt;
&lt;br /&gt;
;February 16:participating organizations are announced and application system opens&lt;br /&gt;
;February 16 - March 30: applicants need to get in touch with at least one project and make a contribution to it&lt;br /&gt;
;March 30: application deadline at 4pm UTC&lt;br /&gt;
;March 30 - April 28: applicants are encouraged to continue making contributions for the project they applied for;  submitted applications are open for editing&lt;br /&gt;
;April 28: accepted participants announced on this page at 4pm UTC&lt;br /&gt;
;May 30 - August 30: internship period&lt;br /&gt;
&lt;br /&gt;
=== Payments Schedule ===&lt;br /&gt;
Please refer to [https://wiki.gnome.org/Outreachy/2017/MayAugust] for details about how the SFC administers payments for the program.&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Summer_of_Code&amp;diff=102592</id>
		<title>Summer of Code</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Summer_of_Code&amp;diff=102592"/>
		<updated>2018-12-25T19:10:27Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Replaced content with &amp;quot;Moved to https://github.com/sugarlabs/GSoC&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Moved to https://github.com/sugarlabs/GSoC&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Welcome_to_the_Sugar_Labs_wiki&amp;diff=102591</id>
		<title>Welcome to the Sugar Labs wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Welcome_to_the_Sugar_Labs_wiki&amp;diff=102591"/>
		<updated>2018-12-25T10:29:08Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; &amp;lt;!-- 2 columns x 2 rows --&amp;gt; &lt;br /&gt;
|- row1&lt;br /&gt;
|&amp;lt;span class=&amp;quot;linkgroup&amp;quot;&amp;gt;[[File:Download_Mirabell.png|center|link=Downloads]]&amp;lt;br&amp;gt;[[Image:Sugarlabs_mainpage_01.png|link=Sugar Labs/Getting Involved]]&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;!-- column2 --&amp;gt;&lt;br /&gt;
;First time visit?: Please take a look around our wiki and our [http://github.com/sugarlabs GitHub Page]&lt;br /&gt;
;Software Developer?: Check out our developer documentation on Github, https://github.com/sugarlabs/sugar-docs&lt;br /&gt;
;Google Summer of Code?: Go through our guide for GSoC, https://github.com/sugarlabs/GSoC&lt;br /&gt;
&lt;br /&gt;
;Want to help?: Welcome to the Sugar Labs community! We are contributors of all types - teachers, writers, coders, designers, testers, and more - who work together from around the world on Sugar. Visit the &#039;&#039;&#039;[[Sugar Labs/Getting Involved | Getting Involved]]&#039;&#039;&#039; page, and find out how you can join in the fun of learning. We have some [[Vacancies]] and are always looking for maintainers and testers.&lt;br /&gt;
&lt;br /&gt;
;Using Sugar?: Get Activities from http://activities.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
|- row2&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#c8edff;border:1px solid #cdf; word-spacing:15px; padding: 0px 5px; font-size:100%; text-align:center&amp;quot; class=&amp;quot;linkgroup&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;[[Sugar Labs/Current Events | News]] [[Sugar Labs/Getting Involved | Join]] [[Downloads]] [[Sugar Labs/Contacts | Contact]] [[Sugar Labs | About&amp;amp;#x2004;Us]]&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Community News ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;[[Trademark|Sugar Labs&amp;lt;sup&amp;gt;®&amp;lt;/sup&amp;gt;]] is a member project of the [http://www.sfconservancy.org/ Software Freedom Conservancy], a USA 501(c)(3) not-for-profit organization, and is supported by our generous [[Sugar Labs/Getting Involved|contributors]] and [[Sugar Labs/Thank You|sponsors]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Translations | [[Welcome to the Sugar Labs wiki|english]] &amp;amp;#124; [[Welcome to the Sugar Labs wiki/lang-es|español]] &amp;amp;#124; [[Welcome to the Sugar Labs wiki/lang-pt_BR|português brasil]] &amp;amp;#124; [[Welcome to the Sugar Labs wiki/lang-ps|پښتو]] &amp;amp;#124; [[Welcome to the Sugar Labs wiki/lang-ru_RU|русский]]}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Welcome_to_the_Sugar_Labs_wiki&amp;diff=102582</id>
		<title>Welcome to the Sugar Labs wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Welcome_to_the_Sugar_Labs_wiki&amp;diff=102582"/>
		<updated>2018-12-18T07:39:48Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: update first time guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; &amp;lt;!-- 2 columns x 2 rows --&amp;gt; &lt;br /&gt;
|- row1&lt;br /&gt;
|&amp;lt;span class=&amp;quot;linkgroup&amp;quot;&amp;gt;[[File:Download_Mirabell.png|center|link=Downloads]]&amp;lt;br&amp;gt;[[Image:Sugarlabs_mainpage_01.png|link=Sugar Labs/Getting Involved]]&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;!-- column2 --&amp;gt;&lt;br /&gt;
;First time visit?: Please take a look around our wiki and our [http://github.com/sugarlabs GitHub Page]&lt;br /&gt;
;Want to help?: Welcome to the Sugar Labs community! We are contributors of all types - teachers, writers, coders, designers, testers, and more - who work together from around the world on Sugar. Visit the &#039;&#039;&#039;[[Sugar Labs/Getting Involved | Getting Involved]]&#039;&#039;&#039; page, and find out how you can join in the fun of learning. We have some [[Vacancies]] and are always looking for maintainers and testers.&lt;br /&gt;
&lt;br /&gt;
;Using Sugar?: Get Activities from http://activities.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
;Software Developer?: Check out our developer documentation on Github, https://github.com/sugarlabs/sugar-docs&lt;br /&gt;
&lt;br /&gt;
|- row2&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#c8edff;border:1px solid #cdf; word-spacing:15px; padding: 0px 5px; font-size:100%; text-align:center&amp;quot; class=&amp;quot;linkgroup&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;[[Sugar Labs/Current Events | News]] [[Sugar Labs/Getting Involved | Join]] [[Downloads]] [[Sugar Labs/Contacts | Contact]] [[Sugar Labs | About&amp;amp;#x2004;Us]]&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Community News ===&lt;br /&gt;
&lt;br /&gt;
Sugar Labs is participating in Google Summer of Code 2018. Please see [[Summer_of_Code/2018]] for details.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;[[Trademark|Sugar Labs&amp;lt;sup&amp;gt;®&amp;lt;/sup&amp;gt;]] is a member project of the [http://www.sfconservancy.org/ Software Freedom Conservancy], a USA 501(c)(3) not-for-profit organization, and is supported by our generous [[Sugar Labs/Getting Involved|contributors]] and [[Sugar Labs/Thank You|sponsors]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Translations | [[Welcome to the Sugar Labs wiki|english]] &amp;amp;#124; [[Welcome to the Sugar Labs wiki/lang-es|español]] &amp;amp;#124; [[Welcome to the Sugar Labs wiki/lang-pt_BR|português brasil]] &amp;amp;#124; [[Welcome to the Sugar Labs wiki/lang-ps|پښتو]] &amp;amp;#124; [[Welcome to the Sugar Labs wiki/lang-ru_RU|русский]]}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Welcome_to_the_Sugar_Labs_wiki&amp;diff=102581</id>
		<title>Welcome to the Sugar Labs wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Welcome_to_the_Sugar_Labs_wiki&amp;diff=102581"/>
		<updated>2018-12-18T07:35:26Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Remove sugar digest from home - outdated&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; &amp;lt;!-- 2 columns x 2 rows --&amp;gt; &lt;br /&gt;
|- row1&lt;br /&gt;
|&amp;lt;span class=&amp;quot;linkgroup&amp;quot;&amp;gt;[[File:Download_Mirabell.png|center|link=Downloads]]&amp;lt;br&amp;gt;[[Image:Sugarlabs_mainpage_01.png|link=Sugar Labs/Getting Involved]]&amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;!-- column2 --&amp;gt;&lt;br /&gt;
;First time visit?: Please take a look around our wiki. Explore the menus along the left side of the page. If you ever get lost, just click on the logo at the top left of every page and you will return to this page. See [[Wiki_Team/Resources#Sugar_Labs_Wiki_Guide|this guide]] for help with wiki editing, and check out the [[Getting Started]] page!&lt;br /&gt;
&lt;br /&gt;
;Want to help?: Welcome to the Sugar Labs community! We are contributors of all types - teachers, writers, coders, designers, testers, and more - who work together from around the world on Sugar. Visit the &#039;&#039;&#039;[[Sugar Labs/Getting Involved | Getting Involved]]&#039;&#039;&#039; page, and find out how you can join in the fun of learning. We have some [[Vacancies]] and are always looking for maintainers and testers.&lt;br /&gt;
&lt;br /&gt;
;Using Sugar?: Get more Activities from http://activities.sugarlabs.org&lt;br /&gt;
&lt;br /&gt;
;Software Developer?: Check out our developer documentation on Github, https://github.com/sugarlabs/sugar-docs&lt;br /&gt;
&lt;br /&gt;
|- row2&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#c8edff;border:1px solid #cdf; word-spacing:15px; padding: 0px 5px; font-size:100%; text-align:center&amp;quot; class=&amp;quot;linkgroup&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;[[Sugar Labs/Current Events | News]] [[Sugar Labs/Getting Involved | Join]] [[Downloads]] [[Sugar Labs/Contacts | Contact]] [[Sugar Labs | About&amp;amp;#x2004;Us]]&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Community News ===&lt;br /&gt;
&lt;br /&gt;
Sugar Labs is participating in Google Summer of Code 2018. Please see [[Summer_of_Code/2018]] for details.&lt;br /&gt;
&lt;br /&gt;
We&#039;ve also archived all our Press Releases at http://www.sugarlabs.org/press and the [[News]] previously posted on this front page.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;[[Trademark|Sugar Labs&amp;lt;sup&amp;gt;®&amp;lt;/sup&amp;gt;]] is a member project of the [http://www.sfconservancy.org/ Software Freedom Conservancy], a USA 501(c)(3) not-for-profit organization, and is supported by our generous [[Sugar Labs/Getting Involved|contributors]] and [[Sugar Labs/Thank You|sponsors]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Translations | [[Welcome to the Sugar Labs wiki|english]] &amp;amp;#124; [[Welcome to the Sugar Labs wiki/lang-es|español]] &amp;amp;#124; [[Welcome to the Sugar Labs wiki/lang-pt_BR|português brasil]] &amp;amp;#124; [[Welcome to the Sugar Labs wiki/lang-ps|پښتو]] &amp;amp;#124; [[Welcome to the Sugar Labs wiki/lang-ru_RU|русский]]}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102397</id>
		<title>Oversight Board/2018-2020-candidates/Rahul Bothra</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102397"/>
		<updated>2018-11-30T05:11:31Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi everyone,&lt;br /&gt;
I am Rahul Bothra (pro-panda). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;My contributions,&#039;&#039;&#039;&lt;br /&gt;
* [https://github.com/search?q=org%3Asugarlabs+author%3Apro-panda Active code contributor]; also working on [https://summerofcode.withgoogle.com/archive/2018/projects/5320748025511936/ Port to Python 3] project&lt;br /&gt;
* [http://lists.sugarlabs.org/archive/sugar-devel/2018-February/055080.html Code reviewer] and activity maintainer&lt;br /&gt;
* GSoC&#039; 18 student and GCI&#039; 18 mentor&lt;br /&gt;
&lt;br /&gt;
I am excited by our goals and our potential, but I am also concerned that we are functioning in an inefficient manner.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Currently in the SLOB meetings,&#039;&#039;&#039;&lt;br /&gt;
* A lot of the members are inactive. They don&#039;t attend the SLOB meetings or reply to motions, crippling our progress.&lt;br /&gt;
* We don&#039;t have a concrete plan of our goals. We try to cover a lot of breath in our efforts, and end up working on things which are not related to our goals (eg: Sugar Social)&lt;br /&gt;
* We drag work for a lot of time, (eg: ASLO v3) a direct result of inactive mentoring and checks during GSoC&lt;br /&gt;
* Lack of concern about the number of developers working on Sugar and its activities. We are failing in attracting new consistent developers for it, despite being a popular organisation in the Google programs.&lt;br /&gt;
* The selection of mentors and organisation admins for Google programs is a closed process.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;What I will undertake once elected:&#039;&#039;&#039;&lt;br /&gt;
* Attend every SLOB meeting regularly&lt;br /&gt;
* Revamping how we conduct GCI and GSoC to attract more contributions as well as improve the quality of mentoring; making sure we prioritise tasks which are more important to us, adding more checks before adding developers, grooming of every task / project before it is added / selected.&lt;br /&gt;
* Make a clear roadmap of our goals for the next 2 years in each domain of code, outreach, design and content. Start towards implementation of those goals according to priority.&lt;br /&gt;
* Make sure everything (except any decision concerning only the board) are taken publicly and in an open environment&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102396</id>
		<title>Oversight Board/2018-2020-candidates/Rahul Bothra</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102396"/>
		<updated>2018-11-30T05:08:41Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi everyone,&lt;br /&gt;
I am Rahul Bothra (pro-panda). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;My contributions,&#039;&#039;&#039;&lt;br /&gt;
* [https://github.com/search?q=org%3Asugarlabs+author%3Apro-panda Active code contributor]&lt;br /&gt;
* Activity Maintainer for Flappy and CowBulls&lt;br /&gt;
* [http://lists.sugarlabs.org/archive/sugar-devel/2018-February/055080.html code reviewer].&lt;br /&gt;
* GSoC&#039; 18 student working on [https://summerofcode.withgoogle.com/archive/2018/projects/5320748025511936/ porting Sugar to Python 3].&lt;br /&gt;
* GCI&#039; 18 mentor&lt;br /&gt;
&lt;br /&gt;
I am excited by our goals and our potential, but I am also concerned that we are functioning in an inefficient manner.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Currently in the SLOB meetings,&#039;&#039;&#039;&lt;br /&gt;
* A lot of the members are inactive. They don&#039;t attend the SLOB meetings or reply to motions, crippling our progress.&lt;br /&gt;
* We don&#039;t have a concrete plan of our goals. We try to cover a lot of breath in our efforts, and end up working on things which are not related to our goals (eg: Sugar Social)&lt;br /&gt;
* We drag work for a lot of time, (eg: ASLO v3) a direct result of inactive mentoring and checks during GSoC&lt;br /&gt;
* Lack of concern about the number of developers working on Sugar and its activities. We are failing in attracting new consistent developers for it, despite being a popular organisation in the Google programs.&lt;br /&gt;
* The selection of mentors and organisation admins for Google programs is a closed process.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;What I will undertake once elected:&#039;&#039;&#039;&lt;br /&gt;
* Attend every SLOB meeting regularly&lt;br /&gt;
* Revamping how we conduct GCI and GSoC to attract more contributions as well as improve the quality of mentoring; making sure we prioritise tasks which are more important to us, adding more checks before adding developers, grooming of every task / project before it is added / selected.&lt;br /&gt;
* Make a clear roadmap of our goals for the next 2 years in each domain of code, outreach, design and content. Start towards implementation of those goals according to priority.&lt;br /&gt;
* Make sure everything (except any decision concerning only the board) are taken publicly and in an open environment&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102395</id>
		<title>Oversight Board/2018-2020-candidates/Rahul Bothra</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102395"/>
		<updated>2018-11-30T05:02:08Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi everyone,&lt;br /&gt;
I am Rahul Bothra (pro-panda). I am a Python Developer and [http://lists.sugarlabs.org/archive/sugar-devel/2018-February/055080.html code reviewer] for Sugar Labs.&lt;br /&gt;
&lt;br /&gt;
I was a GSoC&#039; 18 student with Sugar Labs, and I worked on [https://summerofcode.withgoogle.com/archive/2018/projects/5320748025511936/ porting Sugar to Python 3]. I continue contributing in terms of code, code reviews and as a mentor in GCI&#039; 18.&lt;br /&gt;
&lt;br /&gt;
I am excited by our goals and our potential, but I am also concerned that we are functioning in an inefficient manner.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Currently in the SLOB meetings,&#039;&#039;&#039;&lt;br /&gt;
* A lot of the members are inactive. They don&#039;t attend the SLOB meetings or reply to motions, crippling our progress.&lt;br /&gt;
* We don&#039;t have a concrete plan of our goals. We try to cover a lot of breath in our efforts, and end up working on things which are not related to our goals (eg: Sugar Social)&lt;br /&gt;
* We drag work for a lot of time, (eg: ASLO v3) a direct result of inactive mentoring and checks during GSoC&lt;br /&gt;
* Lack of concern about the number of developers working on Sugar and its activities. We are failing in attracting new consistent developers for it, despite being a popular organisation in the Google programs.&lt;br /&gt;
* The selection of mentors and organisation admins for Google programs is a closed process.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;What I will undertake once elected:&#039;&#039;&#039;&lt;br /&gt;
* Attend every SLOB meeting regularly&lt;br /&gt;
* Revamping how we conduct GCI and GSoC to attract more contributions as well as improve the quality of mentoring; making sure we prioritise tasks which are more important to us, adding more checks before adding developers, grooming of every task / project before it is added / selected.&lt;br /&gt;
* Make a clear roadmap of our goals for the next 2 years in each domain of code, outreach, design and content. Start towards implementation of those goals according to priority.&lt;br /&gt;
* Make sure everything (except any decision concerning only the board) are taken publicly and in an open environment&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102394</id>
		<title>Oversight Board/2018-2020-candidates/Rahul Bothra</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102394"/>
		<updated>2018-11-30T05:01:40Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi everyone,&lt;br /&gt;
I am Rahul Bothra (pro-panda). I am a Python Developer and [http://lists.sugarlabs.org/archive/sugar-devel/2018-February/055080.html code reviewer] for Sugar Labs.&lt;br /&gt;
&lt;br /&gt;
I was a GSoC&#039; 18 student with Sugar Labs, and I worked on [https://summerofcode.withgoogle.com/archive/2018/projects/5320748025511936/ porting Sugar to Python 3]. I continue contributing in terms of code, code reviews and as a mentor in GCI&#039; 18.&lt;br /&gt;
&lt;br /&gt;
I am excited by our goals and our potential, but I am also concerned that we are functioning in an inefficient manner.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Currently in the SLOB meetings,&#039;&#039;&#039;&lt;br /&gt;
* A lot of the members are inactive. They don&#039;t attend the SLOB meetings or reply to motions, crippling our progress.&lt;br /&gt;
* We don&#039;t have a concrete plan of our goals. We try to cover a lot of breath in our efforts, and end up working on things which are not related to our goals (eg: Sugar Social)&lt;br /&gt;
* We drag work for a lot of time, (eg: ASLO v3) a direct result of inactive mentoring and checks during GSoC&lt;br /&gt;
* Lack of concern about the number of developers working on Sugar and its activities. We are failing in attracting new consistent developers for it, despite being a popular organisation in the Google programs.&lt;br /&gt;
* The selection of mentors and organisation admins for Google programs is a closed process.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;What I will undertake once elected:&#039;&#039;&#039;&lt;br /&gt;
* Attend every SLOB meeting regularly&lt;br /&gt;
* Revamping how we conduct GCI and GSoC to attract more contributions as well as improve the quality of mentoring; making sure we prioritise tasks which are more important to us, adding more checks before adding developers, grooming of every task / project before it is added / selected.&lt;br /&gt;
* Make a clear roadmap of our goals for the next 2 years in each domain of code, outreach, design and content. Start towards implementation of those goals according to priority.&lt;br /&gt;
* Make sure everything (except any decision concerning only the board) are taken publicly and in an open environment&lt;br /&gt;
&lt;br /&gt;
I would like support from the community for my candidature for the post as a SLOB member.&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102393</id>
		<title>Oversight Board/2018-2020-candidates/Rahul Bothra</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102393"/>
		<updated>2018-11-30T02:26:04Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi everyone,&lt;br /&gt;
I am Rahul Bothra (pro-panda). I am a Python Developer and [http://lists.sugarlabs.org/archive/sugar-devel/2018-February/055080.html code reviewer] for Sugar Labs.&lt;br /&gt;
&lt;br /&gt;
I was a GSoC&#039; 18 student with Sugar Labs, and I worked on [https://summerofcode.withgoogle.com/archive/2018/projects/5320748025511936/ porting Sugar to Python 3]. I continue contributing in terms of code, code reviews and as a mentor in GCI&#039; 18.&lt;br /&gt;
&lt;br /&gt;
I am excited by our goals and our potential. But I am concerned that the way we are working is wrong.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Currently in the SLOB meetings,&#039;&#039;&#039;&lt;br /&gt;
* A lot of the members are inactive. They don&#039;t attend the SLOB meetings or reply to motions, crippling our progress.&lt;br /&gt;
* There is a lot of talk, but there is not an equivalent amount of work done. We fail to properly materialise discussions&lt;br /&gt;
* We don&#039;t have a concrete plan of our goals. We try to cover a lot of breath in our efforts, and end up working on things which are not related to our goals (eg: Sugar Social)&lt;br /&gt;
* We drag work for a lot of time, (eg: ASLO v3) a direct result of inactive mentoring and checks during GSoC&lt;br /&gt;
* Lack of concern about the number of developers working on Sugar and its activities. We are failing in attracting new consistent developers for it, despite being a popular GSoC and GCI organisation. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;What I will undertake once elected:&#039;&#039;&#039;&lt;br /&gt;
* Attend every SLOB meeting regularly&lt;br /&gt;
* Revamping how we conduct GCI and GSoC to attract more contributions as well as improve the quality of mentoring; making sure we prioritise tasks which are more important to us, adding more checks before adding developers, grooming of every task / project before it is added / selected.&lt;br /&gt;
* Make a clear roadmap of our goals for the next 2 years in each domain of code, outreach, design and content. Start towards implementation of those goals according to priority.&lt;br /&gt;
&lt;br /&gt;
I would like support from the community for my candidature for the post as a SLOB member.&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102392</id>
		<title>Oversight Board/2018-2020-candidates/Rahul Bothra</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102392"/>
		<updated>2018-11-30T02:25:42Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi everyone,&lt;br /&gt;
I am Rahul Bothra (pro-panda). I am a Python Developer and [http://lists.sugarlabs.org/archive/sugar-devel/2018-February/055080.html code reviewer] for Sugar Labs.&lt;br /&gt;
&lt;br /&gt;
I was a GSoC&#039; 18 student with Sugar Labs, and I worked on [https://summerofcode.withgoogle.com/archive/2018/projects/5320748025511936/ porting Sugar to Python 3]. I continue contributing in terms of code, code reviews and as a mentor in GCI&#039; 18.&lt;br /&gt;
&lt;br /&gt;
I am excited by our goals and our potential. But I am concerned that the way we are working is wrong.&lt;br /&gt;
&#039;&#039;&#039;Currently in the SLOB meetings,&#039;&#039;&#039;&lt;br /&gt;
* A lot of the members are inactive. They don&#039;t attend the SLOB meetings or reply to motions, crippling our progress.&lt;br /&gt;
* There is a lot of talk, but there is not an equivalent amount of work done. We fail to properly materialise discussions&lt;br /&gt;
* We don&#039;t have a concrete plan of our goals. We try to cover a lot of breath in our efforts, and end up working on things which are not related to our goals (eg: Sugar Social)&lt;br /&gt;
* We drag work for a lot of time, (eg: ASLO v3) a direct result of inactive mentoring and checks during GSoC&lt;br /&gt;
* Lack of concern about the number of developers working on Sugar and its activities. We are failing in attracting new consistent developers for it, despite being a popular GSoC and GCI organisation. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;What I will undertake once elected:&#039;&#039;&#039;&lt;br /&gt;
* Attend every SLOB meeting regularly&lt;br /&gt;
* Revamping how we conduct GCI and GSoC to attract more contributions as well as improve the quality of mentoring; making sure we prioritise tasks which are more important to us, adding more checks before adding developers, grooming of every task / project before it is added / selected.&lt;br /&gt;
* Make a clear roadmap of our goals for the next 2 years in each domain of code, outreach, design and content. Start towards implementation of those goals according to priority.&lt;br /&gt;
&lt;br /&gt;
I would like support from the community for my candidature for the post as a SLOB member.&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102391</id>
		<title>Oversight Board/2018-2020-candidates/Rahul Bothra</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102391"/>
		<updated>2018-11-30T02:25:21Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi everyone,&lt;br /&gt;
I am Rahul Bothra (pro-panda). I am a Python Developer and [http://lists.sugarlabs.org/archive/sugar-devel/2018-February/055080.html code reviewer] for Sugar Labs.&lt;br /&gt;
&lt;br /&gt;
I was a GSoC&#039; 18 student with Sugar Labs, and I worked on [https://summerofcode.withgoogle.com/archive/2018/projects/5320748025511936/ porting Sugar to Python 3]. I continue contributing in terms of code, code reviews and as a mentor in GCI&#039; 18.&lt;br /&gt;
&lt;br /&gt;
I am excited by our goals and our potential. But I am concerned that the way we are working is wrong. &#039;&#039;&#039;Currently in the SLOB meetings,&#039;&#039;&#039;&lt;br /&gt;
* A lot of the members are inactive. They don&#039;t attend the SLOB meetings or reply to motions, crippling our progress.&lt;br /&gt;
* There is a lot of talk, but there is not an equivalent amount of work done. We fail to properly materialise discussions&lt;br /&gt;
* We don&#039;t have a concrete plan of our goals. We try to cover a lot of breath in our efforts, and end up working on things which are not related to our goals (eg: Sugar Social)&lt;br /&gt;
* We drag work for a lot of time, (eg: ASLO v3) a direct result of inactive mentoring and checks during GSoC&lt;br /&gt;
* Lack of concern about the number of developers working on Sugar and its activities. We are failing in attracting new consistent developers for it, despite being a popular GSoC and GCI organisation. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;What I will undertake once elected:&#039;&#039;&#039;&lt;br /&gt;
* Attend every SLOB meeting regularly&lt;br /&gt;
* Revamping how we conduct GCI and GSoC to attract more contributions as well as improve the quality of mentoring; making sure we prioritise tasks which are more important to us, adding more checks before adding developers, grooming of every task / project before it is added / selected.&lt;br /&gt;
* Make a clear roadmap of our goals for the next 2 years in each domain of code, outreach, design and content. Start towards implementation of those goals according to priority.&lt;br /&gt;
&lt;br /&gt;
I would like support from the community for my candidature for the post as a SLOB member.&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102374</id>
		<title>Oversight Board/2018-2020-candidates/Rahul Bothra</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102374"/>
		<updated>2018-11-27T19:07:54Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi everyone,&lt;br /&gt;
I am Rahul Bothra (pro-panda). I am a Python Developer and [http://lists.sugarlabs.org/archive/sugar-devel/2018-February/055080.html code reviewer] for Sugar Labs.&lt;br /&gt;
&lt;br /&gt;
I was a GSoC&#039; 18 student with Sugar Labs, and I worked on [https://summerofcode.withgoogle.com/archive/2018/projects/5320748025511936/ porting Sugar to Python 3]. I continue contributing in terms of code, code reviews and as a mentor in GCI&#039; 18.&lt;br /&gt;
&lt;br /&gt;
I am excited our goals and our potential. But I am concerned that the way we are working is wrong. Currently in the SLOB meetings,&lt;br /&gt;
* A lot of the members are inactive. They don&#039;t attend the SLOB meetings or reply to motions, crippling our progress.&lt;br /&gt;
* There is a lot of talk, but there is not an equivalent amount of work done. We fail to properly materialise discussions&lt;br /&gt;
* We don&#039;t have a concrete plan of our goals. We try to cover a lot of breath in our efforts, and end up working on things which are not related to our goals (eg: Sugar Social)&lt;br /&gt;
* We drag work for a lot of time, (eg: ASLO v3) a direct result of inactive mentoring and checks during GSoC&lt;br /&gt;
&lt;br /&gt;
I also feel there is a lack of concern about the number of developers working on Sugar and the activities. We are failing in attracting new consistent developers despite being a popular GSoC and GCI organisation. &lt;br /&gt;
&lt;br /&gt;
What I will undertake once elected:&lt;br /&gt;
* Attend every SLOB meeting regularly&lt;br /&gt;
* Revamping how we conduct GCI and GSoC to attract more contributions as well as improve the quality of mentoring; making sure we prioritise tasks which are more important to us, adding more checks before adding developers, grooming of every task / project before it is added / selected.&lt;br /&gt;
* Make a clear roadmap of our goals for the next 2 years in each domain of code, outreach, design and content. Start towards implementation of those goals according to priority.&lt;br /&gt;
&lt;br /&gt;
I would like support from the community for my candidature for the post as a SLOB member.&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102319</id>
		<title>Oversight Board/2018-2020-candidates/Rahul Bothra</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102319"/>
		<updated>2018-11-24T21:07:10Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi everyone,&lt;br /&gt;
I am Rahul Bothra (pro-panda). I am a Python Developer and [http://lists.sugarlabs.org/archive/sugar-devel/2018-February/055080.html code reviewer] for Sugar Labs.&lt;br /&gt;
&lt;br /&gt;
I was a GSoC&#039; 18 student with Sugar Labs, and I worked on [https://summerofcode.withgoogle.com/archive/2018/projects/5320748025511936/ porting Sugar to Python 3]. I continue contributing in terms of code, code reviews and as a mentor in GCI&#039; 18.&lt;br /&gt;
&lt;br /&gt;
I am excited our goals and our potential. But I am concerned that the way we are working is wrong. Currently in the SLOB meetings,&lt;br /&gt;
* A lot of the members are inactive. They don&#039;t attend the SLOB meetings or reply to motions, crippling our progress.&lt;br /&gt;
* There is a lot of talk, but there is not an equivalent amount of work done. We fail to properly materialise discussions&lt;br /&gt;
* We don&#039;t have a concrete plan of our goals. We try to cover a lot of breath in our efforts, and end up working on things which are not related to our goals (eg: Sugar Social)&lt;br /&gt;
* We drag work for a lot of time, (eg: ASLO v3) a direct result of inactive mentoring and checks during GSoC&lt;br /&gt;
&lt;br /&gt;
I also feel there is a lack of concern about the number of developers working on Sugar and the activities. We are failing in attracting new consistent developers despite being a popular GSoC and GCI organisation. &lt;br /&gt;
&lt;br /&gt;
What I will undertake once elected:&lt;br /&gt;
* Attend every SLOB meeting regularly&lt;br /&gt;
* Revamping how we conduct GCI and GSoC to attract more contributions; prioritising tasks which are more important to us, and improving mentoring checks to ensure that mentors are active&lt;br /&gt;
* Work on a roadmap of our goals across various domains and timelines, and try to make sure they are implemented&lt;br /&gt;
&lt;br /&gt;
I would like support from the community for my candidature for the post as a SLOB member.&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102318</id>
		<title>Oversight Board/2018-2020-candidates/Rahul Bothra</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Oversight_Board/2018-2020-candidates/Rahul_Bothra&amp;diff=102318"/>
		<updated>2018-11-24T20:59:29Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: SLOB Election Candidature - Rahul Bothra&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi everyone,&lt;br /&gt;
I am Rahul Bothra (pro-panda). I am a Python Developer and [http://lists.sugarlabs.org/archive/sugar-devel/2018-February/055080.html code reviewer] for Sugar Labs.&lt;br /&gt;
&lt;br /&gt;
I was a GSoC&#039; 18 student with Sugar Labs, and I worked on [https://summerofcode.withgoogle.com/archive/2018/projects/5320748025511936/ porting Sugar to Python 3]. I continue contributing in terms of code, code reviews and as a mentor in GCI&#039; 18.&lt;br /&gt;
&lt;br /&gt;
I am excited our goals and our potential. But I am concerned that the way we are working is wrong. Currently in the SLOB meetings,&lt;br /&gt;
* A lot of the members are inactive. They don&#039;t attend the SLOB meetings or reply to motions, crippling our progress.&lt;br /&gt;
* There is a lot of talk, but there is not an equivalent amount of work done. We fail to properly materialise discussions&lt;br /&gt;
* We don&#039;t have a concrete plan of our goals. We try to cover a lot of breath in our efforts, but fail to reach the right depth&lt;br /&gt;
&lt;br /&gt;
I also feel there is a lack of concern about the number of developers working on Sugar and the activities. We are failing in attracting new consistent developers despite being a popular GSoC and GCI organisation. &lt;br /&gt;
&lt;br /&gt;
What I will undertake once elected:&lt;br /&gt;
* Attend every SLOB meeting regularly&lt;br /&gt;
* Revamping how we conduct GCI and GSoC to attract more contributions; prioritising tasks which are more important to us, and improving mentoring checks to ensure that mentors are active&lt;br /&gt;
* Work on a roadmap of our goals across various domains and timelines&lt;br /&gt;
&lt;br /&gt;
I would like support from the community for my candidature for the post as a SLOB member.&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Google_Code_In_2018&amp;diff=102040</id>
		<title>Google Code In 2018</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Google_Code_In_2018&amp;diff=102040"/>
		<updated>2018-09-13T02:45:53Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;[[Category:Trac Reference]][[Category:Idea]]&lt;br /&gt;
[[Category: GCI2018]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the project page for the Sugar Labs [https://opensource.googleblog.com/2018/10/welcoming-25-mentor-organizations-for.html application] to [https://developers.google.com/open-source/gci/ Google Code In 2018]. Sugar Labs community members: please feel free to add tasks below.&lt;br /&gt;
&lt;br /&gt;
== Message to potential participants ==&lt;br /&gt;
&lt;br /&gt;
It is important that you obtain permission of your parents.&lt;br /&gt;
&lt;br /&gt;
Es importante que obtengas el permiso de tus padres para participar.&lt;br /&gt;
&lt;br /&gt;
Please see the Contest Rules for Eligibility and Registration process.&lt;br /&gt;
&lt;br /&gt;
https://developers.google.com/open-source/gci/resources/contest-rules&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Details regarding the required forms and paperwork are here: [[Google Code In 2018/Participate#Students]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Also, you will likely need to set up the Sugar development environment. See http://developer.sugarlabs.org/dev-environment.md.html for details. Further information about contributing to the project can be found here: http://developer.sugarlabs.org/&lt;br /&gt;
&lt;br /&gt;
Please don&#039;t hesitate to ask questions on our irc channel (#sugar on irc.freenode.net) or on the sugar-devel list: sugar-devel AT lists.sugarlabs DOT org&lt;br /&gt;
&lt;br /&gt;
== Why Sugar Labs is participating ==&lt;br /&gt;
&lt;br /&gt;
Sugar is written and maintained by volunteers, who range from seasoned professionals to children as young as 12-years of age. Children who have grown up with Sugar have transitioned from Sugar users to Sugar App developers to Sugar maintainers. They hang out on IRC with the global Sugar developer community and are full-fledged members of the Sugar development team. It is this latter group of children we hope will participate in and benefit from Google Code-in. Specifically we want to re-enforce the message that Sugar belongs to its users and that they have both ownership and the responsibility that ownership implies. Just as learning is not something done to you, but something you do, learning with Sugar ultimately means participating in the Sugar development process. At Sugar Labs, we are trying to bring the culture of Free Software into the culture of school. So the Code-in is not just an opportunity for us to get some tasks accomplished, it is quintessential to our overall mission.&lt;br /&gt;
&lt;br /&gt;
== Some background from GCI ==&lt;br /&gt;
&lt;br /&gt;
[See https://developers.google.com/open-source/gci/resources/getting-started]&lt;br /&gt;
&lt;br /&gt;
===Open Source Fundamentals ===&lt;br /&gt;
&lt;br /&gt;
You can contribute without being a coder!&lt;br /&gt;
You do not have to be a coder to contribute to open source. There are many different skill sets needed to help an open source community thrive:&lt;br /&gt;
;Documentation: If you are a good writer and enjoy attention to detail then you might want to contribute by writing or editing documentation. Documentation is a huge part of a successful open source project. Organizations need documentation to help attract new contributors as it helps them see what the codebase looks like and where things are and what the plan is for the project.&lt;br /&gt;
;Research: An organization may need help crunching numbers or sorting through pages of documents to better understand what the users want or need.  There are many different types of tasks that students could work on that are very important to the health of the project.&lt;br /&gt;
;Outreach: If you have an outgoing personality and like being around and talking to people, take a look at the outreach tasks. Outreach tasks often include hosting meetups in your local community or creating a plan on how people around the globe can host a meetup about the project in their local communities.&lt;br /&gt;
;Training: You could create a YouTube video discussing a new feature of the project or maybe some basics on what the project does so people who haven’t heard about it can understand the project and get involved.&lt;br /&gt;
;User Interface: User interface can include many types of tasks including designing new aspects of a webpage or creating a new logo for the project. It may also include various accessibility opportunities to help make the project easier for people who are blind.&lt;br /&gt;
;Other: If you have an idea that may help an organization, reach out to them and let them know! Sometimes the best task is one that the organization hasn’t even considered yet.&lt;br /&gt;
=== Collaboration===&lt;br /&gt;
Open source is not just about coding but working with other people to find the best solution. Being a part of the community is an essential part of success in Google Code-in.  Mentors tell us every year that their best students were the ones who worked hard on their projects but also participated on IRC and helped answer questions other students had. Collaborate with the community and mentors on the #sugar channel in the irc.freenode.net network.&lt;br /&gt;
&lt;br /&gt;
=== Quality over Quantity === &lt;br /&gt;
&lt;br /&gt;
It’s not about being the student who completes the most tasks, that only gets you to the top 10 to be reviewed, it doesn’t mean you will be a grand prize winner. We have had quite a few students who completed the most tasks for their organization yet were not named as Grand Prize Winners because they did everything solo and didn’t get involved in the community or think about the health of the project as a whole, they just kept completing task after task like a machine. If you actively participate in the community then you not only feel the camaraderie that comes with working as a team but you become committed to making the project better for everyone.&lt;br /&gt;
&lt;br /&gt;
== Some basics about Sugar Labs and Sugar development ==&lt;br /&gt;
&lt;br /&gt;
For some basics about the project, see [http://people.sugarlabs.org/walter/docs/Learning-to-Change-the-World-Chapter-4.pdf Chapter 4 of Learning to Change the World].&lt;br /&gt;
&lt;br /&gt;
{{:Google Code In 2018/background}}&lt;br /&gt;
&lt;br /&gt;
== This is a stub for 25+ example tasks new for GCI 2018. ==&lt;br /&gt;
&lt;br /&gt;
Note, more detailed task descriptions will be available once the contest begins.&lt;br /&gt;
&lt;br /&gt;
=== beginner tasks ===&lt;br /&gt;
# Install the Sugar development environment by following the instruction at [http://developer.sugarlabs.org/dev-environment.md.html].&lt;br /&gt;
# Install Sugar in a virtual machine.&lt;br /&gt;
# Install Sugar packages on Ubuntu, Debian, or Fedora.&lt;br /&gt;
# Create an example program in Turtle Blocks (See [https://www.pinterest.com/walterbender/turtle-art/] for some ideas).&lt;br /&gt;
# Create an example program in Music Blocks.&lt;br /&gt;
# Create a simple machine in Physics.&lt;br /&gt;
&lt;br /&gt;
=== general tasks ===&lt;br /&gt;
# Organize a Turtle Art Day (or Music Blocks Day) in your community (Outreach)&lt;br /&gt;
# Create a 60 second promotional video on Sugar and its community (Outreach)&lt;br /&gt;
# Host a Question and Answer (Q&amp;amp;A)/Information session about Sugar on Google Hangouts. (Outreach)&lt;br /&gt;
# DIY Sugar on a Stick||Organize and host a Sugar on a Stick party where you show people how to make their own Sugar on a Stick. (Outreach)&lt;br /&gt;
# Find an educator who is using open-source educational software to teach. Interview the educator about their experience as an educator and why they are using open-source software to teach. (Outreach)&lt;br /&gt;
# Write a blog post about your experience as a GCI participant for Sugar Labs. (Outreach)&lt;br /&gt;
# Create a 10-minute presentation celebrating at least three women within the Sugar community and/or the open-source community at large. (Research/Outreach)&lt;br /&gt;
# Gather information on who could benefit from using or knowing about Sugar. (Research)&lt;br /&gt;
# Find the resources that people are using throughout the world to learn about or teach Sugar Activities. (Research)&lt;br /&gt;
# Find the missing repo: we&#039;ve lost track of the source repository of some Sugar activities: help us find them (Research)&lt;br /&gt;
# Investigate Google Fuzzing tool (Research)&lt;br /&gt;
# Add more synths/sound fonts to Music Blocks (Research)&lt;br /&gt;
# Design the music equivalent of Turtle Confusion for Music Blocks (Research)&lt;br /&gt;
# Wiki cleanup (Documentation)&lt;br /&gt;
# Music Blocks examples (Documentation/Training)&lt;br /&gt;
# Write a review about an Activity in Sugar. (Documentation)&lt;br /&gt;
# How should the Sugar UI change to accommodate a small screen? (User interface)&lt;br /&gt;
# What else should be made easier to customize in Sugar with minimal programming? (User interface)&lt;br /&gt;
# Create a unit tests for a JavaScript activity (Quality assurance)&lt;br /&gt;
# Bugzilla clean up (Quality assurance)&lt;br /&gt;
# Refactor Turtle graphics to adopt look of Javascript version (Code: Python)&lt;br /&gt;
# Write a Pinetrest plugin for the Sugar Journal (Code: Python)&lt;br /&gt;
# Investigate CSound/Python version of Music Blocks (Code: Python)&lt;br /&gt;
# Resolve an open issue from https://github.com/sugarlabs/ (Code: Python)&lt;br /&gt;
# Teach me how to draw activity (Code: Javascript)&lt;br /&gt;
# Plugin manager for Turtle JS (Code: Javascript)&lt;br /&gt;
# Improvements to Lilypond interface (Code: Javascript)&lt;br /&gt;
# Add ABC import to Music Blocks (Code: Javascript)&lt;br /&gt;
# Add Lilypond import to Music Blocks (Code: Javascript)&lt;br /&gt;
# Write a Turtle plugin (Code: Javascript)&lt;br /&gt;
# Visualize turtle movements in Pitch-Time Matrix (Code: Javascript)&lt;br /&gt;
# Visualize turtle pitch in Music Blocks widget (Code: Javascript)&lt;br /&gt;
# Write a extruder in JavaScript to convert from SVG to STL for 3D printing. (Code: JavaScript)&lt;br /&gt;
# Write a slicer in JavaScript to convert between SL and GCODE for 3D printing. (Code: JavaScript)&lt;br /&gt;
# Resolve an open issue from https://github.com/walterbender/musicblocks/ (Code: JavaScript)&lt;br /&gt;
&lt;br /&gt;
Mentors: please feel free to add more tasks and/or add yourself as a potential mentor to an existing task.&lt;br /&gt;
&lt;br /&gt;
Tasks must fall within one of these five categories: [[#Documentation/Training]]; [[#Outreach/Research]]; [[#User Interface]]; [[#Quality Assurance]]; and [[#Code]].&lt;br /&gt;
&lt;br /&gt;
== Mentors ==&lt;br /&gt;
;NOTES TO MENTORS:&lt;br /&gt;
:Please refer to [[Google Code In 2018/Participate#Mentors]] for details regarding enrolling as a mentor.&lt;br /&gt;
:Please add yourself to the list below.&lt;br /&gt;
:Feel free to add new tasks to the table above.&lt;br /&gt;
&lt;br /&gt;
Depending on the task, we will assign multiple mentors from our various development and support teams.&lt;br /&gt;
&lt;br /&gt;
* Walter Bender - co-administrator&lt;br /&gt;
* [mailto:rrbothra@gmail.com Rahul Bothra]&lt;br /&gt;
* Ignacio Rodriguez&lt;br /&gt;
* Hrishi Patel&lt;br /&gt;
* Tayba Wasim (Tabs16)&lt;br /&gt;
* Ibiam Chihurumnaya - co-administrator&lt;br /&gt;
* Rishabh Thaney&lt;br /&gt;
* Samson Goddy&lt;br /&gt;
* Jaskirat Singh&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Python_2to3&amp;diff=102016</id>
		<title>Python 2to3</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Python_2to3&amp;diff=102016"/>
		<updated>2018-08-11T05:55:31Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Project Introduction ==&lt;br /&gt;
Sugar currently uses Python 2. Since support for python 2 is being drawn, we are porting our code to Python 3.&lt;br /&gt;
&lt;br /&gt;
It is one of the [https://wiki.sugarlabs.org/go/Goals/2018_Submissions/Migrate_all_core_Sugar_Labs_code_to_Python3 goals for Sugar Labs] for 2018, with a suggested timeframe of ~12-16 months for completing the project.&lt;br /&gt;
&lt;br /&gt;
The project was taken up by Sugar Labs in [https://wiki.sugarlabs.org/go/Summer_of_Code/2018 Google Summer of Code 2018]&lt;br /&gt;
&lt;br /&gt;
== Project Summary ==&lt;br /&gt;
The project progress can be tracked [https://github.com/orgs/sugarlabs/projects/1 here].&lt;br /&gt;
&lt;br /&gt;
;Sugar&lt;br /&gt;
: Target: Port entirely to Python 3&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar/tree/python3&lt;br /&gt;
: Status: While some critical issues still persist, most of the functionality is running and tested.&lt;br /&gt;
&lt;br /&gt;
;Sugar-Toolkit-Gtk3&lt;br /&gt;
: Target: Should be compatible with both Python 2 and Python 3, to support the large number of activities currently in Python 2&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-toolkit-gtk3/tree/python3-port&lt;br /&gt;
: Status: Mostly Complete; what remains is an entire project in itself of [https://github.com/orgs/sugarlabs/projects/4 porting the Telepathy Bindings].&lt;br /&gt;
: Critical changes implelmented:&lt;br /&gt;
:* Python 3 activities must be instantiated with sugar-activity3 instead of sugar-activity&lt;br /&gt;
:* sugar-activity-web will call the Python 3 version of the toolkit and will be installed only with the same&lt;br /&gt;
:* warning logged if activity is not ported to Python 3&lt;br /&gt;
Note: To test the toolkit without porting the telepathy bindings, please use the Python 3 bindings (not for release), https://github.com/pro-panda/telepathy3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Sugar-Datastore&lt;br /&gt;
: Target: Port entirely to Python 3&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-datastore/tree/python3-port&lt;br /&gt;
: Status: Complete(possible fix patches do come up while porting sugar); Fedora packaging and testing remains&lt;br /&gt;
&lt;br /&gt;
;Sugar-Artwork&lt;br /&gt;
: Target: Port entirely to Python 3 (use system empy bindings for Python 3)&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-artwork/tree/python3-port&lt;br /&gt;
: Status: Complete; Fedora packaging and testing remains&lt;br /&gt;
&lt;br /&gt;
;Sugar Desktop Activities&lt;br /&gt;
: Guide to porting activities to Python 3 is [https://github.com/sugarlabs/sugar-docs/blob/master/src/python-porting-guide.md here]&lt;br /&gt;
{| style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! | Activity&lt;br /&gt;
! Status [WIP/Ported]&lt;br /&gt;
! Pull Request&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Log&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/log-activity/issues/9 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|JukeBox&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/jukebox-activity/pull/20 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Abacus&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/activity-abacus/pull/15 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Calculate&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/sugarlabs-calculate/issues/53 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Chat&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/chat/issues/13 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CowBulls&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/CowBulls-activity/issues/11 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Finance&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/finance-activity/issues/16 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hello-world&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/hello-world/issues/3 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Imageviewer&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/imageviewer-activity/issues/26 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Read&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/read-activity/issues/21 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Spirolaterals&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/spirolaterals/issues/12 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Terminal&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/terminal-activity/issues/29 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Write&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/write-activity/issues/24 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Nutrition&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/nutrition/issues/4 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Contributing to the Project ==&lt;br /&gt;
There are several ways of contributing to the project&lt;br /&gt;
; Port Telepathy bindings&lt;br /&gt;
: Telepathy does not have python 3 bindings and needs to be ported to its PyGObject bindings as a prerequisite for porting to Python 3&lt;br /&gt;
: See https://github.com/orgs/sugarlabs/projects/4&lt;br /&gt;
&lt;br /&gt;
; Test Debian Packages&lt;br /&gt;
: Debian packages for core modules here: https://github.com/Pro-Panda/sugar-packages&lt;br /&gt;
: Please install, test and report bugs, (or better, submit fix patches)&lt;br /&gt;
&lt;br /&gt;
; Fedora Packaging&lt;br /&gt;
: Make Fedora packages of core modules (WIP links above) and test them&lt;br /&gt;
&lt;br /&gt;
; Port Sugar Desktop Activities to Python 3:&lt;br /&gt;
: See the guide to port activities to Python 3: https://github.com/sugarlabs/sugar-docs/blob/master/src/python-porting-guide.md&lt;br /&gt;
&lt;br /&gt;
; Improve test coverage&lt;br /&gt;
: Sugar and the components lack in testing mechanisms and scripts. Our current test coverage is very basic and minimal. Improving the same is critical and the best time would be to so while Porting and testing the components&lt;br /&gt;
: Some test scripts are here -  https://github.com/Pro-Panda/sugar-python3-tests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* httplib.HTTP is not available in Python 3; use http.client.HTTPConnection instead&lt;br /&gt;
* cmp function does not exist in Python 3, use the cmp_to_key function; see https://docs.python.org/3/howto/sorting.html#sortinghowto&lt;br /&gt;
* list.sort function requires named parameters in Python 3&lt;br /&gt;
* hashlib.md5 requires bytes as an argument in Python 3&lt;br /&gt;
* sha_hash.update requires bytes as an argument in Python 3&lt;br /&gt;
* statvfs does not exist in Python 3, verify the Python 2 constant values and use them instead&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Python_2to3&amp;diff=102015</id>
		<title>Python 2to3</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Python_2to3&amp;diff=102015"/>
		<updated>2018-08-11T05:55:00Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Update project links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Project Introduction ==&lt;br /&gt;
Sugar currently uses Python 2. Since support for python 2 is being drawn, we are porting our code to Python 3.&lt;br /&gt;
&lt;br /&gt;
It is one of the [https://wiki.sugarlabs.org/go/Goals/2018_Submissions/Migrate_all_core_Sugar_Labs_code_to_Python3 goals for Sugar Labs] for 2018, with a suggested timeframe of ~12-16 months for completing the project.&lt;br /&gt;
&lt;br /&gt;
The project was taken up by Sugar Labs in [https://wiki.sugarlabs.org/go/Summer_of_Code/2018 Google Summer of Code 2018]&lt;br /&gt;
&lt;br /&gt;
== Project Summary ==&lt;br /&gt;
The project progress can be tracked [https://github.com/orgs/sugarlabs/projects/1 here].&lt;br /&gt;
&lt;br /&gt;
;Sugar&lt;br /&gt;
: Target: Port entirely to Python 3&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar/tree/python3&lt;br /&gt;
: Status: While some critical issues still persist, most of the functionality is running and tested.&lt;br /&gt;
&lt;br /&gt;
;Sugar-Toolkit-Gtk3&lt;br /&gt;
: Target: Should be compatible with both Python 2 and Python 3, to support the large number of activities currently in Python 2&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-toolkit-gtk3/tree/python3-port&lt;br /&gt;
: Status: Mostly Complete; what remains is an entire project in itself of [https://github.com/orgs/sugarlabs/projects/4 porting the Telepathy Bindings].&lt;br /&gt;
: Critical changes implelmented:&lt;br /&gt;
:* Python 3 activities must be instantiated with sugar-activity3 instead of sugar-activity&lt;br /&gt;
:* sugar-activity-web will call the Python 3 version of the toolkit and will be installed only with the same&lt;br /&gt;
:* warning logged if activity is not ported to Python 3&lt;br /&gt;
Note: To test the toolkit without porting the telepathy bindings, please use the Python 3 bindings (note for release), https://github.com/pro-panda/telepathy3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Sugar-Datastore&lt;br /&gt;
: Target: Port entirely to Python 3&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-datastore/tree/python3-port&lt;br /&gt;
: Status: Complete(possible fix patches do come up while porting sugar); Fedora packaging and testing remains&lt;br /&gt;
&lt;br /&gt;
;Sugar-Artwork&lt;br /&gt;
: Target: Port entirely to Python 3 (use system empy bindings for Python 3)&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-artwork/tree/python3-port&lt;br /&gt;
: Status: Complete; Fedora packaging and testing remains&lt;br /&gt;
&lt;br /&gt;
;Sugar Desktop Activities&lt;br /&gt;
: Guide to porting activities to Python 3 is [https://github.com/sugarlabs/sugar-docs/blob/master/src/python-porting-guide.md here]&lt;br /&gt;
{| style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! | Activity&lt;br /&gt;
! Status [WIP/Ported]&lt;br /&gt;
! Pull Request&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Log&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/log-activity/issues/9 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|JukeBox&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/jukebox-activity/pull/20 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Abacus&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/activity-abacus/pull/15 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Calculate&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/sugarlabs-calculate/issues/53 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Chat&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/chat/issues/13 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CowBulls&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/CowBulls-activity/issues/11 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Finance&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/finance-activity/issues/16 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hello-world&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/hello-world/issues/3 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Imageviewer&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/imageviewer-activity/issues/26 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Read&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/read-activity/issues/21 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Spirolaterals&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/spirolaterals/issues/12 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Terminal&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/terminal-activity/issues/29 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Write&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/write-activity/issues/24 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Nutrition&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/nutrition/issues/4 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Contributing to the Project ==&lt;br /&gt;
There are several ways of contributing to the project&lt;br /&gt;
; Port Telepathy bindings&lt;br /&gt;
: Telepathy does not have python 3 bindings and needs to be ported to its PyGObject bindings as a prerequisite for porting to Python 3&lt;br /&gt;
: See https://github.com/orgs/sugarlabs/projects/4&lt;br /&gt;
&lt;br /&gt;
; Test Debian Packages&lt;br /&gt;
: Debian packages for core modules here: https://github.com/Pro-Panda/sugar-packages&lt;br /&gt;
: Please install, test and report bugs, (or better, submit fix patches)&lt;br /&gt;
&lt;br /&gt;
; Fedora Packaging&lt;br /&gt;
: Make Fedora packages of core modules (WIP links above) and test them&lt;br /&gt;
&lt;br /&gt;
; Port Sugar Desktop Activities to Python 3:&lt;br /&gt;
: See the guide to port activities to Python 3: https://github.com/sugarlabs/sugar-docs/blob/master/src/python-porting-guide.md&lt;br /&gt;
&lt;br /&gt;
; Improve test coverage&lt;br /&gt;
: Sugar and the components lack in testing mechanisms and scripts. Our current test coverage is very basic and minimal. Improving the same is critical and the best time would be to so while Porting and testing the components&lt;br /&gt;
: Some test scripts are here -  https://github.com/Pro-Panda/sugar-python3-tests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* httplib.HTTP is not available in Python 3; use http.client.HTTPConnection instead&lt;br /&gt;
* cmp function does not exist in Python 3, use the cmp_to_key function; see https://docs.python.org/3/howto/sorting.html#sortinghowto&lt;br /&gt;
* list.sort function requires named parameters in Python 3&lt;br /&gt;
* hashlib.md5 requires bytes as an argument in Python 3&lt;br /&gt;
* sha_hash.update requires bytes as an argument in Python 3&lt;br /&gt;
* statvfs does not exist in Python 3, verify the Python 2 constant values and use them instead&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Python_2to3&amp;diff=102014</id>
		<title>Python 2to3</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Python_2to3&amp;diff=102014"/>
		<updated>2018-08-11T05:18:42Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Project Introduction ==&lt;br /&gt;
Sugar currently uses Python 2. Since support for python 2 is being drawn, we are porting our code to Python 3.&lt;br /&gt;
&lt;br /&gt;
It is one of the [https://wiki.sugarlabs.org/go/Goals/2018_Submissions/Migrate_all_core_Sugar_Labs_code_to_Python3 goals for Sugar Labs] for 2018, with a suggested timeframe of ~12-16 months for completing the project.&lt;br /&gt;
&lt;br /&gt;
The project was taken up by Sugar Labs in [https://wiki.sugarlabs.org/go/Summer_of_Code/2018 Google Summer of Code 2018]&lt;br /&gt;
&lt;br /&gt;
== Project Summary ==&lt;br /&gt;
The project progress can be tracked [https://github.com/orgs/sugarlabs/projects/1 here].&lt;br /&gt;
&lt;br /&gt;
;Sugar&lt;br /&gt;
: Target: Port entirely to Python 3&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar/tree/python3&lt;br /&gt;
: Status: While some critical issues still persist, most of the functionality is running and tested.&lt;br /&gt;
&lt;br /&gt;
;Sugar-Toolkit-Gtk3&lt;br /&gt;
: Target: Should be compatible with both Python 2 and Python 3, to support the large number of activities currently in Python 2&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-toolkit-gtk3/tree/python3-port&lt;br /&gt;
: Status: Mostly Complete; what remains is an entire project in itself of [https://github.com/orgs/sugarlabs/projects/4 porting the Telepathy Bindings].&lt;br /&gt;
Note: To test the toolkit without porting the telepathy bindings, please use the Python 3 bindings (note for release), https://github.com/pro-panda/telepathy3&lt;br /&gt;
&lt;br /&gt;
;Sugar-Datastore&lt;br /&gt;
: Target: Port entirely to Python 3&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-datastore/tree/python3-port&lt;br /&gt;
: Status: Complete(possible fix patches do come up while porting sugar); Fedora packaging and testing remains&lt;br /&gt;
&lt;br /&gt;
;Sugar-Artwork&lt;br /&gt;
: Target: Port entirely to Python 3 (use system empy bindings for Python 3)&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-artwork/tree/python3-port&lt;br /&gt;
: Status: Complete; Fedora packaging and testing remains&lt;br /&gt;
&lt;br /&gt;
;Sugar Desktop Activities&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! | Activity&lt;br /&gt;
! Status [WIP/Ported]&lt;br /&gt;
! Pull Request&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Log&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/log-activity/issues/9 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|JukeBox&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/jukebox-activity/pull/20 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Abacus&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/activity-abacus/pull/15 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Calculate&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/sugarlabs-calculate/issues/53 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Chat&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/chat/issues/13 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CowBulls&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/CowBulls-activity/issues/11 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Finance&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/finance-activity/issues/16 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hello-world&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/hello-world/issues/3 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Imageviewer&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/imageviewer-activity/issues/26 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Read&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/read-activity/issues/21 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Spirolaterals&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/spirolaterals/issues/12 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Terminal&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/terminal-activity/issues/29 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Write&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/write-activity/issues/24 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Nutrition&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/nutrition/issues/4 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Contributing to the Project ==&lt;br /&gt;
There are several ways of contributing to the project&lt;br /&gt;
; Port Telepathy bindings&lt;br /&gt;
: Telepathy does not have python 3 bindings and needs to be ported to its PyGObject bindings as a prerequisite for porting to Python 3&lt;br /&gt;
: See https://github.com/orgs/sugarlabs/projects/4&lt;br /&gt;
&lt;br /&gt;
; Test Debian Packages&lt;br /&gt;
: Debian packages for core modules here: https://github.com/Pro-Panda/sugar-packages&lt;br /&gt;
: Please install, test and report bugs, (or better, submit fix patches)&lt;br /&gt;
&lt;br /&gt;
; Fedora Packaging&lt;br /&gt;
: Make Fedora packages of core modules (WIP links above) and test them&lt;br /&gt;
&lt;br /&gt;
; Port Sugar Desktop Activities to Python 3:&lt;br /&gt;
: See the guide to port activities to Python 3: https://github.com/sugarlabs/sugar-docs/blob/master/src/python-porting-guide.md&lt;br /&gt;
&lt;br /&gt;
; Improve test coverage&lt;br /&gt;
: Sugar and the components lack in testing mechanisms and scripts. Our current test coverage is very basic and minimal. Improving the same is critical and the best time would be to so while Porting and testing the components&lt;br /&gt;
: Some test scripts are here -  https://github.com/Pro-Panda/sugar-python3-tests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* httplib.HTTP is not available in Python 3; use http.client.HTTPConnection instead&lt;br /&gt;
* cmp function does not exist in Python 3, use the cmp_to_key function; see https://docs.python.org/3/howto/sorting.html#sortinghowto&lt;br /&gt;
* list.sort function requires named parameters in Python 3&lt;br /&gt;
* hashlib.md5 requires bytes as an argument in Python 3&lt;br /&gt;
* sha_hash.update requires bytes as an argument in Python 3&lt;br /&gt;
* statvfs does not exist in Python 3, verify the Python 2 constant values and use them instead&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Python_2to3&amp;diff=101984</id>
		<title>Python 2to3</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Python_2to3&amp;diff=101984"/>
		<updated>2018-07-29T05:53:12Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Project Introduction ==&lt;br /&gt;
Sugar currently uses Python 2. Since support for python 2 is being drawn, we are porting our code to Python 3.&lt;br /&gt;
&lt;br /&gt;
It is one of the [https://wiki.sugarlabs.org/go/Goals/2018_Submissions/Migrate_all_core_Sugar_Labs_code_to_Python3 goals for Sugar Labs] for 2018, with a suggested timeframe of ~12-16 months for completing the project.&lt;br /&gt;
&lt;br /&gt;
The project was taken up by Sugar Labs in [https://wiki.sugarlabs.org/go/Summer_of_Code/2018 Google Summer of Code 2018]&lt;br /&gt;
&lt;br /&gt;
== Project Summary ==&lt;br /&gt;
The project progress can be tracked [https://github.com/orgs/sugarlabs/projects/1 here].&lt;br /&gt;
&lt;br /&gt;
;Sugar&lt;br /&gt;
: Target: Port entirely to Python 3&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar/tree/python3&lt;br /&gt;
: Status: While some critical issues still persist, most of the functionality is running and tested.&lt;br /&gt;
&lt;br /&gt;
;Sugar-Toolkit-Gtk3&lt;br /&gt;
: Target: Should be compatible with both Python 2 and Python 3, to support the large number of activities currently in Python 2&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-toolkit-gtk3/tree/python3-port&lt;br /&gt;
: Status: Mostly complete; what remains is an entire project in itself of [https://github.com/orgs/sugarlabs/projects/4 porting the Telepathy Bindings]&lt;br /&gt;
&lt;br /&gt;
;Sugar-Datastore&lt;br /&gt;
: Target: Port entirely to Python 3&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-datastore/tree/python3-port&lt;br /&gt;
: Status: Complete(possible fix patches do come up while porting sugar); Fedora packaging and testing remains&lt;br /&gt;
&lt;br /&gt;
;Sugar-Artwork&lt;br /&gt;
: Target: Port entirely to Python 3 (use system empy bindings for Python 3)&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-artwork/tree/python3-port&lt;br /&gt;
: Status: Complete; Fedora packaging and testing remains&lt;br /&gt;
&lt;br /&gt;
;Sugar Desktop Activities&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! | Activity&lt;br /&gt;
! Status [WIP/Ported]&lt;br /&gt;
! Pull Request&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Log&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/log-activity/issues/9 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|JukeBox&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/jukebox-activity/pull/20 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Abacus&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/activity-abacus/pull/15 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Calculate&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/sugarlabs-calculate/issues/53 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Chat&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/chat/issues/13 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CowBulls&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/CowBulls-activity/issues/11 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Finance&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/finance-activity/issues/16 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hello-world&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/hello-world/issues/3 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Imageviewer&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/imageviewer-activity/issues/26 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Read&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/read-activity/issues/21 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Spirolaterals&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/spirolaterals/issues/12 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Terminal&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/terminal-activity/issues/29 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Write&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/write-activity/issues/24 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Nutrition&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/nutrition/issues/4 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Contributing to the Project ==&lt;br /&gt;
There are several ways of contributing to the project&lt;br /&gt;
; Port Telepathy bindings&lt;br /&gt;
: Telepathy does not have python 2 bindings and needs to be ported to its PyGObject bindings as a prerequisite for porting to Python 3&lt;br /&gt;
: See https://github.com/orgs/sugarlabs/projects/4&lt;br /&gt;
&lt;br /&gt;
; Test Debian Packages&lt;br /&gt;
: Debian packages for core modules here: https://github.com/Pro-Panda/sugar-packages&lt;br /&gt;
: Please install, test and report bugs, (or better, submit fix patches)&lt;br /&gt;
&lt;br /&gt;
; Fedora Packaging&lt;br /&gt;
: Make Fedora packages of core modules (WIP links above) and test them&lt;br /&gt;
&lt;br /&gt;
; Port Sugar Desktop Activities to Python 3:&lt;br /&gt;
: See the guide to port activities to Python 3: https://github.com/sugarlabs/sugar-docs/blob/master/src/python-porting-guide.md&lt;br /&gt;
&lt;br /&gt;
; Improve test coverage&lt;br /&gt;
: Sugar and the components lack in testing mechanisms and scripts. Our current test coverage is very basic and minimal. Improving the same is critical and the best time would be to so while Porting and testing the components&lt;br /&gt;
: Some test scripts are here -  https://github.com/Pro-Panda/sugar-python3-tests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* httplib.HTTP is not available in Python 2; use http.client.HTTPConnection instead&lt;br /&gt;
* cmp function does not exist in Python 3, use the cmp_to_key function; see https://docs.python.org/3/howto/sorting.html#sortinghowto&lt;br /&gt;
* list.sort function requires named parameters in Python 3&lt;br /&gt;
* hashlib.md5 requires bytes as an argument in Python 3&lt;br /&gt;
* sha_hash.update requires bytes as an argument in Python 3&lt;br /&gt;
* statvfs does not exist in Python 3, verify the Python 2 constant values and use them instead&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=User:Pro-panda:gsoc-project&amp;diff=101983</id>
		<title>User:Pro-panda:gsoc-project</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=User:Pro-panda:gsoc-project&amp;diff=101983"/>
		<updated>2018-07-29T05:21:52Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Created page with &amp;quot;=== Project details === Implement Cross Version Python Support for Sugar Project summary and progress can be seen https://wiki.sugarlabs.org/go/Python_2to3  === Work Completed...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Project details ===&lt;br /&gt;
Implement Cross Version Python Support for Sugar&lt;br /&gt;
Project summary and progress can be seen https://wiki.sugarlabs.org/go/Python_2to3&lt;br /&gt;
&lt;br /&gt;
=== Work Completed ===&lt;br /&gt;
Pro-Panda&#039;s overall code contribution can be found [https://github.com/search?l=&amp;amp;o=desc&amp;amp;q=org%3Asugarlabs++author%3APro-Panda&amp;amp;s=&amp;amp;type=Issues here].&lt;br /&gt;
&lt;br /&gt;
==== Summary of my work GSoC work: ====&lt;br /&gt;
* Port Sugar Artwork to Python 3&lt;br /&gt;
* Port Sugar Toolkit to six&lt;br /&gt;
* Port Sugar Datastore to Python 3&lt;br /&gt;
* Port Sugar to Python 3 [WIP to some extent]&lt;br /&gt;
* Make Debian Packages for the core components&lt;br /&gt;
* Port 20 activities to Python 3, complete almost the entire fructose set&lt;br /&gt;
* Port Telepathy Bindings for 9 activities&lt;br /&gt;
* Port smaller components like sugargame, sugar-iconify, etc&lt;br /&gt;
* Make corresponding relevant changes in the documentation&lt;br /&gt;
* Working on general issues of improving activities or the core modules; outside of the GSoC Project&lt;br /&gt;
* Reviewing, Testing and merging Pull requests; outside of the GSoC Project&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Future Contributions ====&lt;br /&gt;
Currently, I will be occupied with internship interviews in my college for some time; I will continue contributing to Sugar Labs after that in whatever way I can.&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Python_2to3&amp;diff=101982</id>
		<title>Python 2to3</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Python_2to3&amp;diff=101982"/>
		<updated>2018-07-29T05:10:03Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: /* Port Sugar Labs&amp;#039; Python code to Python 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Project Introduction ==&lt;br /&gt;
Sugar currently uses Python 2. Since support for python 2 is being drawn, we are porting our code to Python 3.&lt;br /&gt;
&lt;br /&gt;
It is one of the [https://wiki.sugarlabs.org/go/Goals/2018_Submissions/Migrate_all_core_Sugar_Labs_code_to_Python3 goals for Sugar Labs] for 2018, with a suggested timeframe of ~12-16 months for completing the project.&lt;br /&gt;
&lt;br /&gt;
The project was taken up by Sugar Labs in [https://wiki.sugarlabs.org/go/Summer_of_Code/2018 Google Summer of Code 2018]&lt;br /&gt;
&lt;br /&gt;
== Project Summary ==&lt;br /&gt;
The project progress can be tracked [https://github.com/orgs/sugarlabs/projects/1 here].&lt;br /&gt;
&lt;br /&gt;
;Sugar&lt;br /&gt;
: Target: Port entirely to Python 3&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar/tree/python3&lt;br /&gt;
: Status: While some critical issues still persist, most of the functionality is running and tested.&lt;br /&gt;
&lt;br /&gt;
;Sugar-Toolkit-Gtk3&lt;br /&gt;
: Target: Should be compatible with both Python 2 and Python 3, to support the large number of activities currently in Python 2&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-toolkit-gtk3/tree/python3-port&lt;br /&gt;
: Status: Mostly complete; what remains is an entire project in itself of [https://github.com/orgs/sugarlabs/projects/4 porting the Telepathy Bindings]&lt;br /&gt;
&lt;br /&gt;
;Sugar-Datastore&lt;br /&gt;
: Target: Port entirely to Python 3&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-datastore/tree/python3-port&lt;br /&gt;
: Status: Complete(possible fix patches do come up while porting sugar); Fedora packaging and testing remains&lt;br /&gt;
&lt;br /&gt;
;Sugar-Artwork&lt;br /&gt;
: Target: Port entirely to Python 3 (use system empy bindings for Python 3)&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-artwork/tree/python3-port&lt;br /&gt;
: Status: Complete; Fedora packaging and testing remains&lt;br /&gt;
&lt;br /&gt;
;Sugar Desktop Activities&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! | Activity&lt;br /&gt;
! Status [WIP/Ported]&lt;br /&gt;
! Pull Request&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Log&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/log-activity/issues/9 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|JukeBox&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/jukebox-activity/pull/20 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Abacus&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/activity-abacus/pull/15 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Calculate&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/sugarlabs-calculate/issues/53 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Chat&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/chat/issues/13 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CowBulls&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/CowBulls-activity/issues/11 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Finance&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/finance-activity/issues/16 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hello-world&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/hello-world/issues/3 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Imageviewer&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/imageviewer-activity/issues/26 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Read&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/read-activity/issues/21 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Spirolaterals&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/spirolaterals/issues/12 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Terminal&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/terminal-activity/issues/29 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Write&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/write-activity/issues/24 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Nutrition&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/nutrition/issues/4 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Contributing to the Project ==&lt;br /&gt;
There are several ways of contributing to the project&lt;br /&gt;
; Port Telepathy bindings&lt;br /&gt;
: Telepathy does not have python 2 bindings and needs to be ported to its PyGObject bindings as a prerequisite for porting to Python 3&lt;br /&gt;
: See https://github.com/orgs/sugarlabs/projects/4&lt;br /&gt;
&lt;br /&gt;
; Test Debian Packages&lt;br /&gt;
: Debian packages for core modules here: https://github.com/Pro-Panda/sugar-packages&lt;br /&gt;
: Please install, test and report bugs, (or better, submit fix patches)&lt;br /&gt;
&lt;br /&gt;
; Fedora Packaging&lt;br /&gt;
: Make Fedora packages of core modules (WIP links above) and test them&lt;br /&gt;
&lt;br /&gt;
; Port Sugar Desktop Activities to Python 3:&lt;br /&gt;
: See the guide to port activities to Python 3: https://github.com/sugarlabs/sugar-docs/blob/master/src/python-porting-guide.md&lt;br /&gt;
&lt;br /&gt;
; Improve test coverage&lt;br /&gt;
: Sugar and the components lack in testing mechanisms and scripts. Our current test coverage is very basic and minimal. Improving the same is critical and the best time would be to so while Porting and testing the components&lt;br /&gt;
: Some test scripts are here -  https://github.com/Pro-Panda/sugar-python3-tests&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Python_2to3&amp;diff=101981</id>
		<title>Python 2to3</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Python_2to3&amp;diff=101981"/>
		<updated>2018-07-29T05:09:23Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Created page with &amp;quot;= Port Sugar Labs&amp;#039; Python code to Python 3 =  == Project Introduction == Sugar currently uses Python 2. Since support for python 2 is being drawn, we are porting our code to P...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Port Sugar Labs&#039; Python code to Python 3 =&lt;br /&gt;
&lt;br /&gt;
== Project Introduction ==&lt;br /&gt;
Sugar currently uses Python 2. Since support for python 2 is being drawn, we are porting our code to Python 3.&lt;br /&gt;
&lt;br /&gt;
It is one of the [https://wiki.sugarlabs.org/go/Goals/2018_Submissions/Migrate_all_core_Sugar_Labs_code_to_Python3 goals for Sugar Labs] for 2018, with a suggested timeframe of ~12-16 months for completing the project.&lt;br /&gt;
&lt;br /&gt;
The project was taken up by Sugar Labs in [https://wiki.sugarlabs.org/go/Summer_of_Code/2018 Google Summer of Code 2018]&lt;br /&gt;
&lt;br /&gt;
== Project Summary ==&lt;br /&gt;
The project progress can be tracked [https://github.com/orgs/sugarlabs/projects/1 here].&lt;br /&gt;
&lt;br /&gt;
;Sugar&lt;br /&gt;
: Target: Port entirely to Python 3&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar/tree/python3&lt;br /&gt;
: Status: While some critical issues still persist, most of the functionality is running and tested.&lt;br /&gt;
&lt;br /&gt;
;Sugar-Toolkit-Gtk3&lt;br /&gt;
: Target: Should be compatible with both Python 2 and Python 3, to support the large number of activities currently in Python 2&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-toolkit-gtk3/tree/python3-port&lt;br /&gt;
: Status: Mostly complete; what remains is an entire project in itself of [https://github.com/orgs/sugarlabs/projects/4 porting the Telepathy Bindings]&lt;br /&gt;
&lt;br /&gt;
;Sugar-Datastore&lt;br /&gt;
: Target: Port entirely to Python 3&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-datastore/tree/python3-port&lt;br /&gt;
: Status: Complete(possible fix patches do come up while porting sugar); Fedora packaging and testing remains&lt;br /&gt;
&lt;br /&gt;
;Sugar-Artwork&lt;br /&gt;
: Target: Port entirely to Python 3 (use system empy bindings for Python 3)&lt;br /&gt;
: WIP: https://github.com/Pro-Panda/sugar-artwork/tree/python3-port&lt;br /&gt;
: Status: Complete; Fedora packaging and testing remains&lt;br /&gt;
&lt;br /&gt;
;Sugar Desktop Activities&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
! | Activity&lt;br /&gt;
! Status [WIP/Ported]&lt;br /&gt;
! Pull Request&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Log&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/log-activity/issues/9 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|JukeBox&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/jukebox-activity/pull/20 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Abacus&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/activity-abacus/pull/15 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Calculate&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/sugarlabs-calculate/issues/53 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Chat&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/chat/issues/13 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|CowBulls&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/CowBulls-activity/issues/11 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Finance&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/finance-activity/issues/16 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Hello-world&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/hello-world/issues/3 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Imageviewer&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/imageviewer-activity/issues/26 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Read&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/read-activity/issues/21 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Spirolaterals&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/spirolaterals/issues/12 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Terminal&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/terminal-activity/issues/29 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Write&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/write-activity/issues/24 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|Nutrition&lt;br /&gt;
|Ported&lt;br /&gt;
|[https://github.com/sugarlabs/nutrition/issues/4 PR link]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Contributing to the Project ==&lt;br /&gt;
There are several ways of contributing to the project&lt;br /&gt;
; Port Telepathy bindings&lt;br /&gt;
: Telepathy does not have python 2 bindings and needs to be ported to its PyGObject bindings as a prerequisite for porting to Python 3&lt;br /&gt;
: See https://github.com/orgs/sugarlabs/projects/4&lt;br /&gt;
&lt;br /&gt;
; Test Debian Packages&lt;br /&gt;
: Debian packages for core modules here: https://github.com/Pro-Panda/sugar-packages&lt;br /&gt;
: Please install, test and report bugs, (or better, submit fix patches)&lt;br /&gt;
&lt;br /&gt;
; Fedora Packaging&lt;br /&gt;
: Make Fedora packages of core modules (WIP links above) and test them&lt;br /&gt;
&lt;br /&gt;
; Port Sugar Desktop Activities to Python 3:&lt;br /&gt;
: See the guide to port activities to Python 3: https://github.com/sugarlabs/sugar-docs/blob/master/src/python-porting-guide.md&lt;br /&gt;
&lt;br /&gt;
; Improve test coverage&lt;br /&gt;
: Sugar and the components lack in testing mechanisms and scripts. Our current test coverage is very basic and minimal. Improving the same is critical and the best time would be to so while Porting and testing the components&lt;br /&gt;
: Some test scripts are here -  https://github.com/Pro-Panda/sugar-python3-tests&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Summer_of_Code/2018&amp;diff=101824</id>
		<title>Summer of Code/2018</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Summer_of_Code/2018&amp;diff=101824"/>
		<updated>2018-05-29T22:10:07Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Fix blog link and update name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Selected Projects for summer 2018 ==&lt;br /&gt;
&lt;br /&gt;
;Rahul Bothra | Pro-Panda: Port Sucrose from Python 2 to Python 3 ([http://www.pro-panda.tech blog])&lt;br /&gt;
;Riya Lohia: Going Beyond Equal Temperament in Music Blocks ([https://medium.com/gsoc18-with-sugar-labs blog])&lt;br /&gt;
;Ritwik Abhishek: Music Blocks Widget Improvement ([https://musicblocks18.wordpress.com/ blog])&lt;br /&gt;
;Vaibhav Aren: Interactive Exercises for Turtle Blocks ([https://vaibhavdaren.wordpress.com/ blog])&lt;br /&gt;
;Aman Sharma: Sugarizer School Box ([https://amansharmablogblog.wordpress.com/2018/04/26/introduction-to-the-community/ blog])&lt;br /&gt;
;Vipul Gupta: Activity Migration ([https://mixstersite.wordpress.com/gsoc2018/ blog])&lt;br /&gt;
;Anmol Mishra: Port to Python 3 ([https://medium.com/anmolmishra-jiit blog])&lt;br /&gt;
;Iqra Muhammad: Sugarizer Primero ([https://iqragsoc.wordpress.com/ blog])&lt;br /&gt;
;Mankirat Singh: Sugarizer Exerciser Activity ([https://mankiratsinghtech.wordpress.com/2018/04/27/google-summer-of-code-2018/ blog])&lt;br /&gt;
;Rudra Sadhu: Migration of Activity wiki-pages to Git ([https://wiki.sugarlabs.org/go/Summer_of_Code/2018/attentive_migration_of_wiki_activity_pages_to_git project-details])([https://rdrsadhu.github.io/blog/gsoc2018/ blog]) [Weekly Meeting: Friday 16:00 CET (19:30 IST)]&lt;br /&gt;
;Yash Aragwal:Just say no to GTK+ 2 ([https://medium.com/@yashagrawal3/gsoc-18-with-sugar-labs-2d9bc733cf59 blog])&lt;br /&gt;
;Pratul Kumar:Beginner&#039;s Guide ([https://medium.com/@pratulkumar/gsoc-introduction-to-the-community-ed47e04e3051 blog])&lt;br /&gt;
&lt;br /&gt;
[https://summerofcode.withgoogle.com/organizations/6193990685163520/ Sugar Labs at GSoC 2018]&lt;br /&gt;
&lt;br /&gt;
=== Meetings ===&lt;br /&gt;
&lt;br /&gt;
We meet as a group in IRC every Friday at 22IST, 12:30ET, 16:30UTC. The meetings are logged at http://meeting.sugarlabs.org/sugar-meeting/meetings&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Project Ideas ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GSoC projects must involve some coding. Non-coding projects have been moved to the [[Summer of Code/2018/Archive|Non-Coding Projects Page]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; style=&amp;quot;border: 1px solid white; border-collapse: collapse; background: #f7effc;&amp;quot;&lt;br /&gt;
|-style=&amp;quot;background:#7409bc; color: white;&amp;quot;&lt;br /&gt;
!Title&lt;br /&gt;
!Mentor&lt;br /&gt;
!Project&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;|Python 3 port&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;|Devel Team&lt;br /&gt;
| align=left valign=top  style=&amp;quot;background:#fcfcfc;&amp;quot;|&lt;br /&gt;
;Brief explanation: Python 3 has been here for quite some time. We&#039;ve investigated how to migrate and now it is time to do it.&lt;br /&gt;
;Expected results: A Python 3 version of the Sugar toolkit, as well as the Sugar Desktop and a few activities.&lt;br /&gt;
;Knowledge prerequisites: Strong Python and GTK experience&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot; |Migration of wiki activity pages to git&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; |Activity team&lt;br /&gt;
| align=left valign=top |&lt;br /&gt;
;Brief explanation: We have 345 pages under [[Activities]] in this wiki. It would be more sustainable in the long run if these pages were embedded (in Markdown format) in their corresponding git repositories.&lt;br /&gt;
;Expected results: Definition of migration process; migration of the majority of these pages&lt;br /&gt;
;Knowledge prerequisites: Knowledge of Markdown and Mediawiki markup; experience with git.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;|GTK-4 exploration&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;|Devel Team&lt;br /&gt;
| align=left valign=top  style=&amp;quot;background:#fcfcfc;&amp;quot;|&lt;br /&gt;
;Brief explanation: GTK-4 is coming soon [https://mclasen.fedorapeople.org/gtk4-devconf2018.pdf]: probably in 2018. We need to be better prepared for the transition than we were for GTK-3.&lt;br /&gt;
;Expected results: Design of a workflow for transitioning from GTK-3 to GTK-4	&lt;br /&gt;
;Knowledge prerequisites: Strong Python and GTK experience&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot; |Internationalization and Localization&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; |Chris Leonard&lt;br /&gt;
Shivang Shekhar&lt;br /&gt;
| align=left valign=top |&lt;br /&gt;
;Brief explanation: A goal of Sugar Labs is to enable our users to experience Sugar in their own native language. See [[Translation_Proposal#ToDo:|Translation Proposal To Do List]] for details.  See [[Translation Team]] for framework description.&lt;br /&gt;
;Expected results: Work flow improvements for i18n&lt;br /&gt;
;Knowledge prerequisites: Some knowledge of Pootle; some scripting experience; Python and JavaScript&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;|Full-color icons&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;|Design team&amp;lt;br&amp;gt; Jaskirat Singh&amp;lt;br&amp;gt;perriefidelis&lt;br /&gt;
| align=left valign=top style=&amp;quot;background:#fcfcfc;&amp;quot;|&lt;br /&gt;
;Brief explanation: We have been discussing the implications of removing the duo-tone restriction on Sugar icons, allowing for full-color icons. We can likely use badges to compensate for any functionality we&#039;d lose. (See [https://medium.com/@sidhant/designing-interfaces-for-education-systems-with-sugar-labs-rethinking-icons-on-sugar-614120e7ec6f] as one example of how we might proceed.). Like if an activity has not closed yet so it will be shown through a badge appearing on an icon. Repo can be found here https://github.com/sugarlabs/sugar-toolkit-gtk3/tree/master/src/sugar3&lt;br /&gt;
;Expected results: A patch to Sugar that uses badges to manage the icon notifications such as activity, sharing, achievements and much more.&lt;br /&gt;
;Knowledge prerequisites: Knowledge of GTK; Python.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;|Learn to program in Turtle Blocks&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;|Walter Bender &amp;lt;br&amp;gt; Jaskirat Singh&amp;lt;br&amp;gt;&lt;br /&gt;
| align=left valign=top style=&amp;quot;background:#fcfcfc;&amp;quot;|&lt;br /&gt;
;Brief explanation: In much the same way that [https://www.codecademy.com/courses/programming-intro/0/1#!/exercises/0 ( example here )] walks newbies through the basics of programming in Javascript, it would be nice to walk newbies through the basics of Turtle Blocks. There is already a provision within Turtle Blocks for programatically creating and moving blocks and executing program stacks. So it would be a matter of developing the exercises.&lt;br /&gt;
;Expected results: Website for teaching and having exercises with Turtle Blocks.&lt;br /&gt;
;Knowledge prerequisites: Requires some familiarity with Logo programming and Python.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot; |Music Blocks optimizations&amp;lt;br&amp;gt;[[File:Music-Blocks.png|90px|thumb|center]]&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; | Walter Bender&lt;br /&gt;
| align=left valign=top |&lt;br /&gt;
;Brief explanation: Music Blocks has never been optimized in any way. It would be helpful to review the tone.js optimization recommendations, as well as build some unit tests to measure and improve the program itself.&lt;br /&gt;
;Expected results: A more robust and responsive Music Blocks.&lt;br /&gt;
;Knowledge prerequisites: Knowledge of JavaScript, unit testing&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;|Going Beyond Equal Temperament in Music Blocks&amp;lt;br&amp;gt;[[File:Music-Blocks.png|90px|thumb|center]]&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;| Walter Bender&amp;lt;br&amp;gt;Devin Ulibarri&amp;lt;br&amp;gt;Sachiko Nakajima&amp;lt;br&amp;gt;Marnen Laibow-Koser&lt;br /&gt;
| align=left valign=top style=&amp;quot;background:#fcfcfc;&amp;quot;|&lt;br /&gt;
;Brief explanation: Most modern music systems are designed around [https://en.wikipedia.org/wiki/Equal_temperament equal temperament]. But there are many ways to [https://en.wikipedia.org/wiki/Musical_temperament chose and tune notes] in a musical system that offer different expressive characteristics.  See also [https://github.com/walterbender/musicblocks/labels/temperament MB issues for temperament], [https://owncloud.libretools.com/index.php/s/2GtAhkvQpt3fYfF Articles about temperament, scales, and tuning] and [https://owncloud.libretools.com/index.php/s/PmPfZ1yMhimQomG various materials related to temperament (.tb files that achieve temperament with existing MB features, videos of those files being performed, notes)]&lt;br /&gt;
;Expected results: Extend Music Blocks such that different approaches to temperament are available to the user.&lt;br /&gt;
;Knowledge prerequisites: Knowledge of JavaScript, music theory&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot; |Just say no to GTK2&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot;| Ignacio Rodriguez&amp;lt;br&amp;gt;Cristian Garcia&amp;lt;br/&amp;gt;Abhijit Patel&amp;lt;br&amp;gt;Ibiam Chihurumnaya&amp;lt;br/&amp;gt;Hrishi Patel&lt;br /&gt;
| align=left valign=top style=&amp;quot;background:#f7effc;&amp;quot;|&lt;br /&gt;
;Brief explanation: GTK2 and GST0.10 are end of life. We need to upgrade the remaining activities with these dependencies.&lt;br /&gt;
;Expected results: New versions of at least 25 existing Sugar activities.&lt;br /&gt;
;Knowledge prerequisites: Knowledge of GTK, GST, and Python&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot; |Sugar Labs Social&amp;lt;br&amp;gt;[[File:Social Site.jpg|90px|thumb|center]]&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;| Jaskirat Singh&amp;lt;br&amp;gt;Samson Goddy&amp;lt;br&amp;gt;Hrishi Patel&amp;lt;br&amp;gt;Shivang Shekhar&amp;lt;br&amp;gt;perriefidelis&lt;br /&gt;
Abdulazeez Abdulazeez&lt;br /&gt;
| align=left valign=top style=&amp;quot;background:#fcfcfc;&amp;quot;|&lt;br /&gt;
;Brief explanation: &#039;&#039;&#039;[https://github.com/geekrypter/Sugar-Labs-Social Sugar Labs Social]&#039;&#039;&#039; is a website project which should serve a purpose to help people understand and discuss project(s) around Sugar Labs. The goal of this project is to attract Teachers, Parents, Developers and fully communicate together in one platform.   : It&#039;s a social website that can be used to attract maximum users and everything ( Blogs, New projects, Software, Activities, etc) can be uploaded on it which will attract more user and create their interest. : A competitive proposal must include some evidence that the approach taken will result in some use -- just because we build it doesn&#039;t mean they will come.&lt;br /&gt;
;Expected results: It should have user logins, feed and a blog([https://medium.com/ medium] like) that can be over viewed by people around the world&lt;br /&gt;
;Knowledge prerequisites: Good Layout designing and coding experience with backend (Django, JavaScript, HTML/CSS, Mongo).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot; |Lilypond Methodical Improvements to how Music Blocks generates Lilypond output &amp;lt;br&amp;gt;[[File:Music-Blocks.png|90px|thumb|center]]&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; | Walter Bender&amp;lt;br&amp;gt;Devin Ulibarri&amp;lt;br&amp;gt;Marnen Laibow-Koser&lt;br /&gt;
| align=left valign=top |&lt;br /&gt;
;Brief explanation: Music Blocks is capable of exporting [https://www.lilypond.org Lilypond] code of which general instructions can be found [https://github.com/walterbender/musicblocks/tree/master/guide#BEYOND-MUSIC-BLOCKS here in the Music Blocks guide] and its [https://github.com/walterbender/musicblocks/ source code can be found here]. We would like to improve existing code where needed and implement needed features in a methodical way, which means we must 1) document how the Music Blocks source code works for current and future developers to learn and benefit from and 2) project manage this portion of Music Blocks development (e.g. &amp;quot;what works&amp;quot; and &amp;quot;what needs to be done&amp;quot;. [https://owncloud.libretools.com/index.php/s/tgJAX5yMEzQsENf An example of a draft of a simple type of this analysis exists for you to start from.]), as well as 3) implement and improve features.&lt;br /&gt;
;Expected results: Implement and improve lilypond export features; Detailed documentation created for developer audience that details how Music Blocks exports to Lilypond; documentation to help manage what needs to be completed.&lt;br /&gt;
;Knowledge prerequisites: Literacy in reading music; functional knowledge of Lilypond code (some of your own scores would be nice); Organizational and Project Management Skills; JavaScript&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;|Music Blocks&#039; First Steps for Robotics &amp;lt;br&amp;gt;[[File:Music-Blocks.png|90px|thumb|center]]&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;| Walter Bender&amp;lt;br&amp;gt;Devin Ulibarri&amp;lt;br/&amp;gt;Hrishi Patel&amp;lt;br/&amp;gt;Rishabh Thaney&lt;br /&gt;
| align=left valign=top style=&amp;quot;background:#fcfcfc;&amp;quot;|&lt;br /&gt;
;Brief explanation: What is needed to integrate Music Blocks with Robotics? This project is 1) to experiment with existing technologies to see what is already possible, 2) develop features (e.g. plugins, hardware modifications) needed to make interfacing possible, and 3) document the entire process and next steps&lt;br /&gt;
;Expected results: A working method for interfacing with a simple robot; additional features within MB to ease interfacing; and full documentation of how to recreate successful projects (that a classroom could use); communication (we do not want to guess what experiments you are doing by yourself--do not be shy to send emails, videos, pictures DAILY!!!)&lt;br /&gt;
;Knowledge prerequisites: Understanding of JavaScript (Music Blocks source code) and robotics (no particular method requested, just make sure it is free/libre); demonstrable documentation and self-management skills; NOTE: we value quality, clear ideas over expensive or pretty robots&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot; |Create Examples, Compositions, and New Experiments Every Day! &amp;lt;br&amp;gt;[[File:Music-Blocks.png|90px|thumb|center]]&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; | Walter Bender&amp;lt;br&amp;gt;Devin Ulibarri&amp;lt;br&amp;gt;Sachiko Nakajima&lt;br /&gt;
| align=left valign=top |&lt;br /&gt;
;Brief explanation: [https://walterbender.github.io/musicblocks/ Music Blocks] has some examples already, but it would be nice to have one ambitious student really work for the summer to make new creative, thoughtful code everyday. (You will be expected to code in the Music Blocks language on a daily basis.) Secondary, but important goals, are bug reports when bugs are found, feature suggestions, and overall good and frequent communication with the Music Blocks team.&lt;br /&gt;
;Expected results: Quality examples sent daily; variety of styles; runs entire gamut in terms of blocks used (we want a number of great examples for each and every block feature); organized documentation of all examples created, which can be finalized in the final weeks of GSoC&lt;br /&gt;
;Knowledge prerequisites: Understanding of Music Blocks as a programming language; A good proposal is one that has a well-thought out and detailed list of music projects for each day of GSoC (time-frames, blocks used, musical styles, name of music to be transcribed); experience with music and composition/theory is a definite plus.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;|Music Blocks UI Improvements and Implementation &amp;lt;br&amp;gt;[[File:Music-Blocks.png|90px|thumb|center]]&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;| Walter Bender&amp;lt;br&amp;gt;Devin Ulibarri&amp;lt;br&amp;gt;Hrishi Patel&amp;lt;br&amp;gt; Jaskirat Singh&amp;lt;br&amp;gt;perriefidelis&lt;br /&gt;
| align=left valign=top style=&amp;quot;background:#fcfcfc;&amp;quot;|&lt;br /&gt;
;Brief explanation: [https://walterbender.github.io/musicblocks/ Music Blocks] has a good enough UI, but there are open issues remaining and it would be nice if a person with a high level of understanding of graphics and style were to proposal and implement changes that unify the entire look and feel of Music Blocks.&lt;br /&gt;
;Expected results: Visually unified, beautiful and intuitive Music Blocks interface. Documentation to benefit future contributors to understand &amp;quot;what Music Blocks style is&amp;quot; (obviously this may change in the future, but a thoughtful rationale for the new style is expected).&lt;br /&gt;
;Knowledge prerequisites: Understanding of CSS, JavaScript, and HTML. Published work on UI (links to code, websites, etc)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot; |Scales/Modes/Keys Design Improvements and Implementation &amp;lt;br&amp;gt;[[File:Music-Blocks.png|90px|thumb|center]]&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; | Walter Bender&amp;lt;br&amp;gt;Devin Ulibarri&amp;lt;br&amp;gt;Marnen Laibow-Koser&amp;lt;br&amp;gt;Sachiko Nakajima&amp;lt;br&amp;gt;perriefidelis&amp;lt;br&amp;gt;Jaskirat Singh&lt;br /&gt;
| align=left valign=top |&lt;br /&gt;
;Brief explanation: There are features in [https://github.com/walterbender/musicblocks/tree/master/guide#3213-setting-voice-and-keys MB for exploring modes/scales/keys which can are referenced in the guide]. However, we suspect that there are better ways to organize keys. This project would be to reimagine how MB organizes pitches. We recommend that you read the discussions that have taken place already on GitHub as well as research how keys work as well as [https://owncloud.libretools.com/index.php/s/2GtAhkvQpt3fYfF scholarly articles about temperament, scales, and tuning]. Keep in mind that we would like to prepare for the possibility of chromatic pitch spaces that are not 12--for example, a chroma of 5 or 7 or 13, etc. What features and widgets are needed?&lt;br /&gt;
;Expected results: Detailed documentation created for developer audience that specifies 1) proposed features and overall design, 2) purpose of design choices, 3) audit of code (e.g. What changes to our current approach may be necessary? Are there libraries that may be useful?) 4) widget design proposal as well as MB code design proposal.&lt;br /&gt;
;Knowledge prerequisites: Understanding of Music Theory and/or group (or set) theory. Please read the articles at https://owncloud.libretools.com/index.php/s/2GtAhkvQpt3fYfF We are looking for candidates that can make a simple and effective design that can be implemented in JavaScript.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;|Create UI features for music analysis and visualization &amp;lt;br&amp;gt;[[File:Music-Blocks.png|90px|thumb|center]]&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;| Walter Bender&amp;lt;br&amp;gt;Devin Ulibarri&amp;lt;br&amp;gt;Sachiko Nakajima&amp;lt;br&amp;gt;perriefidelis &lt;br /&gt;
| align=left valign=top style=&amp;quot;background:#fcfcfc;&amp;quot;|&lt;br /&gt;
;Brief explanation: Music Blocks does not yet have a robust set of tools to help the user analyze their music (e.g. highest pitch, lowest pitch, pitches used, keys, musical form, intervals etc.). Additionally, users would very much benefit from features to help them visualize the way their music is constructed. Perhaps we could even create some features to help the user choose a style of music and the analysis highlights movements that violate that style&#039;s particular rules.&lt;br /&gt;
;Expected results: New Features.&lt;br /&gt;
;Knowledge prerequisites: Literacy in reading music; Music Theory knowledge; UI knowledge; JavaScript knowledge&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot; |Music Blocks Musical Ornaments Features &amp;lt;br&amp;gt;[[File:Music-Blocks.png|90px|thumb|center]]&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; | Walter Bender&amp;lt;br&amp;gt;Devin Ulibarri&amp;lt;br&amp;gt;Sachiko Nakajima&amp;lt;br&amp;gt;Marnen Laibow-Koser&lt;br /&gt;
| align=left valign=top |&lt;br /&gt;
;Brief explanation: The neighbor block feature is the first of a series of musical ornament features. There are many more possibilities, some of which are described [https://github.com/walterbender/musicblocks/issues/909 in issue 909]. The project would be to implement and document these features as well as to create example programs.&lt;br /&gt;
;Expected results: New Features, documentation, and new example programs for each new feature.&lt;br /&gt;
;Knowledge prerequisites: Music Theory knowledge; JavaScript knowledge; knowledge of Music Blocks and tone.js internals (please research)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;|Music Blocks Widget Improvements &amp;lt;br&amp;gt;[[File:Music-Blocks.png|90px|thumb|center]]&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;| Walter Bender&amp;lt;br&amp;gt;Devin Ulibarri&amp;lt;br&amp;gt;Sachiko Nakajima&amp;lt;br&amp;gt;Marnen Laibow-Koser&lt;br /&gt;
| align=left valign=top style=&amp;quot;background:#fcfcfc;&amp;quot;|&lt;br /&gt;
;Brief explanation: Music Blocks has a number of features to help users conceptualize musical concepts, which also help to create code. Please see [https://github.com/walterbender/musicblocks/tree/master/guide#widgets the guide for more]. There are a number of widgets that have not been integrated at all as well. This project would be to 1) fix widget bugs, 2) implement unfinished features ([https://github.com/walterbender/musicblocks/issues?utf8=%E2%9C%93&amp;amp;q=is%3Aissue+is%3Aopen+widgets+ see issues]), and 3) document and fully integrate these new features and improve existing features. [https://github.com/walterbender/musicblocks/issues/663 is also a related feature]&lt;br /&gt;
;Expected results: New Features, fixes, documentation, and new example programs for each new feature.&lt;br /&gt;
;Knowledge prerequisites: Music Theory knowledge; JavaScript knowledge; knowledge of Music Blocks and tone.js internals (please research)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot; |Sugarizer School Box&amp;lt;br&amp;gt;[[File:Sugarizerschoolbox.jpg|90px|thumb|center]]&lt;br /&gt;
|valign=top width=&amp;quot;15%&amp;quot; |Michaël Ohayon&amp;lt;br&amp;gt;Lionel Laské&amp;lt;br/&amp;gt;Hrishi Patel&amp;lt;br/&amp;gt;Rishabh Thaney&lt;br /&gt;
Shivang Shekhar&lt;br /&gt;
| align=left valign=top|&lt;br /&gt;
;Brief explanation&lt;br /&gt;
:[https://sugarizer.org Sugarizer] is the JavaScript version of Sugar, making education available of many platforms from web to mobile.:The app is composed by both a client side and a server side.&lt;br /&gt;
:The idea of this project is to develop a package to simplify deployment of Sugarizer in schools.&lt;br /&gt;
: This package will take two forms:&lt;br /&gt;
: 1 - An image for Raspberry Pi that could be flashed on a sd card that could automatically start a sugarizer server at boot and displays sugarizer client on the Pi. The server will be accessible by other devices from the local network. So the teacher has just to plug the RaspberryPI to expose a WiFi and the Sugarizer Server API/WebApp. So any computer connected to this WiFi could use Sugarizer Server WebApp and any tablet with Sugarizer App connected to this WiFi could benefit to collaboration, presence and backup its content on the server.&lt;br /&gt;
: 2 - Create one click to deploy scripts, to deploy a full Sugarizer stack on popular providers such as Amazon AWS or Heroku. So anyone could deploy a new Sugarizer Server instance on one of popular cloud platform without the need to dig into a complex setup process.&lt;br /&gt;
;Expected results:Raspberry Pi image files. Deployment scripts.&lt;br /&gt;
;Knowledge prerequisites:[https://github.com/llaske/sugarizer-server Sugarizer Server] knowledge, Linux system administration knowledge, bash scripting capabilities, Docker enthusiasm. (This project may require to download many system files)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;|Sugarizer Exerciser activity&amp;lt;br&amp;gt;[[File:Sugarizerexerciser.jpg|90px|thumb|center]]&lt;br /&gt;
|valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;|Lionel Laské&amp;lt;br&amp;gt;Michaël Ohayon&amp;lt;br&amp;gt;Jaskirat Singh&lt;br /&gt;
| align=left valign=top style=&amp;quot;background:#fcfcfc;&amp;quot;|&lt;br /&gt;
;Brief explanation&lt;br /&gt;
:[https://sugarizer.org Sugarizer] is the JavaScript version of Sugar, making education available of many platforms from web to mobile.&lt;br /&gt;
:The idea of this project is to create a new Sugarizer activity to allow users to create exercise and let other users play to this exercise. &lt;br /&gt;
:The activity will propose different templates for exercises. Typical exercises could be multiple-choice question, reordering a list of items, cloze text, group assignment, ...&lt;br /&gt;
:Once created, the exercise could be played locally or shared on the network using Sugarizer presence. At the end of the exercise a graph will give results for each participants.&lt;br /&gt;
:The activity should allow to integrate multimedia element (images, sounds, videos) coming from the Journal. The activity should as simple as possible so even a child should be able to create an exercise and share it.&lt;br /&gt;
:Like all Sugarizer activity, the activity should: adopt the Sugar UI, be responsive (work on any screen size), work with the keyboard and with the mouse (to support touch screen), use journal and use localization. &lt;br /&gt;
:Features inspiration could be found on [https://learningapps.org LearningApps], [https://www.google.com/forms/ Google Forms], [https://www.limesurvey.org LimeSurvey], ...&lt;br /&gt;
;Expected results:A Sugarizer activity.&lt;br /&gt;
;Knowledge prerequisites: HTML/JavaScript, UI Design, [https://github.com/llaske/sugarizer/blob/dev/docs/tutorial.md Sugarizer Development Tutorial]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot;|Music Blocks export &amp;lt;br&amp;gt;[[File:Music-Blocks.png|90px|thumb|center]]&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#f7effc&amp;quot;| Walter Bender&amp;lt;br&amp;gt;Devin Ulibarri&amp;lt;br&amp;gt;Sachiko Nakajima &lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot; |&lt;br /&gt;
;Brief explanation: Music Blocks is essentially a Logo interpreter. It would be great to be able to export Logo from Music Blocks. (We need to find a Logo that can handle the basic synthesizer needs to make it relevant.)&lt;br /&gt;
;Expected results: A Logo export that is coupled to a music-enabled Logo interpreter.&lt;br /&gt;
;Knowledge prerequisites: Literacy in reading music; Music Theory knowledge; UI knowledge; Logo and JavaScript knowledge&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot;|Music Blocks inline documentation &amp;lt;br&amp;gt;[[File:Music-Blocks.png|90px|thumb|center]]&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc&amp;quot;| Walter Bender&amp;lt;br&amp;gt;Devin Ulibarri&amp;lt;br&amp;gt;Sachiko Nakajima &lt;br /&gt;
| align=left valign=top style=&amp;quot;background:#fcfcfc;&amp;quot;|&lt;br /&gt;
;Brief explanation: There are three types of documentation for Music Blocks: documentation about how individual blocks work; short coding examples; and lesson plans. This project is about the first two. We can add inline comments to each block as it is defined in basicblocks.js from which help can be autogenerated for each block. And we can utilize the &amp;quot;make block&amp;quot; mechanism to generate on-the-fly examples of how to use blocks in combination to achieve different musical goals. The former will require some JavaScript programming; the latter, Music Blocks programming.&lt;br /&gt;
;Expected results: In-line documentation for each block as well as in-line Music Blocks-coded examples of the core music ideas.&lt;br /&gt;
;Knowledge prerequisites: UI knowledge; JavaScript knowledge; some background in music.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot;|Making a Beginner Guide&lt;br /&gt;
| valign=top width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot;| Jaskirat Singh&amp;lt;br/&amp;gt;Hrishi Patel&amp;lt;br/&amp;gt;Rishabh Thaney&amp;lt;br/&amp;gt;Shivang Shekhar&amp;lt;br/&amp;gt;Samson Goddy&amp;lt;br/&amp;gt;Abdulazeez Abdulazeez&lt;br /&gt;
| align=left valign=top style=&amp;quot;background:#f7effc;&amp;quot;|&lt;br /&gt;
;Brief explanation: We don&#039;t have a beginner guide for the newcomers to the Sugar labs Community. It would be great to guide them by guiding them how to contribute through making these &amp;quot;form where to start? , What to start? , How to start? , Where to submit? &amp;quot; .  An example is the Coala [http://api.coala.io/en/latest/Developers/Newcomers_Guide.html Newcomers&#039; Guide] which is built from [https://github.com/coala/coala/blob/6dae06082017587a260189a787db9cfdc84a148b/docs/Developers/Newcomers_Guide.rst markdown source].  The goal of this task is to Help newcomers to get introduce in easy way to the world of Sugar Labs also make a dasboard for the users so they can get about developed and developing areas. Their contribution can be seen also their presence can be seen with the community.&lt;br /&gt;
;Expected results: A set of website pages and also documentation in Pdf form with this the problems of newcomers about their contribution will be solved and they can work easily. It is essential to this project that there is a credible maintenance regime to ensure it is easy to keep it up to date after GSoC is completed.&lt;br /&gt;
;Knowledge prerequisites:  HTML, CSS, JavaScript(interactive) , BootStrap(responsive nav compatible on mobile devices also), PHP(dashboard), Github workflow, Markdown/up for documentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; style=&amp;quot;border: 1px solid white; border-collapse: collapse; background: #f7effc;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot; |Scratch 3.0 to Sugar Desktop&amp;lt;br&amp;gt;[[File:Scratch.png|centre|thumb|99x99px]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#fcfcfc&amp;quot; | Walter Bender&amp;lt;br&amp;gt;Samson Goddy &lt;br /&gt;
Hrishi Patel&amp;lt;br&amp;gt;Ibiam Chihurumnaya&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; style=&amp;quot;background:#fcfcfc;&amp;quot; |&lt;br /&gt;
;Brief explanation: [https://scratch.mit.edu/ Scratch] is a programming environment for kids. The goal of this project is to make bring back the [[Activities/Scratch|Scratch activity]] to the Sugar Desktop. Scratch 3.0 was created with HTML 5 using [https://developers.google.com/blockly/ Google’s blocky]. &lt;br /&gt;
:# Port scratch 3.0 as a Sugar activity using method [https://github.com/sugarlabs/sugar-docs/blob/master/src/web-activity.md 1] or [https://github.com/walterbender/turtle-blocks-embedded-activity 2]. Method 1, a web activity that can run on the Sugar Desktop. While method 2, an embedded activity that can run inside browser activity. There have been some development of [https://github.com/EmilyOng/embedded-scratch-activity scratch to sugar] and a yet to release version of [https://github.com/EmilyOng/Scratch.activity scratch in Sugarizer].&lt;br /&gt;
:# Make the scratch libraries to work completely offline, so a user can import sprite without have issues of internet connection. A possible way is to fork the [https://github.com/LLK/scratch-storage scratch-storage] and [https://github.com/LLK/scratch-gui scratch-gui]  modules to make them work offline by linking the libraries to local assets on the filesystem.  https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers   https://hackernoon.com/service-worker-one-fallback-offline-image-for-any-aspect-ratio-b427c0f897fb&lt;br /&gt;
;Expected results: A stable working Scratch 3 on Sugar Desktop.: User  to &amp;quot;save project&amp;quot; within the scratch activity into the journal, making it easy to resume project.&lt;br /&gt;
: Make the Scratch activity work completely offline stated at 2.&lt;br /&gt;
;Knowledge prerequisites: Python, GTK, JavaScript knowledge&lt;br /&gt;
|}&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; style=&amp;quot;border: 1px solid white; border-collapse: collapse; background: #f7effc;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot; |Sugarizer Primero (Sugarizer1°)&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;15%&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot; | Caryl Bigenho&lt;br /&gt;
Samson Goddy&lt;br /&gt;
| align=&amp;quot;left&amp;quot; valign=&amp;quot;top&amp;quot; style=&amp;quot;background:#f7effc;&amp;quot; |&lt;br /&gt;
;Brief explanation: Sugarizer is a large collection of many Activities suitable for general audiences on many devices. The goal of this project is to package a subset of the Sugarizer Activities (Maximum of 5) for children 4-7 (grades Pre-K-2) with a young child-friendly UI/UX experience suitable devices. Many of the graphics in the interfaces will be re-designed to accommodate non-readers and very young children who are still developing their fine motor skills. One new Activity for intuitive math concepts will also be developed similar to [https://en.wikipedia.org/wiki/Cuisenaire_rods Cuisenaire Rods]. Sugarizer1° will be non-language dependent so translations will not be needed.&lt;br /&gt;
;Expected results: At the end of the summer project, a prototype of Sugarizer1° will be ready for beta testing by children, parents, and educators. .&lt;br /&gt;
;Knowledge prerequisites:  Javascript, HTML, CSS and some knowledge of layout and design. A familiarity of how young children play and learn will also be helpful.&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting&amp;diff=101676</id>
		<title>Features/GTK3/Porting</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting&amp;diff=101676"/>
		<updated>2018-04-06T17:15:42Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Porting an existing activity to GTK+ 3=&lt;br /&gt;
This is a guide to porting an existing activity from GTK+ 2 to [http://developer.gnome.org/gtk3/stable/ GTK+ 3]. It also shows the changes to use the new Sugar toolkit that also now uses [[Features/GTK3|GTK+ 3]]. This guide uses the [https://github.com/sugarlabs/hello-world hello-world] activity as a simple example.&lt;br /&gt;
&lt;br /&gt;
Here are some instances of porting activities, for reference:&lt;br /&gt;
* [https://github.com/sugarlabs/biorhythm/commit/c16de3b70cce2cc6f8af933e2b062c844a47c144/ Biorhythm]&lt;br /&gt;
* [https://github.com/sugarlabs/peru-learns-english-activity/commit/caa2cde526b3823a5a1f7d200a76ad5bc3502b0e Peru Learns English, includes GStreamer and GST update]&lt;br /&gt;
* [https://github.com/sugarlabs/jump/commit/b75410d2879d9829df942726f5465b7cf5a9d98d Port of Jump Activity]&lt;br /&gt;
* [https://github.com/sugarlabs/iknowMadagascar/commit/44ba42645ac4fcd9e06b4add7fa3b6ce2e0d9c3d Port of I-know-Madagascar]&lt;br /&gt;
&lt;br /&gt;
=Steps to Port an Activity to GTK+ 3=&lt;br /&gt;
#Read the [http://wiki.sugarlabs.org/go/Features/GTK3 Sugar Official Wiki]&lt;br /&gt;
#Resolve any existing pull requests before porting to avoid conflicts at a later stage.&lt;br /&gt;
#Run this [http://git.gnome.org/browse/pygobject/tree/pygi-convert.sh script] that will convert automatically things as much as it can. This is to avoid some stressful manually conversions that a &amp;quot;simple script&amp;quot; can do using &#039;&#039;sed&#039;&#039; :)&lt;br /&gt;
#Follow the [[Development Team/Code guidelines|Code Guidelines]] during all the porting process&lt;br /&gt;
#Make the API changes in sugar-toolkit-gtk3&lt;br /&gt;
#Write comments on the code, by adding &#039;&#039;&#039;# README:&#039;&#039;&#039;, &#039;&#039;&#039;# TODO:&#039;&#039;&#039; and &#039;&#039;&#039;# FIXME:&#039;&#039;&#039; explaining what are the problems that you are having with that chunk of code. Put a link if it&#039;s necessary&lt;br /&gt;
&lt;br /&gt;
==API changes in sugar-toolkit ==&lt;br /&gt;
* The namespace is changed from &amp;lt;code&amp;gt;sugar&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;sugar3&amp;lt;/code&amp;gt;, trying to reflect that GTK+ 3 is the underlying technology.&lt;br /&gt;
* The keep button has been removed&lt;br /&gt;
* The old-style toolbar has been removed&lt;br /&gt;
*&amp;lt;code&amp;gt;set_toolbar_box&amp;lt;/code&amp;gt; is used instead of &amp;lt;code&amp;gt;set_toolbox&amp;lt;/code&amp;gt; (see in [http://git.sugarlabs.org/~walter/abacus/walter-cairo/commit/6871dd340a89ade3b5361457e1bd1d58276a8efc Abacus])&lt;br /&gt;
* Remove import of deprecated ActivityToolbox (see [http://git.sugarlabs.org/hello-world/mainline/commit/22060a3063b2d6fd38d6b1cd8d44946170255af3 hello-world])&lt;br /&gt;
* Support for &amp;lt;code&amp;gt;service_name&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; tags in activity.info has been removed. Use &amp;lt;code&amp;gt;bundle_id&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;service_name&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; (see in [http://git.sugarlabs.org/record/mainline/commit/6e8968c71e474e2d8d86886badf5cf7d70217dc5 Record])&lt;br /&gt;
* &amp;lt;code&amp;gt;sugar3.activity.Activity&amp;lt;/code&amp;gt; does not have the &#039;&#039;window&#039;&#039; attribute. Use the &amp;lt;code&amp;gt;.get_window()&amp;lt;/code&amp;gt; method instead.&lt;br /&gt;
&lt;br /&gt;
==Port the activity from GTK+ 2 to GTK+ 3==&lt;br /&gt;
To start, change the importing instruction for GTK from&lt;br /&gt;
 import gtk&lt;br /&gt;
to&lt;br /&gt;
 import gi&lt;br /&gt;
 gi.require_version(&#039;Gtk&#039;, &#039;3.0&#039;)&lt;br /&gt;
 from gi.repository import Gtk&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;code&amp;gt;require_version&amp;lt;/code&amp;gt; needs to called only the first time when GTK is being imported.&lt;br /&gt;
&lt;br /&gt;
Similar imports that may be used are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from gi.repository import Gdk, Pango, Gobject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then you have to change each call that involves GTK, for example creating a button will look now like this:&lt;br /&gt;
 button = Gtk.Button()&lt;br /&gt;
&lt;br /&gt;
A simple hello world program in GTK+ 3 looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from gi.repository import Gtk&lt;br /&gt;
&lt;br /&gt;
def _destroy_cb(widget, data=None):&lt;br /&gt;
    Gtk.main_quit()&lt;br /&gt;
&lt;br /&gt;
w = Gtk.Window()&lt;br /&gt;
w.connect(&amp;quot;destroy&amp;quot;, _destroy_cb)&lt;br /&gt;
label = Gtk.Label(&#039;Hello World!&#039;)&lt;br /&gt;
w.add(label)&lt;br /&gt;
w.show_all()&lt;br /&gt;
&lt;br /&gt;
Gtk.main()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The changes that were needed to port the hello-world activity can be seen in [https://github.com/sugarlabs/hello-world/commit/508e1c518b56cbde5508e560c8a2ff38a3518583 this commit.]&lt;br /&gt;
====Simple example on creating a toolbar====&lt;br /&gt;
One of Sugar&#039;s activity most unique user interface includes the toolbar. In order to reference the relevant modules and graphics, the sugar3 library has to be imported. These are the relevant ones that would enable us to create a simple toolbar containing the activity button and the stop button.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sugar3.activity import activity&lt;br /&gt;
from sugar3.graphics.toolbarbox import ToolbarBox&lt;br /&gt;
from sugar3.activity.widgets import ActivityToolbarButton&lt;br /&gt;
from sugar3.activity.widgets import StopButton&lt;br /&gt;
from sugar3.graphics.toolbarbox import ToolbarButton&lt;br /&gt;
from sugar3.graphics import style&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since the ActivityToolbar() module has been deprecated, the toolbar can now be called using&lt;br /&gt;
 ToolbarBox()&lt;br /&gt;
Then, from the ToolbarBox(), include the ActivityButton and StopButton. In order for the StopButton to be align to the right as per Sugar activity interface, a separator has to be included as well.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
toolbar_box = ToolbarBox()&lt;br /&gt;
&lt;br /&gt;
activity_button = ActivityToolbarButton(self)&lt;br /&gt;
toolbar_box.toolbar.insert(activity_button, 0)&lt;br /&gt;
activity_button.show()&lt;br /&gt;
&lt;br /&gt;
separator = Gtk.SeparatorToolItem()&lt;br /&gt;
separator.props.draw = False&lt;br /&gt;
separator.set_expand(True)&lt;br /&gt;
toolbar_box.toolbar.insert(separator, -1)&lt;br /&gt;
separator.show()&lt;br /&gt;
&lt;br /&gt;
stop_button = StopButton(self)&lt;br /&gt;
toolbar_box.toolbar.insert(stop_button, -1)&lt;br /&gt;
stop_button.show()&lt;br /&gt;
self.set_toolbar_box(toolbar_box)&lt;br /&gt;
toolbar_box.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tools===&lt;br /&gt;
There are tools to help you do the porting. There is a script in the pygobject repository for porting called [http://git.gnome.org/browse/pygobject/tree/pygi-convert.sh pygi-convert.sh], more info about the script can be found in [http://live.gnome.org/PyGObject/IntrospectionPorting the PyGObject Introspection Porting guide].&lt;br /&gt;
&lt;br /&gt;
Here is a script to automate the rename of the imports &#039;&#039;&#039;sugar&#039;&#039;&#039; to &#039;&#039;&#039;sugar3&#039;&#039;&#039;: [http://dev.laptop.org/~manuq/sugar-convert.sh sugar-convert.sh].&lt;br /&gt;
&lt;br /&gt;
If you are having trouble finding how a particular GTK class/method/constant has been named in PyGI, run [http://dev.laptop.org/~dsd/20110806/pygi-enumerate.py pygi-enumerate.py] and grep the output. (this app lists all identified methods and constants).  Usage example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ python pygi-enumerate.py | grep get_selection&lt;br /&gt;
Gtk.AccelLabel.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.Editable.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.Entry.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.IconView.get_selection_mode() (instance method)&lt;br /&gt;
Gtk.Label.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.SelectionData.get_selection() (instance method)&lt;br /&gt;
Gtk.SpinButton.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.TextBuffer.get_selection_bound() (instance method)&lt;br /&gt;
Gtk.TextBuffer.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.TreeView.get_selection() (instance method)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Constructor considerations ===&lt;br /&gt;
&lt;br /&gt;
With PyGI it is possible to use Python-like constructors, or &amp;quot;new&amp;quot; functions e.g. the following are (usually) equivalent:&lt;br /&gt;
 label = Gtk.Button()&lt;br /&gt;
 label = Gtk.Button.new()&lt;br /&gt;
&lt;br /&gt;
However, the first form is preferred: it is more Python-like. Internally, the difference is that Gtk.Label.new() translates to a call to gtk_label_new(), whereas Gtk.Label() (the preferred form) will directly construct an instance of GtkLabel at the GObject level.&lt;br /&gt;
&lt;br /&gt;
If the constructor takes parameters, they &#039;&#039;&#039;must&#039;&#039;&#039; be named. The parameters correspond to GObject properties in the API documentation which are usually marked as &amp;quot;Construct&amp;quot;. For example, the following code will not work:&lt;br /&gt;
&lt;br /&gt;
 expander = Gtk.Expander(&amp;quot;my expander&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
The (confusing) error is:&lt;br /&gt;
 TypeError: GObject.__init__() takes exactly 0 arguments (1 given)&lt;br /&gt;
&lt;br /&gt;
The solution is to go to the [http://developer.gnome.org/gtk3/3.2/GtkExpander.html#GtkExpander.properties GtkExpander API documentation] and find the appropriate property that we wish to set. In this case it is &amp;lt;b&amp;gt;label&amp;lt;/b&amp;gt; (which is a Construct property, further increasing our confidence of success), so the code should be:&lt;br /&gt;
&lt;br /&gt;
 expander = Gtk.Expander(label=&amp;quot;my expander&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Combining the two points above, if you wish to call a construct-like function such as gtk_button_new_with_label(), you do have the option of calling Gtk.Button.new_with_label(), however if we check the [http://developer.gnome.org/gtk3/3.2/GtkButton.html#GtkButton.properties GtkButton properties] we see one called &amp;quot;label&amp;quot; which is equivalent. Therefore gtk_button_new_with_label(&amp;quot;foo&amp;quot;) should be called as:&lt;br /&gt;
 button = Gtk.Button(label=&amp;quot;foo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== HBox, VBox, pack_start and pack_end ===&lt;br /&gt;
&lt;br /&gt;
GtkHBox and GtkVBox, commonly used containers in GTK+ 2 code, have pack_start and pack_end methods. These take 4 parameters:&lt;br /&gt;
# The widget to pack into the container&lt;br /&gt;
# &#039;&#039;&#039;expand&#039;&#039;&#039;: Whether the child should receive extra space when the container grows (default True)&lt;br /&gt;
# &#039;&#039;&#039;fill&#039;&#039;&#039;: True if space given to child by the expand option is actually allocated to child, rather than just padding it. This parameter has no effect if expand is set to False. A child is always allocated the full height of a gtk.HBox and the full width of a gtk.VBox. This option affects the other dimension. (default True)&lt;br /&gt;
# &#039;&#039;&#039;padding&#039;&#039;&#039;: extra space in pixels to put between child and its neighbor (default 0)&lt;br /&gt;
&lt;br /&gt;
In PyGTK, the expand, fill and padding parameters were optional: if unspecified, the default values above were used. In PyGI, these parameters are &#039;&#039;&#039;not&#039;&#039;&#039; optional: all 4 must be specified. Hence the rules for adding in the extra parameters are:&lt;br /&gt;
&lt;br /&gt;
# If &#039;&#039;&#039;expand&#039;&#039;&#039; was not set, use value True&lt;br /&gt;
# If &#039;&#039;&#039;fill&#039;&#039;&#039; was not set, use value True. (however, if expand is False, this parameter gets ignored so False is an equally acceptable option when expand=False)&lt;br /&gt;
# If &#039;&#039;&#039;padding&#039;&#039;&#039; was not set, use value 0.&lt;br /&gt;
&lt;br /&gt;
These parameters can be specified either as positional arguments or as named keyword arguments, however all 4 must always be specified. Some developers prefer keyword arguments, arguing that the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;box.pack_start(widget, expand=True, fill=False, padding=4)&amp;lt;/pre&amp;gt;&lt;br /&gt;
is much more readable than:&lt;br /&gt;
&amp;lt;pre&amp;gt;box.pack_start(widget, True, False, 4)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, these functions are called extremely often; any mildly seasoned GTK developer will have memorized the order and meaning of the parameters. Some developers therefore prefer to avoid the extra work of dropping in hundreds of keyword arguments throughout the code and just use the positional ones. This is really up to you.&lt;br /&gt;
&lt;br /&gt;
If you are using pack_start with the default values (expand=True, fill=True and padding=0), you can avoid using pack_start (and the parameter pain that it brings with it) by just using .add for some added cleanliness, e.g.&lt;br /&gt;
&amp;lt;pre&amp;gt;box.pack_start(widget, True, True, 0)&amp;lt;/pre&amp;gt;&lt;br /&gt;
can be replaced with:&lt;br /&gt;
&amp;lt;pre&amp;gt;box.add(widget)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is as far as you need to go for now. However, in GTK+ 3, GtkVBox and GtkHBox have been deprecated, which means they might be removed in GTK+ 3. The replacement is to use GtkBox directly, and you may wish to make this change now. e.g.:&lt;br /&gt;
&amp;lt;pre&amp;gt;vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=True, spacing=8)&amp;lt;/pre&amp;gt;&lt;br /&gt;
However, it must be noted that if GtkBox is used directly (instead of using GtkHBox/GtkVBox), the default value of &#039;&#039;&#039;expand&#039;&#039;&#039; is now &#039;&#039;&#039;False&#039;&#039;&#039;. The implications of this are:&lt;br /&gt;
# You need to check your .add() calls, as previously they would behave as pack_start with expand=True, but now they will behave as expand=False (you need to change them to use pack_start with expand=True to retain the old behaviour)&lt;br /&gt;
# Every single pack_start call that has expand=False and padding=0 (and any value of fill) can be converted to .add() for cleanliness&lt;br /&gt;
&lt;br /&gt;
=== GtkAlignment considerations ===&lt;br /&gt;
&lt;br /&gt;
In PyGTK, the gtk.Alignment constructor takes four optional parameters:&lt;br /&gt;
# xalign: the fraction of horizontal free space to the left of the child widget. Ranges from 0.0 to 1.0. Default value 0.0.&lt;br /&gt;
# yalign: the fraction of vertical free space above the child widget. Ranges from 0.0 to 1.0. Default value 0.0.&lt;br /&gt;
# xscale: the fraction of horizontal free space that the child widget absorbs, from 0.0 to 1.0. Default value 0.0.&lt;br /&gt;
# yscale: the fraction of vertical free space that the child widget absorbs, from 0.0 to 1.0. Default value 0.0&lt;br /&gt;
&lt;br /&gt;
In PyGI/GTK3, these parameters are still optional when used in the Gtk.Alignment constructor (as keyword arguments, as explained above). However, the default values have changed. They are now:&lt;br /&gt;
# xalign: default value 0.5&lt;br /&gt;
# yalign: default value 0.5&lt;br /&gt;
# xscale: default value 1&lt;br /&gt;
# yscale: default value 1&lt;br /&gt;
&lt;br /&gt;
If your code was relying on the default value of 0 for any of these parameters in PyGTK, you will now need to explicitly specify that in your constructor. Similarly, if you were previously using construction parameters to select the now-default values, those parameters can be dropped.&lt;br /&gt;
&lt;br /&gt;
Additionally, PyGTK accepted these construction parameters as positional arguments. As explained above, they must now be converted to keyword arguments.&lt;br /&gt;
&lt;br /&gt;
=== Gtk Menu Popup ===&lt;br /&gt;
The Gtk.Menu.popup function now works slightly differently. &lt;br /&gt;
The user supplied positioning function now takes different parameters. These are menu, x, y, push_in and user_data. &lt;br /&gt;
=== Gdk ===&lt;br /&gt;
Previously, gdk was an attribute of the GTK module, which means that it can be called through GTK. For example, if we want to use color_parse():&lt;br /&gt;
 gtk.gdk.color_parse(color)&lt;br /&gt;
However, what we have to do now is:&lt;br /&gt;
 from gi.repository import Gdk&lt;br /&gt;
Then we can modify the code to the following:&lt;br /&gt;
 Gdk.color_parse(color)&lt;br /&gt;
&lt;br /&gt;
=== Pango ===&lt;br /&gt;
Following the release of GTK+ 3, we should not be importing pango like this:&lt;br /&gt;
 import pango&lt;br /&gt;
In fact, we can now import pango as an attribute within the GTK+ 3 library:&lt;br /&gt;
 from gi.repository import Pango as pango&lt;br /&gt;
=== Gio.Settings from GConf ===&lt;br /&gt;
Any use of GConf should be ported to Gio.Settings.&lt;br /&gt;
&lt;br /&gt;
=== Other considerations ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;self.allocation&#039;&#039; property is no longer available.  Please search your code for &amp;quot;self.allocation&amp;quot; and replace it for &amp;quot;self.get_allocation()&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So to get the allocation size:&lt;br /&gt;
&lt;br /&gt;
 self.allocation.width&lt;br /&gt;
 self.allocation.height&lt;br /&gt;
&lt;br /&gt;
should be replaced by:&lt;br /&gt;
&lt;br /&gt;
 self.get_allocated_width()&lt;br /&gt;
 self.get_allocated_height()&lt;br /&gt;
&lt;br /&gt;
=== Constants ===&lt;br /&gt;
&lt;br /&gt;
Most of the constants have slightly different formats, e.g.,&lt;br /&gt;
&lt;br /&gt;
gtk.STATE_NORMAL became Gtk.StateFlags.NORMAL&lt;br /&gt;
gtk.RESPONSE_ACCEPT became Gtk.ResponseType.ACCEPT&lt;br /&gt;
gtk.JUSTIFY_CENTER became Gtk.Justification.CENTER&lt;br /&gt;
gtk.RELIEF_NONE became Gtk.ReliefStyle.NONE&lt;br /&gt;
&lt;br /&gt;
=== Pixbufs ===&lt;br /&gt;
&lt;br /&gt;
The pixbuf libraies are in their own repository&lt;br /&gt;
&lt;br /&gt;
 from gi.repository import GdkPixbuf&lt;br /&gt;
&lt;br /&gt;
 GdkPixbuf.Pixbuf.new_from_file()&lt;br /&gt;
&lt;br /&gt;
===Changes to the Clipboard===&lt;br /&gt;
Two things to note:&lt;br /&gt;
&lt;br /&gt;
1. You need to specify a clipboard using get()&lt;br /&gt;
    clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)&lt;br /&gt;
2. You need to pass a length to set_text()&lt;br /&gt;
    clipboard.set_text(string, len(string))&lt;br /&gt;
&lt;br /&gt;
See [http://python-gtk-3-tutorial.readthedocs.org/en/latest/clipboard.html] for more details.&lt;br /&gt;
&lt;br /&gt;
===Changes to Drag-and-Drop===&lt;br /&gt;
Slightly different syntax:&lt;br /&gt;
        self.drag_dest_set(Gtk.DestDefaults.ALL, [],&lt;br /&gt;
                           Gdk.DragAction.COPY)&lt;br /&gt;
        self.drag_dest_set_target_list(Gtk.TargetList.new([]))&lt;br /&gt;
        self.drag_dest_add_text_targets()&lt;br /&gt;
        self.connect(&#039;drag_data_received&#039;, self._drag_data_received)&lt;br /&gt;
&lt;br /&gt;
and:&lt;br /&gt;
        data.get_text()&lt;br /&gt;
or:&lt;br /&gt;
        data.get_image()&lt;br /&gt;
&lt;br /&gt;
See [http://python-gtk-3-tutorial.readthedocs.org/en/latest/drag_and_drop.html] for more details.&lt;br /&gt;
&lt;br /&gt;
===Going from Drawable to Cairo===&lt;br /&gt;
&lt;br /&gt;
GTK+ 3 does not support GTK Drawable objects, so the first step is to get your activity running under Cairo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import cairo&lt;br /&gt;
&lt;br /&gt;
# From activity.Activity, you inherit a canvas.&lt;br /&gt;
# Create a Cairo context from the window.&lt;br /&gt;
cairo_context = self.canvas.get_window().cairo_create()&lt;br /&gt;
&lt;br /&gt;
# Create an XLib surface to be used for drawing&lt;br /&gt;
xlib_surface = surface.create_similar(cairo.CONTENT_COLOR,&lt;br /&gt;
                                      gtk.gdk.screen_width(),&lt;br /&gt;
                                      gtk.gdk.screen_height())&lt;br /&gt;
&lt;br /&gt;
# You&#039;ll need a Cairo context from which you&#039;ll build a GTK Cairo context&lt;br /&gt;
cairo_context = cairo.Context(xlib_surface)&lt;br /&gt;
cairo_context = gtk.gdk.CairoContext(cairo_context)&lt;br /&gt;
&lt;br /&gt;
# Use this context as you would a Drawable, substituting Cairo commands&lt;br /&gt;
# for gtk commands, e.g.,&lt;br /&gt;
cairo_context.move_to(0, 0)&lt;br /&gt;
cairo_context.line_to(100, 100)&lt;br /&gt;
# Cairo uses floats from 0 to 1 for RGB values&lt;br /&gt;
cairo_context.set_source_rgb(r, g, b)&lt;br /&gt;
cairo_context.rectangle(x, y, w, h)&lt;br /&gt;
cairo_context.fill()&lt;br /&gt;
&lt;br /&gt;
# To invalidate a region to force a refresh, use:&lt;br /&gt;
self.canvas.queue_draw_area(x, y, w, h)&lt;br /&gt;
&lt;br /&gt;
# Handle the expose event&lt;br /&gt;
# &amp;quot;expose&amp;quot; became &amp;quot;draw&amp;quot; for the cairo signal &lt;br /&gt;
def do_expose_event(self, event):&lt;br /&gt;
    # Create the cairo context&lt;br /&gt;
    cairo_context = self.canvas.get_window().cairo_create()&lt;br /&gt;
    cairo_context.rectangle(event.area.x, event.area.y,&lt;br /&gt;
                            event.area.width, event.area.height)&lt;br /&gt;
    cairo_context.clip()&lt;br /&gt;
    cairo_context.set_source_surface(xlib_surface)&lt;br /&gt;
    cairo_context.paint()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pango is a bit different when used with Cairo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import pango, pangocairo&lt;br /&gt;
&lt;br /&gt;
# Again, from the xlib_surface...&lt;br /&gt;
cairo_context = cairo.Context(xlib_surface)&lt;br /&gt;
&lt;br /&gt;
# Create a PangoCairo context&lt;br /&gt;
cairo_context = pangocairo.CairoContext(cairo_context)&lt;br /&gt;
&lt;br /&gt;
# The pango layout is created from the Cairo context&lt;br /&gt;
pango_layout = cairo_context.create_layout()&lt;br /&gt;
&lt;br /&gt;
# You still use pango to set up font descriptions.&lt;br /&gt;
fd = pango.FontDescription(&#039;Sans&#039;)&lt;br /&gt;
fd.set_size(12 * pango.SCALE)&lt;br /&gt;
&lt;br /&gt;
# Tell your pango layout about your font description&lt;br /&gt;
pango_layout.set_font_description(fd)&lt;br /&gt;
&lt;br /&gt;
# Write text to your pango layout&lt;br /&gt;
pango_layout.set_text(&#039;Hello world&#039;, -1)&lt;br /&gt;
&lt;br /&gt;
# Position it within the Cairo context&lt;br /&gt;
cairo_context.save()&lt;br /&gt;
cairo_context.translate(x, y)&lt;br /&gt;
cairo_context.rotate(pi / 3)  # You can rotate text and images in Cairo&lt;br /&gt;
cairo_context.set_source_rgb(1, 0, 0)&lt;br /&gt;
&lt;br /&gt;
# Finally, draw the text&lt;br /&gt;
cairo_context.update_layout(pango_layout)&lt;br /&gt;
cairo_context.show_layout(pango_layout)&lt;br /&gt;
cairo_context.restore()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To draw a bitmap...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Again, from the xlib_surface...&lt;br /&gt;
cairo_context = cairo.Context(xlib_surface)&lt;br /&gt;
&lt;br /&gt;
# Create a gtk context&lt;br /&gt;
cairo_context = gtk.gdk.CairoContext(cairo_context)&lt;br /&gt;
cairo_context.set_source_pixbuf(pixbuf, x, y)&lt;br /&gt;
cairo_context.rectangle(x, y, w, h)&lt;br /&gt;
cairo_context.fill()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To read a pixel from the xlib surface...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# create a new 1x1 cairo surface&lt;br /&gt;
cairo_surface = cairo.ImageSurface(cairo.FORMAT_RGB24, 1, 1);&lt;br /&gt;
cairo_context = cairo.Context(cairo_surface)&lt;br /&gt;
# translate xlib_surface so that target pixel is at 0, 0&lt;br /&gt;
cairo_context.set_source_surface(xlib_surface, -x, -y)&lt;br /&gt;
cairo_context.rectangle(0,0,1,1)&lt;br /&gt;
cairo_context.set_operator(cairo.OPERATOR_SOURCE)&lt;br /&gt;
cairo_context.fill()&lt;br /&gt;
cairo_surface.flush() # ensure all writing is done&lt;br /&gt;
# Read the pixel&lt;br /&gt;
return (ord(pixels[2]), ord(pixels[1]), ord(pixels[0]), 0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Going from Cairo in GTK-2 to Cairo in GTK-3===&lt;br /&gt;
&lt;br /&gt;
(For more detailes, see http://developer.gnome.org/pangomm/2.28/annotated.html)&lt;br /&gt;
&lt;br /&gt;
The Cairo/Pango interaction is a little different:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from gi.repository import Pango, PangoCairo&lt;br /&gt;
&lt;br /&gt;
cairo_context = ...&lt;br /&gt;
pango_layout = PangoCairo.create_layout(cairo_context)&lt;br /&gt;
fd = Pango.FontDescription(&#039;Sans&#039;)&lt;br /&gt;
fd.set_size(12 * Pango.SCALE)&lt;br /&gt;
pango_layout.set_font_description(fd)&lt;br /&gt;
pango_layout.set_text(&#039;Hello World&#039;, -1)&lt;br /&gt;
cairo_context.set_source_rgb(1, 0, 0)&lt;br /&gt;
PangoCairo.update_layout(cairo_context, pango_layout)&lt;br /&gt;
PangoCairo.show_layout(cairo_context, pango_layout)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The get_extents() method if different in PangoCairo. It calculates an extent as a Rectangle, but doesn&#039;t return anything. There is a method, get_logical_extents() that returns a Rectangle. Alas, it is not necessarily available after v1.16. Note that Rectangle is not a list but a class with methods for get_x(), get_y(), get_width(), and get_height(), so you cannot iter over it.&lt;br /&gt;
&lt;br /&gt;
Note that the &amp;lt;samp&amp;gt;cairo.Region&amp;lt;/samp&amp;gt; will no longer work in GTK+3 &lt;br /&gt;
&lt;br /&gt;
==== Replacing pixmaps with Cairo ====&lt;br /&gt;
You need to replace your pixmaps with Cairo in GTK+ 3. For an example on how this is done, see: http://developer.gnome.org/gtk3/3.5/ch24s02.html#idp129615008 &lt;br /&gt;
&lt;br /&gt;
===Taking a screenshot and making a thumbnail===&lt;br /&gt;
To make a screenshot of the window:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
width, height = window.get_width(), window.get_height()&lt;br /&gt;
thumb_surface = Gdk.Window.create_similar_surface(window,&lt;br /&gt;
                                                  cairo.CONTENT_COLOR,&lt;br /&gt;
                                                  width, height)&lt;br /&gt;
&lt;br /&gt;
thumb_width, thumb_height = style.zoom(100), style.zoom(80)&lt;br /&gt;
cairo_context = cairo.Context(thumb_surface)&lt;br /&gt;
thumb_scale_w = thumb_width * 1.0 / width&lt;br /&gt;
thumb_scale_h = thumb_height * 1.0 / height&lt;br /&gt;
cairo_context.scale(thumb_scale_w, thumb_scale_h)&lt;br /&gt;
Gdk.cairo_set_source_window(cairo_context, window, 0, 0)&lt;br /&gt;
cairo_context.paint()&lt;br /&gt;
thumb_surface.write_to_png(png_path_or_filelike_object)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Creating a video widget===&lt;br /&gt;
&lt;br /&gt;
Some necessary changes include:&lt;br /&gt;
&lt;br /&gt;
Using&lt;br /&gt;
 get_property(&#039;window&#039;).get_xid()&lt;br /&gt;
&lt;br /&gt;
Instead of&lt;br /&gt;
 window.xid&lt;br /&gt;
Using&lt;br /&gt;
 set_double_buffered(False)&lt;br /&gt;
 set_app_paintable(True)&lt;br /&gt;
Instead of&lt;br /&gt;
 unset_flags(gtk.DOUBLE_BUFFERED)&lt;br /&gt;
 set_flags(gtk.APP_PAINTABLE)&lt;br /&gt;
&lt;br /&gt;
=Hacks to help in porting=&lt;br /&gt;
&lt;br /&gt;
=== Use the same keyboard and mouse ===&lt;br /&gt;
If you have an XO, I&#039;m sure you want to take a look at [[User:Humitos/x2x|this]]...&lt;br /&gt;
===Use Extended Python debugger===&lt;br /&gt;
&#039;&#039;&#039;epdb&#039;&#039;&#039; library is useful to inspect the code while the Activity is running.&lt;br /&gt;
 sudo yum install python-epdb&lt;br /&gt;
After that I put some trace point in the code where I can stop and make my tests by doing this:&lt;br /&gt;
 import epdb;epdb.set_trace()&lt;br /&gt;
Finally I run Get Books Activity from the Terminal Activity to be able to write some code on a shell. This is the command that I use:&lt;br /&gt;
 sugar-launch org.laptop.sugar.GetBooksActivity&lt;br /&gt;
See also [[Development Team/Debugging]].&lt;br /&gt;
===Check logs with &#039;&#039;multitail&#039;&#039;===&lt;br /&gt;
Here is a really useful command to open new logs automatically: [[User:Humitos/MultiTail]]&lt;br /&gt;
===Use the pygobject code as example===&lt;br /&gt;
[https://live.gnome.org/PyGObject pygobject] is what we use to make Gtk3 activities. So, it&#039;s really useful to take a look at the code examples that are there. Even more, you can run some demo application that show how to use something specific about the library.&lt;br /&gt;
*Clone the code:&lt;br /&gt;
 git clone git://git.gnome.org/pygobject&lt;br /&gt;
*Run an example&lt;br /&gt;
 cd pygobject&lt;br /&gt;
 cd demos/gtk-demo/demos&lt;br /&gt;
 python pixbuf.py&lt;br /&gt;
*Grep the code to search for something useful&lt;br /&gt;
 cd pygobject&lt;br /&gt;
 git grep GdkPixbuf&lt;br /&gt;
===Monitoring DBus===&lt;br /&gt;
Not sure how this command works, but it can give us an interesting information. If you run this command and plug an USB drive you will see useful information&lt;br /&gt;
 dbus-monitor --system&lt;br /&gt;
&lt;br /&gt;
=Port to Python 3=&lt;br /&gt;
We are migrating towards Python 3. Python 3 does not support GTK+ 2. Hence, once the activity is ported to GTK+ 3, please consider porting the activity from Python 2 to Python 3. &lt;br /&gt;
&lt;br /&gt;
Ref: [https://github.com/sugarlabs/sugar-docs/blob/master/src/python-porting-guide.md Guide to port activities to Python 3]&lt;br /&gt;
&lt;br /&gt;
=Releasing activities (for maintainers)=&lt;br /&gt;
Once an activity is ported, a new release can be made. The major version should be greater than the existing one. &lt;br /&gt;
&lt;br /&gt;
Please follow [https://github.com/sugarlabs/sugar-docs/blob/master/src/contributing.md#checklist---maintainer this] guide for releasing a new version &lt;br /&gt;
&lt;br /&gt;
=Notes=&lt;br /&gt;
These are the changes implemented by developers while porting activities&lt;br /&gt;
*&amp;lt;code&amp;gt;Gtk.Widget.hide_all()&amp;lt;/code&amp;gt; does not exist anymore. We should use just &amp;lt;code&amp;gt;.hide&amp;lt;/code&amp;gt;&lt;br /&gt;
**Ref: http://developer.gnome.org/gtk3/3.5/GtkWidget.html#gtk-widget-hide&lt;br /&gt;
&lt;br /&gt;
*If the code creates some own object, and it defines some properties, you should use &#039;&#039;&#039;__gproperties__&#039;&#039;&#039; dictionary: http://python-gtk-3-tutorial.readthedocs.org/en/latest/objects.html#GObject.GObject.__gproperties__&lt;br /&gt;
*&amp;lt;code&amp;gt;Gtk.ListStore&amp;lt;/code&amp;gt; doesn&#039;t have the method &#039;&#039;&#039;.reorder&#039;&#039;&#039;. There is a [https://bugzilla.gnome.org/show_bug.cgi?id=677941 ticket] reported upstream about this.&lt;br /&gt;
*I replaced the use of &amp;lt;code&amp;gt;dbus&amp;lt;/code&amp;gt; by [http://developer.gnome.org/gio/unstable/pt02.html Gio] to monitor the (dis)connection of pen drives&lt;br /&gt;
*Migrate custom signals:&lt;br /&gt;
**If you have defined custom gtk objects with custom signal you should migrate them to [http://python-gtk-3-tutorial.readthedocs.org/en/latest/objects.html the new way] to do this.  You should replace this:  from gobject import signal_new, TYPE_INT, TYPE_STRING, TYPE_BOOLEAN, \ TYPE_PYOBJECT, TYPE_NONE, SIGNAL_RUN_LAST   signal_new(&#039;extlistview-modified&#039;, gtk.TreeView, SIGNAL_RUN_LAST, TYPE_NONE,             ()) by adding the signal definition inside the object that you are creating using the &amp;lt;code&amp;gt;__gsignals__&amp;lt;/code&amp;gt; dictionary like this (in this case Gtk.TreeView is the class that our object inherits):  from gi.repository import GObject   class ExtListView(Gtk.TreeView):     __gsignals__ = {       &#039;extlistview-modified&#039;: (GObject.SignalFlags.RUN_LAST, None,                              ()),        } The last argument of the signal definition are the argument types that the callback will receive.&lt;br /&gt;
* Change the mouse cursor&lt;br /&gt;
** Example use case: When the activity is working and we want to show a &#039;&#039;work in progress&#039;&#039; cursor.&lt;br /&gt;
** Replace this:&lt;br /&gt;
 self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))&lt;br /&gt;
with:&lt;br /&gt;
 from gi.repository import Gdk&lt;br /&gt;
 self.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))&lt;br /&gt;
=Resources=&lt;br /&gt;
*PyGI Documentation: https://lazka.github.io/pgi-docs/&lt;br /&gt;
*PYGTK  documentation&lt;br /&gt;
**GTK+ 3: [http://python-gtk-3-tutorial.readthedocs.org/ http://python-gtk-3-tutorial.readthedocs.org]&lt;br /&gt;
**GTK+ 2: http://www.pygtk.org/docs/pygtk/&lt;br /&gt;
*Reference Manual&lt;br /&gt;
**GTK+ 3: http://developer.gnome.org/gtk3/3.4/&lt;br /&gt;
*Gdk documentation:&lt;br /&gt;
**Gdk3: http://developer.gnome.org/gdk/2.24/&lt;br /&gt;
*OLPC Documentation: http://wiki.laptop.org/go/Activities/PortingToGtk3&lt;br /&gt;
*Used to know the arguments of &amp;lt;code&amp;gt;GdkPixbuf.Pixbuf.save_to_bufferv&amp;lt;/code&amp;gt; https://mail.gnome.org/archives/javascript-list/2011-March/msg00001.html&lt;br /&gt;
&lt;br /&gt;
* Pango documentation: http://developer.gnome.org/pangomm&lt;br /&gt;
&lt;br /&gt;
* Gst-1.0 documentation: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/index.html&lt;br /&gt;
&lt;br /&gt;
* Gst-1.0 porting hints: https://wiki.ubuntu.com/Novacut/GStreamer1.0&lt;br /&gt;
[[Category:Developer]]&lt;br /&gt;
&lt;br /&gt;
= More porting examples =&lt;br /&gt;
&lt;br /&gt;
{{Special:PrefixIndex/Features/GTK3/Porting}}&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting&amp;diff=101675</id>
		<title>Features/GTK3/Porting</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting&amp;diff=101675"/>
		<updated>2018-04-06T14:01:44Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Standardise names, and remove redundancy&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Porting an existing activity to GTK+ 3=&lt;br /&gt;
This is a guide to porting an existing activity from GTK+ 2 to [http://developer.gnome.org/gtk3/stable/ GTK+ 3]. It also shows the changes to use the new Sugar toolkit that also now uses [[Features/GTK3|GTK+ 3]]. This guide uses the [https://github.com/sugarlabs/hello-world hello-world] activity as a simple example.&lt;br /&gt;
&lt;br /&gt;
Here are some instances of porting activities, for reference:&lt;br /&gt;
* [https://github.com/sugarlabs/biorhythm/commit/c16de3b70cce2cc6f8af933e2b062c844a47c144/ Biorhythm]&lt;br /&gt;
* [https://github.com/sugarlabs/peru-learns-english-activity/commit/caa2cde526b3823a5a1f7d200a76ad5bc3502b0e Peru Learns English, includes GStreamer and GST update]&lt;br /&gt;
* [https://github.com/sugarlabs/jump/commit/b75410d2879d9829df942726f5465b7cf5a9d98d Port of Jump Activity]&lt;br /&gt;
* [https://github.com/sugarlabs/iknowMadagascar/commit/44ba42645ac4fcd9e06b4add7fa3b6ce2e0d9c3d Port of I-know-Madagascar]&lt;br /&gt;
&lt;br /&gt;
=Steps to Port an Activity to GTK+ 3=&lt;br /&gt;
#Read the [http://wiki.sugarlabs.org/go/Features/GTK3 Sugar Official Wiki]&lt;br /&gt;
#Resolve any existing pull requests before porting to avoid conflicts at a later stage.&lt;br /&gt;
#Run this [http://git.gnome.org/browse/pygobject/tree/pygi-convert.sh script] that will convert automatically things as much as it can. This is to avoid some stressful manually conversions that a &amp;quot;simple script&amp;quot; can do using &#039;&#039;sed&#039;&#039; :)&lt;br /&gt;
#Follow the [[Development Team/Code guidelines|Code Guidelines]] during all the porting process&lt;br /&gt;
#Make the API changes in sugar-toolkit-gtk3&lt;br /&gt;
#Write comments on the code, by adding &#039;&#039;&#039;# README:&#039;&#039;&#039;, &#039;&#039;&#039;# TODO:&#039;&#039;&#039; and &#039;&#039;&#039;# FIXME:&#039;&#039;&#039; explaining what are the problems that you are having with that chunk of code. Put a link if it&#039;s necessary&lt;br /&gt;
&lt;br /&gt;
==API changes in sugar-toolkit ==&lt;br /&gt;
* The namespace is changed from &amp;lt;code&amp;gt;sugar&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;sugar3&amp;lt;/code&amp;gt;, trying to reflect that GTK+ 3 is the underlying technology.&lt;br /&gt;
* The keep button has been removed&lt;br /&gt;
* The old-style toolbar has been removed&lt;br /&gt;
*&amp;lt;code&amp;gt;set_toolbar_box&amp;lt;/code&amp;gt; is used instead of &amp;lt;code&amp;gt;set_toolbox&amp;lt;/code&amp;gt; (see in [http://git.sugarlabs.org/~walter/abacus/walter-cairo/commit/6871dd340a89ade3b5361457e1bd1d58276a8efc Abacus])&lt;br /&gt;
* Remove import of deprecated ActivityToolbox (see [http://git.sugarlabs.org/hello-world/mainline/commit/22060a3063b2d6fd38d6b1cd8d44946170255af3 hello-world])&lt;br /&gt;
* Support for &amp;lt;code&amp;gt;service_name&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; tags in activity.info has been removed. Use &amp;lt;code&amp;gt;bundle_id&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;service_name&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; (see in [http://git.sugarlabs.org/record/mainline/commit/6e8968c71e474e2d8d86886badf5cf7d70217dc5 Record])&lt;br /&gt;
* &amp;lt;code&amp;gt;sugar3.activity.Activity&amp;lt;/code&amp;gt; does not have the &#039;&#039;window&#039;&#039; attribute. Use the &amp;lt;code&amp;gt;.get_window()&amp;lt;/code&amp;gt; method instead.&lt;br /&gt;
&lt;br /&gt;
==Port the activity from GTK+ 2 to GTK+ 3==&lt;br /&gt;
To start, change the importing instruction for GTK from&lt;br /&gt;
 import gtk&lt;br /&gt;
to&lt;br /&gt;
 import gi&lt;br /&gt;
 gi.require_version(&#039;Gtk&#039;, &#039;3.0&#039;)&lt;br /&gt;
 from gi.repository import Gtk&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;code&amp;gt;require_version&amp;lt;/code&amp;gt; needs to called only the first time when GTK is being imported.&lt;br /&gt;
&lt;br /&gt;
Similar imports that may be used are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from gi.repository import Gdk, Pango, Gobject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then you have to change each call that involves GTK, for example creating a button will look now like this:&lt;br /&gt;
 button = Gtk.Button()&lt;br /&gt;
&lt;br /&gt;
A simple hello world program in GTK+ 3 looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from gi.repository import Gtk&lt;br /&gt;
&lt;br /&gt;
def _destroy_cb(widget, data=None):&lt;br /&gt;
    Gtk.main_quit()&lt;br /&gt;
&lt;br /&gt;
w = Gtk.Window()&lt;br /&gt;
w.connect(&amp;quot;destroy&amp;quot;, _destroy_cb)&lt;br /&gt;
label = Gtk.Label(&#039;Hello World!&#039;)&lt;br /&gt;
w.add(label)&lt;br /&gt;
w.show_all()&lt;br /&gt;
&lt;br /&gt;
Gtk.main()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The changes that were needed to port the hello-world activity can be seen in [https://github.com/sugarlabs/hello-world/commit/508e1c518b56cbde5508e560c8a2ff38a3518583 this commit.]&lt;br /&gt;
====Simple example on creating a toolbar====&lt;br /&gt;
One of Sugar&#039;s activity most unique user interface includes the toolbar. In order to reference the relevant modules and graphics, the sugar3 library has to be imported. These are the relevant ones that would enable us to create a simple toolbar containing the activity button and the stop button.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sugar3.activity import activity&lt;br /&gt;
from sugar3.graphics.toolbarbox import ToolbarBox&lt;br /&gt;
from sugar3.activity.widgets import ActivityToolbarButton&lt;br /&gt;
from sugar3.activity.widgets import StopButton&lt;br /&gt;
from sugar3.graphics.toolbarbox import ToolbarButton&lt;br /&gt;
from sugar3.graphics import style&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since the ActivityToolbar() module has been deprecated, the toolbar can now be called using&lt;br /&gt;
 ToolbarBox()&lt;br /&gt;
Then, from the ToolbarBox(), include the ActivityButton and StopButton. In order for the StopButton to be align to the right as per Sugar activity interface, a separator has to be included as well.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
toolbar_box = ToolbarBox()&lt;br /&gt;
&lt;br /&gt;
activity_button = ActivityToolbarButton(self)&lt;br /&gt;
toolbar_box.toolbar.insert(activity_button, 0)&lt;br /&gt;
activity_button.show()&lt;br /&gt;
&lt;br /&gt;
separator = Gtk.SeparatorToolItem()&lt;br /&gt;
separator.props.draw = False&lt;br /&gt;
separator.set_expand(True)&lt;br /&gt;
toolbar_box.toolbar.insert(separator, -1)&lt;br /&gt;
separator.show()&lt;br /&gt;
&lt;br /&gt;
stop_button = StopButton(self)&lt;br /&gt;
toolbar_box.toolbar.insert(stop_button, -1)&lt;br /&gt;
stop_button.show()&lt;br /&gt;
self.set_toolbar_box(toolbar_box)&lt;br /&gt;
toolbar_box.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tools===&lt;br /&gt;
There are tools to help you do the porting. There is a script in the pygobject repository for porting called [http://git.gnome.org/browse/pygobject/tree/pygi-convert.sh pygi-convert.sh], more info about the script can be found in [http://live.gnome.org/PyGObject/IntrospectionPorting the PyGObject Introspection Porting guide].&lt;br /&gt;
&lt;br /&gt;
Here is a script to automate the rename of the imports &#039;&#039;&#039;sugar&#039;&#039;&#039; to &#039;&#039;&#039;sugar3&#039;&#039;&#039;: [http://dev.laptop.org/~manuq/sugar-convert.sh sugar-convert.sh].&lt;br /&gt;
&lt;br /&gt;
If you are having trouble finding how a particular GTK class/method/constant has been named in PyGI, run [http://dev.laptop.org/~dsd/20110806/pygi-enumerate.py pygi-enumerate.py] and grep the output. (this app lists all identified methods and constants).  Usage example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ python pygi-enumerate.py | grep get_selection&lt;br /&gt;
Gtk.AccelLabel.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.Editable.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.Entry.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.IconView.get_selection_mode() (instance method)&lt;br /&gt;
Gtk.Label.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.SelectionData.get_selection() (instance method)&lt;br /&gt;
Gtk.SpinButton.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.TextBuffer.get_selection_bound() (instance method)&lt;br /&gt;
Gtk.TextBuffer.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.TreeView.get_selection() (instance method)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Constructor considerations ===&lt;br /&gt;
&lt;br /&gt;
With PyGI it is possible to use Python-like constructors, or &amp;quot;new&amp;quot; functions e.g. the following are (usually) equivalent:&lt;br /&gt;
 label = Gtk.Button()&lt;br /&gt;
 label = Gtk.Button.new()&lt;br /&gt;
&lt;br /&gt;
However, the first form is preferred: it is more Python-like. Internally, the difference is that Gtk.Label.new() translates to a call to gtk_label_new(), whereas Gtk.Label() (the preferred form) will directly construct an instance of GtkLabel at the GObject level.&lt;br /&gt;
&lt;br /&gt;
If the constructor takes parameters, they &#039;&#039;&#039;must&#039;&#039;&#039; be named. The parameters correspond to GObject properties in the API documentation which are usually marked as &amp;quot;Construct&amp;quot;. For example, the following code will not work:&lt;br /&gt;
&lt;br /&gt;
 expander = Gtk.Expander(&amp;quot;my expander&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
The (confusing) error is:&lt;br /&gt;
 TypeError: GObject.__init__() takes exactly 0 arguments (1 given)&lt;br /&gt;
&lt;br /&gt;
The solution is to go to the [http://developer.gnome.org/gtk3/3.2/GtkExpander.html#GtkExpander.properties GtkExpander API documentation] and find the appropriate property that we wish to set. In this case it is &amp;lt;b&amp;gt;label&amp;lt;/b&amp;gt; (which is a Construct property, further increasing our confidence of success), so the code should be:&lt;br /&gt;
&lt;br /&gt;
 expander = Gtk.Expander(label=&amp;quot;my expander&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Combining the two points above, if you wish to call a construct-like function such as gtk_button_new_with_label(), you do have the option of calling Gtk.Button.new_with_label(), however if we check the [http://developer.gnome.org/gtk3/3.2/GtkButton.html#GtkButton.properties GtkButton properties] we see one called &amp;quot;label&amp;quot; which is equivalent. Therefore gtk_button_new_with_label(&amp;quot;foo&amp;quot;) should be called as:&lt;br /&gt;
 button = Gtk.Button(label=&amp;quot;foo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== HBox, VBox, pack_start and pack_end ===&lt;br /&gt;
&lt;br /&gt;
GtkHBox and GtkVBox, commonly used containers in GTK+ 2 code, have pack_start and pack_end methods. These take 4 parameters:&lt;br /&gt;
# The widget to pack into the container&lt;br /&gt;
# &#039;&#039;&#039;expand&#039;&#039;&#039;: Whether the child should receive extra space when the container grows (default True)&lt;br /&gt;
# &#039;&#039;&#039;fill&#039;&#039;&#039;: True if space given to child by the expand option is actually allocated to child, rather than just padding it. This parameter has no effect if expand is set to False. A child is always allocated the full height of a gtk.HBox and the full width of a gtk.VBox. This option affects the other dimension. (default True)&lt;br /&gt;
# &#039;&#039;&#039;padding&#039;&#039;&#039;: extra space in pixels to put between child and its neighbor (default 0)&lt;br /&gt;
&lt;br /&gt;
In PyGTK, the expand, fill and padding parameters were optional: if unspecified, the default values above were used. In PyGI, these parameters are &#039;&#039;&#039;not&#039;&#039;&#039; optional: all 4 must be specified. Hence the rules for adding in the extra parameters are:&lt;br /&gt;
&lt;br /&gt;
# If &#039;&#039;&#039;expand&#039;&#039;&#039; was not set, use value True&lt;br /&gt;
# If &#039;&#039;&#039;fill&#039;&#039;&#039; was not set, use value True. (however, if expand is False, this parameter gets ignored so False is an equally acceptable option when expand=False)&lt;br /&gt;
# If &#039;&#039;&#039;padding&#039;&#039;&#039; was not set, use value 0.&lt;br /&gt;
&lt;br /&gt;
These parameters can be specified either as positional arguments or as named keyword arguments, however all 4 must always be specified. Some developers prefer keyword arguments, arguing that the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;box.pack_start(widget, expand=True, fill=False, padding=4)&amp;lt;/pre&amp;gt;&lt;br /&gt;
is much more readable than:&lt;br /&gt;
&amp;lt;pre&amp;gt;box.pack_start(widget, True, False, 4)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, these functions are called extremely often; any mildly seasoned GTK developer will have memorized the order and meaning of the parameters. Some developers therefore prefer to avoid the extra work of dropping in hundreds of keyword arguments throughout the code and just use the positional ones. This is really up to you.&lt;br /&gt;
&lt;br /&gt;
If you are using pack_start with the default values (expand=True, fill=True and padding=0), you can avoid using pack_start (and the parameter pain that it brings with it) by just using .add for some added cleanliness, e.g.&lt;br /&gt;
&amp;lt;pre&amp;gt;box.pack_start(widget, True, True, 0)&amp;lt;/pre&amp;gt;&lt;br /&gt;
can be replaced with:&lt;br /&gt;
&amp;lt;pre&amp;gt;box.add(widget)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is as far as you need to go for now. However, in GTK+ 3, GtkVBox and GtkHBox have been deprecated, which means they might be removed in GTK+ 3. The replacement is to use GtkBox directly, and you may wish to make this change now. e.g.:&lt;br /&gt;
&amp;lt;pre&amp;gt;vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=True, spacing=8)&amp;lt;/pre&amp;gt;&lt;br /&gt;
However, it must be noted that if GtkBox is used directly (instead of using GtkHBox/GtkVBox), the default value of &#039;&#039;&#039;expand&#039;&#039;&#039; is now &#039;&#039;&#039;False&#039;&#039;&#039;. The implications of this are:&lt;br /&gt;
# You need to check your .add() calls, as previously they would behave as pack_start with expand=True, but now they will behave as expand=False (you need to change them to use pack_start with expand=True to retain the old behaviour)&lt;br /&gt;
# Every single pack_start call that has expand=False and padding=0 (and any value of fill) can be converted to .add() for cleanliness&lt;br /&gt;
&lt;br /&gt;
=== GtkAlignment considerations ===&lt;br /&gt;
&lt;br /&gt;
In PyGTK, the gtk.Alignment constructor takes four optional parameters:&lt;br /&gt;
# xalign: the fraction of horizontal free space to the left of the child widget. Ranges from 0.0 to 1.0. Default value 0.0.&lt;br /&gt;
# yalign: the fraction of vertical free space above the child widget. Ranges from 0.0 to 1.0. Default value 0.0.&lt;br /&gt;
# xscale: the fraction of horizontal free space that the child widget absorbs, from 0.0 to 1.0. Default value 0.0.&lt;br /&gt;
# yscale: the fraction of vertical free space that the child widget absorbs, from 0.0 to 1.0. Default value 0.0&lt;br /&gt;
&lt;br /&gt;
In PyGI/GTK3, these parameters are still optional when used in the Gtk.Alignment constructor (as keyword arguments, as explained above). However, the default values have changed. They are now:&lt;br /&gt;
# xalign: default value 0.5&lt;br /&gt;
# yalign: default value 0.5&lt;br /&gt;
# xscale: default value 1&lt;br /&gt;
# yscale: default value 1&lt;br /&gt;
&lt;br /&gt;
If your code was relying on the default value of 0 for any of these parameters in PyGTK, you will now need to explicitly specify that in your constructor. Similarly, if you were previously using construction parameters to select the now-default values, those parameters can be dropped.&lt;br /&gt;
&lt;br /&gt;
Additionally, PyGTK accepted these construction parameters as positional arguments. As explained above, they must now be converted to keyword arguments.&lt;br /&gt;
&lt;br /&gt;
=== Gtk Menu Popup ===&lt;br /&gt;
The Gtk.Menu.popup function now works slightly differently. &lt;br /&gt;
The user supplied positioning function now takes different parameters. These are menu, x, y, push_in and user_data. &lt;br /&gt;
=== Gdk ===&lt;br /&gt;
Previously, gdk was an attribute of the GTK module, which means that it can be called through GTK. For example, if we want to use color_parse():&lt;br /&gt;
 gtk.gdk.color_parse(color)&lt;br /&gt;
However, what we have to do now is:&lt;br /&gt;
 from gi.repository import Gdk&lt;br /&gt;
Then we can modify the code to the following:&lt;br /&gt;
 Gdk.color_parse(color)&lt;br /&gt;
&lt;br /&gt;
=== Pango ===&lt;br /&gt;
Following the release of GTK+ 3, we should not be importing pango like this:&lt;br /&gt;
 import pango&lt;br /&gt;
In fact, we can now import pango as an attribute within the GTK+ 3 library:&lt;br /&gt;
 from gi.repository import Pango as pango&lt;br /&gt;
=== Gio.Settings from GConf ===&lt;br /&gt;
Any use of GConf should be ported to Gio.Settings.&lt;br /&gt;
&lt;br /&gt;
=== Other considerations ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;self.allocation&#039;&#039; property is no longer available.  Please search your code for &amp;quot;self.allocation&amp;quot; and replace it for &amp;quot;self.get_allocation()&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So to get the allocation size:&lt;br /&gt;
&lt;br /&gt;
 self.allocation.width&lt;br /&gt;
 self.allocation.height&lt;br /&gt;
&lt;br /&gt;
should be replaced by:&lt;br /&gt;
&lt;br /&gt;
 self.get_allocated_width()&lt;br /&gt;
 self.get_allocated_height()&lt;br /&gt;
&lt;br /&gt;
=== Constants ===&lt;br /&gt;
&lt;br /&gt;
Most of the constants have slightly different formats, e.g.,&lt;br /&gt;
&lt;br /&gt;
gtk.STATE_NORMAL became Gtk.StateFlags.NORMAL&lt;br /&gt;
gtk.RESPONSE_ACCEPT became Gtk.ResponseType.ACCEPT&lt;br /&gt;
gtk.JUSTIFY_CENTER became Gtk.Justification.CENTER&lt;br /&gt;
gtk.RELIEF_NONE became Gtk.ReliefStyle.NONE&lt;br /&gt;
&lt;br /&gt;
=== Pixbufs ===&lt;br /&gt;
&lt;br /&gt;
The pixbuf libraies are in their own repository&lt;br /&gt;
&lt;br /&gt;
 from gi.repository import GdkPixbuf&lt;br /&gt;
&lt;br /&gt;
 GdkPixbuf.Pixbuf.new_from_file()&lt;br /&gt;
&lt;br /&gt;
===Changes to the Clipboard===&lt;br /&gt;
Two things to note:&lt;br /&gt;
&lt;br /&gt;
1. You need to specify a clipboard using get()&lt;br /&gt;
    clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)&lt;br /&gt;
2. You need to pass a length to set_text()&lt;br /&gt;
    clipboard.set_text(string, len(string))&lt;br /&gt;
&lt;br /&gt;
See [http://python-gtk-3-tutorial.readthedocs.org/en/latest/clipboard.html] for more details.&lt;br /&gt;
&lt;br /&gt;
===Changes to Drag-and-Drop===&lt;br /&gt;
Slightly different syntax:&lt;br /&gt;
        self.drag_dest_set(Gtk.DestDefaults.ALL, [],&lt;br /&gt;
                           Gdk.DragAction.COPY)&lt;br /&gt;
        self.drag_dest_set_target_list(Gtk.TargetList.new([]))&lt;br /&gt;
        self.drag_dest_add_text_targets()&lt;br /&gt;
        self.connect(&#039;drag_data_received&#039;, self._drag_data_received)&lt;br /&gt;
&lt;br /&gt;
and:&lt;br /&gt;
        data.get_text()&lt;br /&gt;
or:&lt;br /&gt;
        data.get_image()&lt;br /&gt;
&lt;br /&gt;
See [http://python-gtk-3-tutorial.readthedocs.org/en/latest/drag_and_drop.html] for more details.&lt;br /&gt;
&lt;br /&gt;
===Going from Drawable to Cairo===&lt;br /&gt;
&lt;br /&gt;
GTK+ 3 does not support GTK Drawable objects, so the first step is to get your activity running under Cairo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import cairo&lt;br /&gt;
&lt;br /&gt;
# From activity.Activity, you inherit a canvas.&lt;br /&gt;
# Create a Cairo context from the window.&lt;br /&gt;
cairo_context = self.canvas.get_window().cairo_create()&lt;br /&gt;
&lt;br /&gt;
# Create an XLib surface to be used for drawing&lt;br /&gt;
xlib_surface = surface.create_similar(cairo.CONTENT_COLOR,&lt;br /&gt;
                                      gtk.gdk.screen_width(),&lt;br /&gt;
                                      gtk.gdk.screen_height())&lt;br /&gt;
&lt;br /&gt;
# You&#039;ll need a Cairo context from which you&#039;ll build a GTK Cairo context&lt;br /&gt;
cairo_context = cairo.Context(xlib_surface)&lt;br /&gt;
cairo_context = gtk.gdk.CairoContext(cairo_context)&lt;br /&gt;
&lt;br /&gt;
# Use this context as you would a Drawable, substituting Cairo commands&lt;br /&gt;
# for gtk commands, e.g.,&lt;br /&gt;
cairo_context.move_to(0, 0)&lt;br /&gt;
cairo_context.line_to(100, 100)&lt;br /&gt;
# Cairo uses floats from 0 to 1 for RGB values&lt;br /&gt;
cairo_context.set_source_rgb(r, g, b)&lt;br /&gt;
cairo_context.rectangle(x, y, w, h)&lt;br /&gt;
cairo_context.fill()&lt;br /&gt;
&lt;br /&gt;
# To invalidate a region to force a refresh, use:&lt;br /&gt;
self.canvas.queue_draw_area(x, y, w, h)&lt;br /&gt;
&lt;br /&gt;
# Handle the expose event&lt;br /&gt;
# &amp;quot;expose&amp;quot; became &amp;quot;draw&amp;quot; for the cairo signal &lt;br /&gt;
def do_expose_event(self, event):&lt;br /&gt;
    # Create the cairo context&lt;br /&gt;
    cairo_context = self.canvas.get_window().cairo_create()&lt;br /&gt;
    cairo_context.rectangle(event.area.x, event.area.y,&lt;br /&gt;
                            event.area.width, event.area.height)&lt;br /&gt;
    cairo_context.clip()&lt;br /&gt;
    cairo_context.set_source_surface(xlib_surface)&lt;br /&gt;
    cairo_context.paint()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pango is a bit different when used with Cairo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import pango, pangocairo&lt;br /&gt;
&lt;br /&gt;
# Again, from the xlib_surface...&lt;br /&gt;
cairo_context = cairo.Context(xlib_surface)&lt;br /&gt;
&lt;br /&gt;
# Create a PangoCairo context&lt;br /&gt;
cairo_context = pangocairo.CairoContext(cairo_context)&lt;br /&gt;
&lt;br /&gt;
# The pango layout is created from the Cairo context&lt;br /&gt;
pango_layout = cairo_context.create_layout()&lt;br /&gt;
&lt;br /&gt;
# You still use pango to set up font descriptions.&lt;br /&gt;
fd = pango.FontDescription(&#039;Sans&#039;)&lt;br /&gt;
fd.set_size(12 * pango.SCALE)&lt;br /&gt;
&lt;br /&gt;
# Tell your pango layout about your font description&lt;br /&gt;
pango_layout.set_font_description(fd)&lt;br /&gt;
&lt;br /&gt;
# Write text to your pango layout&lt;br /&gt;
pango_layout.set_text(&#039;Hello world&#039;, -1)&lt;br /&gt;
&lt;br /&gt;
# Position it within the Cairo context&lt;br /&gt;
cairo_context.save()&lt;br /&gt;
cairo_context.translate(x, y)&lt;br /&gt;
cairo_context.rotate(pi / 3)  # You can rotate text and images in Cairo&lt;br /&gt;
cairo_context.set_source_rgb(1, 0, 0)&lt;br /&gt;
&lt;br /&gt;
# Finally, draw the text&lt;br /&gt;
cairo_context.update_layout(pango_layout)&lt;br /&gt;
cairo_context.show_layout(pango_layout)&lt;br /&gt;
cairo_context.restore()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To draw a bitmap...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Again, from the xlib_surface...&lt;br /&gt;
cairo_context = cairo.Context(xlib_surface)&lt;br /&gt;
&lt;br /&gt;
# Create a gtk context&lt;br /&gt;
cairo_context = gtk.gdk.CairoContext(cairo_context)&lt;br /&gt;
cairo_context.set_source_pixbuf(pixbuf, x, y)&lt;br /&gt;
cairo_context.rectangle(x, y, w, h)&lt;br /&gt;
cairo_context.fill()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To read a pixel from the xlib surface...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# create a new 1x1 cairo surface&lt;br /&gt;
cairo_surface = cairo.ImageSurface(cairo.FORMAT_RGB24, 1, 1);&lt;br /&gt;
cairo_context = cairo.Context(cairo_surface)&lt;br /&gt;
# translate xlib_surface so that target pixel is at 0, 0&lt;br /&gt;
cairo_context.set_source_surface(xlib_surface, -x, -y)&lt;br /&gt;
cairo_context.rectangle(0,0,1,1)&lt;br /&gt;
cairo_context.set_operator(cairo.OPERATOR_SOURCE)&lt;br /&gt;
cairo_context.fill()&lt;br /&gt;
cairo_surface.flush() # ensure all writing is done&lt;br /&gt;
# Read the pixel&lt;br /&gt;
return (ord(pixels[2]), ord(pixels[1]), ord(pixels[0]), 0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Going from Cairo in GTK-2 to Cairo in GTK-3===&lt;br /&gt;
&lt;br /&gt;
(For more detailes, see http://developer.gnome.org/pangomm/2.28/annotated.html)&lt;br /&gt;
&lt;br /&gt;
The Cairo/Pango interaction is a little different:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from gi.repository import Pango, PangoCairo&lt;br /&gt;
&lt;br /&gt;
cairo_context = ...&lt;br /&gt;
pango_layout = PangoCairo.create_layout(cairo_context)&lt;br /&gt;
fd = Pango.FontDescription(&#039;Sans&#039;)&lt;br /&gt;
fd.set_size(12 * Pango.SCALE)&lt;br /&gt;
pango_layout.set_font_description(fd)&lt;br /&gt;
pango_layout.set_text(&#039;Hello World&#039;, -1)&lt;br /&gt;
cairo_context.set_source_rgb(1, 0, 0)&lt;br /&gt;
PangoCairo.update_layout(cairo_context, pango_layout)&lt;br /&gt;
PangoCairo.show_layout(cairo_context, pango_layout)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The get_extents() method if different in PangoCairo. It calculates an extent as a Rectangle, but doesn&#039;t return anything. There is a method, get_logical_extents() that returns a Rectangle. Alas, it is not necessarily available after v1.16. Note that Rectangle is not a list but a class with methods for get_x(), get_y(), get_width(), and get_height(), so you cannot iter over it.&lt;br /&gt;
&lt;br /&gt;
Note that the &amp;lt;samp&amp;gt;cairo.Region&amp;lt;/samp&amp;gt; will no longer work in GTK+3 &lt;br /&gt;
&lt;br /&gt;
==== Replacing pixmaps with Cairo ====&lt;br /&gt;
You need to replace your pixmaps with Cairo in GTK+ 3. For an example on how this is done, see: http://developer.gnome.org/gtk3/3.5/ch24s02.html#idp129615008 &lt;br /&gt;
&lt;br /&gt;
===Taking a screenshot and making a thumbnail===&lt;br /&gt;
To make a screenshot of the window:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
width, height = window.get_width(), window.get_height()&lt;br /&gt;
thumb_surface = Gdk.Window.create_similar_surface(window,&lt;br /&gt;
                                                  cairo.CONTENT_COLOR,&lt;br /&gt;
                                                  width, height)&lt;br /&gt;
&lt;br /&gt;
thumb_width, thumb_height = style.zoom(100), style.zoom(80)&lt;br /&gt;
cairo_context = cairo.Context(thumb_surface)&lt;br /&gt;
thumb_scale_w = thumb_width * 1.0 / width&lt;br /&gt;
thumb_scale_h = thumb_height * 1.0 / height&lt;br /&gt;
cairo_context.scale(thumb_scale_w, thumb_scale_h)&lt;br /&gt;
Gdk.cairo_set_source_window(cairo_context, window, 0, 0)&lt;br /&gt;
cairo_context.paint()&lt;br /&gt;
thumb_surface.write_to_png(png_path_or_filelike_object)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Creating a video widget===&lt;br /&gt;
&lt;br /&gt;
Some necessary changes include:&lt;br /&gt;
&lt;br /&gt;
Using&lt;br /&gt;
 get_property(&#039;window&#039;).get_xid()&lt;br /&gt;
&lt;br /&gt;
Instead of&lt;br /&gt;
 window.xid&lt;br /&gt;
Using&lt;br /&gt;
 set_double_buffered(False)&lt;br /&gt;
 set_app_paintable(True)&lt;br /&gt;
Instead of&lt;br /&gt;
 unset_flags(gtk.DOUBLE_BUFFERED)&lt;br /&gt;
 set_flags(gtk.APP_PAINTABLE)&lt;br /&gt;
&lt;br /&gt;
=Hacks to help in porting=&lt;br /&gt;
&lt;br /&gt;
=== Use the same keyboard and mouse ===&lt;br /&gt;
If you have an XO, I&#039;m sure you want to take a look at [[User:Humitos/x2x|this]]...&lt;br /&gt;
===Use Extended Python debugger===&lt;br /&gt;
&#039;&#039;&#039;epdb&#039;&#039;&#039; library is useful to inspect the code while the Activity is running.&lt;br /&gt;
 sudo yum install python-epdb&lt;br /&gt;
After that I put some trace point in the code where I can stop and make my tests by doing this:&lt;br /&gt;
 import epdb;epdb.set_trace()&lt;br /&gt;
Finally I run Get Books Activity from the Terminal Activity to be able to write some code on a shell. This is the command that I use:&lt;br /&gt;
 sugar-launch org.laptop.sugar.GetBooksActivity&lt;br /&gt;
See also [[Development Team/Debugging]].&lt;br /&gt;
===Check logs with &#039;&#039;multitail&#039;&#039;===&lt;br /&gt;
Here is a really useful command to open new logs automatically: [[User:Humitos/MultiTail]]&lt;br /&gt;
===Use the pygobject code as example===&lt;br /&gt;
[https://live.gnome.org/PyGObject pygobject] is what we use to make Gtk3 activities. So, it&#039;s really useful to take a look at the code examples that are there. Even more, you can run some demo application that show how to use something specific about the library.&lt;br /&gt;
*Clone the code:&lt;br /&gt;
 git clone git://git.gnome.org/pygobject&lt;br /&gt;
*Run an example&lt;br /&gt;
 cd pygobject&lt;br /&gt;
 cd demos/gtk-demo/demos&lt;br /&gt;
 python pixbuf.py&lt;br /&gt;
*Grep the code to search for something useful&lt;br /&gt;
 cd pygobject&lt;br /&gt;
 git grep GdkPixbuf&lt;br /&gt;
===Monitoring DBus===&lt;br /&gt;
Not sure how this command works, but it can give us an interesting information. If you run this command and plug an USB drive you will see useful information&lt;br /&gt;
 dbus-monitor --system&lt;br /&gt;
&lt;br /&gt;
=Port to Python 3=&lt;br /&gt;
We are migrating towards Python 3. Python 3 does not support GTK+ 2. Hence, once the activity is ported to GTK+ 3, please consider porting the activity from Python 2 to Python 3. &lt;br /&gt;
&lt;br /&gt;
Ref: [https://github.com/sugarlabs/sugar-docs/blob/master/src/python-porting-guide.md Guide to port activities to Python 3]&lt;br /&gt;
&lt;br /&gt;
=Releasing activities (for maintainers)=&lt;br /&gt;
Once an activity is ported, a new release can be made. The major version should be greater than the existing one. &lt;br /&gt;
&lt;br /&gt;
Please follow [https://github.com/sugarlabs/sugar-docs/blob/master/src/contributing.md#checklist---maintainer this] guide for releasing a new version &lt;br /&gt;
&lt;br /&gt;
=Notes=&lt;br /&gt;
These are the changes implemented by developers while porting activities&lt;br /&gt;
*&amp;lt;code&amp;gt;Gtk.Widget.hide_all()&amp;lt;/code&amp;gt; does not exist anymore. We should use just &amp;lt;code&amp;gt;.hide&amp;lt;/code&amp;gt;&lt;br /&gt;
**Ref: http://developer.gnome.org/gtk3/3.5/GtkWidget.html#gtk-widget-hide&lt;br /&gt;
&lt;br /&gt;
*If the code creates some own object, and it defines some properties, you should use &#039;&#039;&#039;__gproperties__&#039;&#039;&#039; dictionary: http://python-gtk-3-tutorial.readthedocs.org/en/latest/objects.html#GObject.GObject.__gproperties__&lt;br /&gt;
*&amp;lt;code&amp;gt;Gtk.ListStore&amp;lt;/code&amp;gt; doesn&#039;t have the method &#039;&#039;&#039;.reorder&#039;&#039;&#039;. There is a [https://bugzilla.gnome.org/show_bug.cgi?id=677941 ticket] reported upstream about this.&lt;br /&gt;
*I replaced the use of &amp;lt;code&amp;gt;dbus&amp;lt;/code&amp;gt; by [http://developer.gnome.org/gio/unstable/pt02.html Gio] to monitor the (dis)connection of pen drives&lt;br /&gt;
*Migrate custom signals:&lt;br /&gt;
**If you have defined custom gtk objects with custom signal you should migrate them to [http://python-gtk-3-tutorial.readthedocs.org/en/latest/objects.html the new way] to do this.  You should replace this:  from gobject import signal_new, TYPE_INT, TYPE_STRING, TYPE_BOOLEAN, \ TYPE_PYOBJECT, TYPE_NONE, SIGNAL_RUN_LAST   signal_new(&#039;extlistview-modified&#039;, gtk.TreeView, SIGNAL_RUN_LAST, TYPE_NONE,             ()) by adding the signal definition inside the object that you are creating using the &amp;lt;code&amp;gt;__gsignals__&amp;lt;/code&amp;gt; dictionary like this (in this case Gtk.TreeView is the class that our object inherits):  from gi.repository import GObject   class ExtListView(Gtk.TreeView):     __gsignals__ = {       &#039;extlistview-modified&#039;: (GObject.SignalFlags.RUN_LAST, None,                              ()),        } The last argument of the signal definition are the argument types that the callback will receive.&lt;br /&gt;
* Change the mouse cursor&lt;br /&gt;
** Example use case: When the activity is working and we want to show a &#039;&#039;work in progress&#039;&#039; cursor.&lt;br /&gt;
** Replace this:&lt;br /&gt;
 self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))&lt;br /&gt;
with:&lt;br /&gt;
 from gi.repository import Gdk&lt;br /&gt;
 self.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))&lt;br /&gt;
=Resources=&lt;br /&gt;
*PyGI Documentation: https://lazka.github.io/pgi-docs/&lt;br /&gt;
*PYGTK  documentation&lt;br /&gt;
**GTK+ 3: [http://python-gtk-3-tutorial.readthedocs.org/ http://python-gtk-3-tutorial.readthedocs.org]&lt;br /&gt;
**GTK+ 2: http://www.pygtk.org/docs/pygtk/&lt;br /&gt;
*Reference Manual&lt;br /&gt;
**GTK+ 3: http://developer.gnome.org/gtk3/3.4/&lt;br /&gt;
*Gdk documentation:&lt;br /&gt;
**Gdk3: http://developer.gnome.org/gdk/2.24/&lt;br /&gt;
*OLPC Documentation: http://wiki.laptop.org/go/Activities/PortingToGtk3&lt;br /&gt;
*Used to know the arguments of &amp;lt;code&amp;gt;GdkPixbuf.Pixbuf.save_to_bufferv&amp;lt;/code&amp;gt; https://mail.gnome.org/archives/javascript-list/2011-March/msg00001.html&lt;br /&gt;
&lt;br /&gt;
* Pango documentation: http://developer.gnome.org/pangomm&lt;br /&gt;
&lt;br /&gt;
* Gst-1.0 documentation: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/index.html&lt;br /&gt;
&lt;br /&gt;
* Gst-1.0 porting hints: https://wiki.ubuntu.com/Novacut/GStreamer1.0&lt;br /&gt;
[[Category:Developer]]&lt;br /&gt;
&lt;br /&gt;
= More porting wiki pages =&lt;br /&gt;
&lt;br /&gt;
{{Special:PrefixIndex/Features/GTK3/Porting}}&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting&amp;diff=101667</id>
		<title>Features/GTK3/Porting</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting&amp;diff=101667"/>
		<updated>2018-04-05T05:33:50Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Porting an existing activity to GTK3=&lt;br /&gt;
This is a guide to porting an existing activity from GTK2 to [http://developer.gnome.org/gtk3/stable/ GTK3]. It also shows the changes to use the new Sugar toolkit that also now uses [[Features/GTK3|GTK3]]. This guide uses the [https://github.com/sugarlabs/hello-world hello-world] activity as a simple example.&lt;br /&gt;
&lt;br /&gt;
Here are some instances of porting activities, for reference:&lt;br /&gt;
* [https://github.com/sugarlabs/biorhythm/commit/c16de3b70cce2cc6f8af933e2b062c844a47c144/ Biorhythm]&lt;br /&gt;
* [https://github.com/sugarlabs/peru-learns-english-activity/commit/caa2cde526b3823a5a1f7d200a76ad5bc3502b0e Peru Learns English, includes GStreamer and GST update]&lt;br /&gt;
* [https://github.com/sugarlabs/jump/commit/b75410d2879d9829df942726f5465b7cf5a9d98d Port of Jump Activity]&lt;br /&gt;
* [https://github.com/sugarlabs/iknowMadagascar/commit/44ba42645ac4fcd9e06b4add7fa3b6ce2e0d9c3d Port of I-know-Madagascar]&lt;br /&gt;
&lt;br /&gt;
=Steps to Port an Activity to Gtk3=&lt;br /&gt;
#Read the [http://wiki.sugarlabs.org/go/Features/GTK3 Sugar Official Wiki]&lt;br /&gt;
#Resolve any existing pull requests before porting to avoid conflicts at a later stage.&lt;br /&gt;
#Run this [http://git.gnome.org/browse/pygobject/tree/pygi-convert.sh script] that will convert automatically things as much as it can. This is to avoid some stressful manually conversions that a &amp;quot;simple script&amp;quot; can do using &#039;&#039;sed&#039;&#039; :)&lt;br /&gt;
#Follow the [[Development Team/Code guidelines|Code Guidelines]] during all the porting process&lt;br /&gt;
#Make the API changes in sugar-toolkit-gtk3&lt;br /&gt;
#Write comments on the code, by adding &#039;&#039;&#039;# README:&#039;&#039;&#039;, &#039;&#039;&#039;# TODO:&#039;&#039;&#039; and &#039;&#039;&#039;# FIXME:&#039;&#039;&#039; explaining what are the problems that you are having with that chunk of code. Put a link if it&#039;s necessary&lt;br /&gt;
&lt;br /&gt;
==API changes in sugar-toolkit ==&lt;br /&gt;
* The keep button has been removed&lt;br /&gt;
* The old-style toolbar has been removed&lt;br /&gt;
*&amp;lt;code&amp;gt;set_toolbar_box&amp;lt;/code&amp;gt; is used instead of &amp;lt;code&amp;gt;set_toolbox&amp;lt;/code&amp;gt; (see in [http://git.sugarlabs.org/~walter/abacus/walter-cairo/commit/6871dd340a89ade3b5361457e1bd1d58276a8efc Abacus])&lt;br /&gt;
* Remove import of deprecated ActivityToolbox (see [http://git.sugarlabs.org/hello-world/mainline/commit/22060a3063b2d6fd38d6b1cd8d44946170255af3 hello-world])&lt;br /&gt;
* Support for &amp;lt;code&amp;gt;service_name&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; tags in activity.info has been removed. Use &amp;lt;code&amp;gt;bundle_id&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;service_name&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; (see in [http://git.sugarlabs.org/record/mainline/commit/6e8968c71e474e2d8d86886badf5cf7d70217dc5 Record])&lt;br /&gt;
* &amp;lt;code&amp;gt;sugar3.activity.Activity&amp;lt;/code&amp;gt; does not have the &#039;&#039;window&#039;&#039; attribute. Use the &amp;lt;code&amp;gt;.get_window()&amp;lt;/code&amp;gt; method instead.&lt;br /&gt;
&lt;br /&gt;
==Port the activity from GTK2 to GTK3==&lt;br /&gt;
To start, change the importing instruction for GTK from&lt;br /&gt;
 import gtk&lt;br /&gt;
to&lt;br /&gt;
 import gi&lt;br /&gt;
 gi.require_version(&#039;Gtk&#039;, &#039;3.0&#039;)&lt;br /&gt;
 from gi.repository import Gtk&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;code&amp;gt;require_version&amp;lt;/code&amp;gt; needs to called only the first time when Gtk is being imported.&lt;br /&gt;
&lt;br /&gt;
Similar imports that may be used are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from gi.repository import Gdk, Pango, Gobject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then you have to change each call that involves Gtk, for example creating a button will look now like this:&lt;br /&gt;
 button = Gtk.Button()&lt;br /&gt;
&lt;br /&gt;
A simple hello world program in GTK3 looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from gi.repository import Gtk&lt;br /&gt;
&lt;br /&gt;
def _destroy_cb(widget, data=None):&lt;br /&gt;
    Gtk.main_quit()&lt;br /&gt;
&lt;br /&gt;
w = Gtk.Window()&lt;br /&gt;
w.connect(&amp;quot;destroy&amp;quot;, _destroy_cb)&lt;br /&gt;
label = Gtk.Label(&#039;Hello World!&#039;)&lt;br /&gt;
w.add(label)&lt;br /&gt;
w.show_all()&lt;br /&gt;
&lt;br /&gt;
Gtk.main()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For porting your activity you do have to change your calls for accessing widgets and services in the new GTK3 sugar-toolkit as well. The new namespace is called [https://developer.sugarlabs.org/sugar3/ sugar3], trying to reflect that GTK3 is the underlying technology. For example the import of the base activity class has to be changed from&lt;br /&gt;
 from sugar.activity import activity&lt;br /&gt;
to&lt;br /&gt;
 from sugar3.activity import activity&lt;br /&gt;
&lt;br /&gt;
The changes that were needed to port the hello-world activity can be seen in [https://github.com/sugarlabs/hello-world/commit/508e1c518b56cbde5508e560c8a2ff38a3518583 this commit.]&lt;br /&gt;
&lt;br /&gt;
====Simple example on creating a toolbar====&lt;br /&gt;
One of Sugar&#039;s activity most unique user interface includes the toolbar. In order to reference the relevant modules and graphics, the sugar3 library has to be imported. These are the relevant ones that would enable us to create a simple toolbar containing the activity button and the stop button.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sugar3.activity import activity&lt;br /&gt;
from sugar3.graphics.toolbarbox import ToolbarBox&lt;br /&gt;
from sugar3.activity.widgets import ActivityToolbarButton&lt;br /&gt;
from sugar3.activity.widgets import StopButton&lt;br /&gt;
from sugar3.graphics.toolbarbox import ToolbarButton&lt;br /&gt;
from sugar3.graphics import style&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since the ActivityToolbar() module has been deprecated, the toolbar can now be called using&lt;br /&gt;
 ToolbarBox()&lt;br /&gt;
Then, from the ToolbarBox(), include the ActivityButton and StopButton. In order for the StopButton to be align to the right as per Sugar activity interface, a separator has to be included as well.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
toolbar_box = ToolbarBox()&lt;br /&gt;
&lt;br /&gt;
activity_button = ActivityToolbarButton(self)&lt;br /&gt;
toolbar_box.toolbar.insert(activity_button, 0)&lt;br /&gt;
activity_button.show()&lt;br /&gt;
&lt;br /&gt;
separator = Gtk.SeparatorToolItem()&lt;br /&gt;
separator.props.draw = False&lt;br /&gt;
separator.set_expand(True)&lt;br /&gt;
toolbar_box.toolbar.insert(separator, -1)&lt;br /&gt;
separator.show()&lt;br /&gt;
&lt;br /&gt;
stop_button = StopButton(self)&lt;br /&gt;
toolbar_box.toolbar.insert(stop_button, -1)&lt;br /&gt;
stop_button.show()&lt;br /&gt;
self.set_toolbar_box(toolbar_box)&lt;br /&gt;
toolbar_box.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tools===&lt;br /&gt;
There are tools to help you do the porting. There is a script in the pygobject repository for porting called [http://git.gnome.org/browse/pygobject/tree/pygi-convert.sh pygi-convert.sh], more info about the script can be found in [http://live.gnome.org/PyGObject/IntrospectionPorting the PyGObject Introspection Porting guide].&lt;br /&gt;
&lt;br /&gt;
Here is a script to automate the rename of the imports &#039;&#039;&#039;sugar&#039;&#039;&#039; to &#039;&#039;&#039;sugar3&#039;&#039;&#039;: [http://dev.laptop.org/~manuq/sugar-convert.sh sugar-convert.sh].&lt;br /&gt;
&lt;br /&gt;
If you are having trouble finding how a particular GTK class/method/constant has been named in PyGI, run [http://dev.laptop.org/~dsd/20110806/pygi-enumerate.py pygi-enumerate.py] and grep the output. (this app lists all identified methods and constants).  Usage example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ python pygi-enumerate.py | grep get_selection&lt;br /&gt;
Gtk.AccelLabel.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.Editable.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.Entry.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.IconView.get_selection_mode() (instance method)&lt;br /&gt;
Gtk.Label.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.SelectionData.get_selection() (instance method)&lt;br /&gt;
Gtk.SpinButton.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.TextBuffer.get_selection_bound() (instance method)&lt;br /&gt;
Gtk.TextBuffer.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.TreeView.get_selection() (instance method)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Constructor considerations ===&lt;br /&gt;
&lt;br /&gt;
With PyGI it is possible to use Python-like constructors, or &amp;quot;new&amp;quot; functions e.g. the following are (usually) equivalent:&lt;br /&gt;
 label = Gtk.Button()&lt;br /&gt;
 label = Gtk.Button.new()&lt;br /&gt;
&lt;br /&gt;
However, the first form is preferred: it is more Python-like. Internally, the difference is that Gtk.Label.new() translates to a call to gtk_label_new(), whereas Gtk.Label() (the preferred form) will directly construct an instance of GtkLabel at the GObject level.&lt;br /&gt;
&lt;br /&gt;
If the constructor takes parameters, they &#039;&#039;&#039;must&#039;&#039;&#039; be named. The parameters correspond to GObject properties in the API documentation which are usually marked as &amp;quot;Construct&amp;quot;. For example, the following code will not work:&lt;br /&gt;
&lt;br /&gt;
 expander = Gtk.Expander(&amp;quot;my expander&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
The (confusing) error is:&lt;br /&gt;
 TypeError: GObject.__init__() takes exactly 0 arguments (1 given)&lt;br /&gt;
&lt;br /&gt;
The solution is to go to the [http://developer.gnome.org/gtk3/3.2/GtkExpander.html#GtkExpander.properties GtkExpander API documentation] and find the appropriate property that we wish to set. In this case it is &amp;lt;b&amp;gt;label&amp;lt;/b&amp;gt; (which is a Construct property, further increasing our confidence of success), so the code should be:&lt;br /&gt;
&lt;br /&gt;
 expander = Gtk.Expander(label=&amp;quot;my expander&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Combining the two points above, if you wish to call a construct-like function such as gtk_button_new_with_label(), you do have the option of calling Gtk.Button.new_with_label(), however if we check the [http://developer.gnome.org/gtk3/3.2/GtkButton.html#GtkButton.properties GtkButton properties] we see one called &amp;quot;label&amp;quot; which is equivalent. Therefore gtk_button_new_with_label(&amp;quot;foo&amp;quot;) should be called as:&lt;br /&gt;
 button = Gtk.Button(label=&amp;quot;foo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== HBox, VBox, pack_start and pack_end ===&lt;br /&gt;
&lt;br /&gt;
GtkHBox and GtkVBox, commonly used containers in GTK2 code, have pack_start and pack_end methods. These take 4 parameters:&lt;br /&gt;
# The widget to pack into the container&lt;br /&gt;
# &#039;&#039;&#039;expand&#039;&#039;&#039;: Whether the child should receive extra space when the container grows (default True)&lt;br /&gt;
# &#039;&#039;&#039;fill&#039;&#039;&#039;: True if space given to child by the expand option is actually allocated to child, rather than just padding it. This parameter has no effect if expand is set to False. A child is always allocated the full height of a gtk.HBox and the full width of a gtk.VBox. This option affects the other dimension. (default True)&lt;br /&gt;
# &#039;&#039;&#039;padding&#039;&#039;&#039;: extra space in pixels to put between child and its neighbor (default 0)&lt;br /&gt;
&lt;br /&gt;
In PyGTK, the expand, fill and padding parameters were optional: if unspecified, the default values above were used. In PyGI, these parameters are &#039;&#039;&#039;not&#039;&#039;&#039; optional: all 4 must be specified. Hence the rules for adding in the extra parameters are:&lt;br /&gt;
&lt;br /&gt;
# If &#039;&#039;&#039;expand&#039;&#039;&#039; was not set, use value True&lt;br /&gt;
# If &#039;&#039;&#039;fill&#039;&#039;&#039; was not set, use value True. (however, if expand is False, this parameter gets ignored so False is an equally acceptable option when expand=False)&lt;br /&gt;
# If &#039;&#039;&#039;padding&#039;&#039;&#039; was not set, use value 0.&lt;br /&gt;
&lt;br /&gt;
These parameters can be specified either as positional arguments or as named keyword arguments, however all 4 must always be specified. Some developers prefer keyword arguments, arguing that the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;box.pack_start(widget, expand=True, fill=False, padding=4)&amp;lt;/pre&amp;gt;&lt;br /&gt;
is much more readable than:&lt;br /&gt;
&amp;lt;pre&amp;gt;box.pack_start(widget, True, False, 4)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, these functions are called extremely often; any mildly seasoned GTK developer will have memorized the order and meaning of the parameters. Some developers therefore prefer to avoid the extra work of dropping in hundreds of keyword arguments throughout the code and just use the positional ones. This is really up to you.&lt;br /&gt;
&lt;br /&gt;
If you are using pack_start with the default values (expand=True, fill=True and padding=0), you can avoid using pack_start (and the parameter pain that it brings with it) by just using .add for some added cleanliness, e.g.&lt;br /&gt;
&amp;lt;pre&amp;gt;box.pack_start(widget, True, True, 0)&amp;lt;/pre&amp;gt;&lt;br /&gt;
can be replaced with:&lt;br /&gt;
&amp;lt;pre&amp;gt;box.add(widget)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is as far as you need to go for now. However, in GTK3, GtkVBox and GtkHBox have been deprecated, which means they might be removed in GTK3. The replacement is to use GtkBox directly, and you may wish to make this change now. e.g.:&lt;br /&gt;
&amp;lt;pre&amp;gt;vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=True, spacing=8)&amp;lt;/pre&amp;gt;&lt;br /&gt;
However, it must be noted that if GtkBox is used directly (instead of using GtkHBox/GtkVBox), the default value of &#039;&#039;&#039;expand&#039;&#039;&#039; is now &#039;&#039;&#039;False&#039;&#039;&#039;. The implications of this are:&lt;br /&gt;
# You need to check your .add() calls, as previously they would behave as pack_start with expand=True, but now they will behave as expand=False (you need to change them to use pack_start with expand=True to retain the old behaviour)&lt;br /&gt;
# Every single pack_start call that has expand=False and padding=0 (and any value of fill) can be converted to .add() for cleanliness&lt;br /&gt;
&lt;br /&gt;
=== GtkAlignment considerations ===&lt;br /&gt;
&lt;br /&gt;
In PyGTK, the gtk.Alignment constructor takes four optional parameters:&lt;br /&gt;
# xalign: the fraction of horizontal free space to the left of the child widget. Ranges from 0.0 to 1.0. Default value 0.0.&lt;br /&gt;
# yalign: the fraction of vertical free space above the child widget. Ranges from 0.0 to 1.0. Default value 0.0.&lt;br /&gt;
# xscale: the fraction of horizontal free space that the child widget absorbs, from 0.0 to 1.0. Default value 0.0.&lt;br /&gt;
# yscale: the fraction of vertical free space that the child widget absorbs, from 0.0 to 1.0. Default value 0.0&lt;br /&gt;
&lt;br /&gt;
In PyGI/GTK3, these parameters are still optional when used in the Gtk.Alignment constructor (as keyword arguments, as explained above). However, the default values have changed. They are now:&lt;br /&gt;
# xalign: default value 0.5&lt;br /&gt;
# yalign: default value 0.5&lt;br /&gt;
# xscale: default value 1&lt;br /&gt;
# yscale: default value 1&lt;br /&gt;
&lt;br /&gt;
If your code was relying on the default value of 0 for any of these parameters in PyGTK, you will now need to explicitly specify that in your constructor. Similarly, if you were previously using construction parameters to select the now-default values, those parameters can be dropped.&lt;br /&gt;
&lt;br /&gt;
Additionally, PyGTK accepted these construction parameters as positional arguments. As explained above, they must now be converted to keyword arguments.&lt;br /&gt;
&lt;br /&gt;
=== Gtk Menu Popup ===&lt;br /&gt;
The Gtk.Menu.popup function now works slightly differently. &lt;br /&gt;
The user supplied positioning function now takes different parameters. These are menu, x, y, push_in and user_data. &lt;br /&gt;
=== Gdk ===&lt;br /&gt;
Previously, gdk was an attribute of the gtk module, which means that it can be called through gtk. For example, if we want to use color_parse():&lt;br /&gt;
 gtk.gdk.color_parse(color)&lt;br /&gt;
However, what we have to do now is:&lt;br /&gt;
 from gi.repository import Gdk&lt;br /&gt;
Then we can modify the code to the following:&lt;br /&gt;
 Gdk.color_parse(color)&lt;br /&gt;
&lt;br /&gt;
=== Pango ===&lt;br /&gt;
Following the release of Gtk3, we should not be importing pango like this:&lt;br /&gt;
 import pango&lt;br /&gt;
In fact, we can now import pango as an attribute within the gtk3 library:&lt;br /&gt;
 from gi.repository import Pango as pango&lt;br /&gt;
=== Gio.Settings from GConf ===&lt;br /&gt;
Any use of GConf should be ported to Gio.Settings.&lt;br /&gt;
&lt;br /&gt;
=== Other considerations ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;self.allocation&#039;&#039; property is no longer available.  Please search your code for &amp;quot;self.allocation&amp;quot; and replace it for &amp;quot;self.get_allocation()&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So to get the allocation size:&lt;br /&gt;
&lt;br /&gt;
 self.allocation.width&lt;br /&gt;
 self.allocation.height&lt;br /&gt;
&lt;br /&gt;
should be replaced by:&lt;br /&gt;
&lt;br /&gt;
 self.get_allocated_width()&lt;br /&gt;
 self.get_allocated_height()&lt;br /&gt;
&lt;br /&gt;
=== Constants ===&lt;br /&gt;
&lt;br /&gt;
Most of the constants have slightly different formats, e.g.,&lt;br /&gt;
&lt;br /&gt;
gtk.STATE_NORMAL became Gtk.StateFlags.NORMAL&lt;br /&gt;
gtk.RESPONSE_ACCEPT became Gtk.ResponseType.ACCEPT&lt;br /&gt;
gtk.JUSTIFY_CENTER became Gtk.Justification.CENTER&lt;br /&gt;
gtk.RELIEF_NONE became Gtk.ReliefStyle.NONE&lt;br /&gt;
&lt;br /&gt;
=== Pixbufs ===&lt;br /&gt;
&lt;br /&gt;
The pixbuf libraies are in their own repository&lt;br /&gt;
&lt;br /&gt;
 from gi.repository import GdkPixbuf&lt;br /&gt;
&lt;br /&gt;
 GdkPixbuf.Pixbuf.new_from_file()&lt;br /&gt;
&lt;br /&gt;
===Changes to the Clipboard===&lt;br /&gt;
Two things to note:&lt;br /&gt;
&lt;br /&gt;
1. You need to specify a clipboard using get()&lt;br /&gt;
    clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)&lt;br /&gt;
2. You need to pass a length to set_text()&lt;br /&gt;
    clipboard.set_text(string, len(string))&lt;br /&gt;
&lt;br /&gt;
See [http://python-gtk-3-tutorial.readthedocs.org/en/latest/clipboard.html] for more details.&lt;br /&gt;
&lt;br /&gt;
===Changes to Drag-and-Drop===&lt;br /&gt;
Slightly different syntax:&lt;br /&gt;
        self.drag_dest_set(Gtk.DestDefaults.ALL, [],&lt;br /&gt;
                           Gdk.DragAction.COPY)&lt;br /&gt;
        self.drag_dest_set_target_list(Gtk.TargetList.new([]))&lt;br /&gt;
        self.drag_dest_add_text_targets()&lt;br /&gt;
        self.connect(&#039;drag_data_received&#039;, self._drag_data_received)&lt;br /&gt;
&lt;br /&gt;
and:&lt;br /&gt;
        data.get_text()&lt;br /&gt;
or:&lt;br /&gt;
        data.get_image()&lt;br /&gt;
&lt;br /&gt;
See [http://python-gtk-3-tutorial.readthedocs.org/en/latest/drag_and_drop.html] for more details.&lt;br /&gt;
&lt;br /&gt;
===Going from Drawable to Cairo===&lt;br /&gt;
&lt;br /&gt;
GTK-3 does not support gtk Drawable objects, so the first step is to get your activity running under Cairo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import cairo&lt;br /&gt;
&lt;br /&gt;
# From activity.Activity, you inherit a canvas.&lt;br /&gt;
# Create a Cairo context from the window.&lt;br /&gt;
cairo_context = self.canvas.get_window().cairo_create()&lt;br /&gt;
&lt;br /&gt;
# Create an XLib surface to be used for drawing&lt;br /&gt;
xlib_surface = surface.create_similar(cairo.CONTENT_COLOR,&lt;br /&gt;
                                      gtk.gdk.screen_width(),&lt;br /&gt;
                                      gtk.gdk.screen_height())&lt;br /&gt;
&lt;br /&gt;
# You&#039;ll need a Cairo context from which you&#039;ll build a GTK Cairo context&lt;br /&gt;
cairo_context = cairo.Context(xlib_surface)&lt;br /&gt;
cairo_context = gtk.gdk.CairoContext(cairo_context)&lt;br /&gt;
&lt;br /&gt;
# Use this context as you would a Drawable, substituting Cairo commands&lt;br /&gt;
# for gtk commands, e.g.,&lt;br /&gt;
cairo_context.move_to(0, 0)&lt;br /&gt;
cairo_context.line_to(100, 100)&lt;br /&gt;
# Cairo uses floats from 0 to 1 for RGB values&lt;br /&gt;
cairo_context.set_source_rgb(r, g, b)&lt;br /&gt;
cairo_context.rectangle(x, y, w, h)&lt;br /&gt;
cairo_context.fill()&lt;br /&gt;
&lt;br /&gt;
# To invalidate a region to force a refresh, use:&lt;br /&gt;
self.canvas.queue_draw_area(x, y, w, h)&lt;br /&gt;
&lt;br /&gt;
# Handle the expose event&lt;br /&gt;
# &amp;quot;expose&amp;quot; became &amp;quot;draw&amp;quot; for the cairo signal &lt;br /&gt;
def do_expose_event(self, event):&lt;br /&gt;
    # Create the cairo context&lt;br /&gt;
    cairo_context = self.canvas.get_window().cairo_create()&lt;br /&gt;
    cairo_context.rectangle(event.area.x, event.area.y,&lt;br /&gt;
                            event.area.width, event.area.height)&lt;br /&gt;
    cairo_context.clip()&lt;br /&gt;
    cairo_context.set_source_surface(xlib_surface)&lt;br /&gt;
    cairo_context.paint()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pango is a bit different when used with Cairo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import pango, pangocairo&lt;br /&gt;
&lt;br /&gt;
# Again, from the xlib_surface...&lt;br /&gt;
cairo_context = cairo.Context(xlib_surface)&lt;br /&gt;
&lt;br /&gt;
# Create a PangoCairo context&lt;br /&gt;
cairo_context = pangocairo.CairoContext(cairo_context)&lt;br /&gt;
&lt;br /&gt;
# The pango layout is created from the Cairo context&lt;br /&gt;
pango_layout = cairo_context.create_layout()&lt;br /&gt;
&lt;br /&gt;
# You still use pango to set up font descriptions.&lt;br /&gt;
fd = pango.FontDescription(&#039;Sans&#039;)&lt;br /&gt;
fd.set_size(12 * pango.SCALE)&lt;br /&gt;
&lt;br /&gt;
# Tell your pango layout about your font description&lt;br /&gt;
pango_layout.set_font_description(fd)&lt;br /&gt;
&lt;br /&gt;
# Write text to your pango layout&lt;br /&gt;
pango_layout.set_text(&#039;Hello world&#039;, -1)&lt;br /&gt;
&lt;br /&gt;
# Position it within the Cairo context&lt;br /&gt;
cairo_context.save()&lt;br /&gt;
cairo_context.translate(x, y)&lt;br /&gt;
cairo_context.rotate(pi / 3)  # You can rotate text and images in Cairo&lt;br /&gt;
cairo_context.set_source_rgb(1, 0, 0)&lt;br /&gt;
&lt;br /&gt;
# Finally, draw the text&lt;br /&gt;
cairo_context.update_layout(pango_layout)&lt;br /&gt;
cairo_context.show_layout(pango_layout)&lt;br /&gt;
cairo_context.restore()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To draw a bitmap...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Again, from the xlib_surface...&lt;br /&gt;
cairo_context = cairo.Context(xlib_surface)&lt;br /&gt;
&lt;br /&gt;
# Create a gtk context&lt;br /&gt;
cairo_context = gtk.gdk.CairoContext(cairo_context)&lt;br /&gt;
cairo_context.set_source_pixbuf(pixbuf, x, y)&lt;br /&gt;
cairo_context.rectangle(x, y, w, h)&lt;br /&gt;
cairo_context.fill()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To read a pixel from the xlib surface...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# create a new 1x1 cairo surface&lt;br /&gt;
cairo_surface = cairo.ImageSurface(cairo.FORMAT_RGB24, 1, 1);&lt;br /&gt;
cairo_context = cairo.Context(cairo_surface)&lt;br /&gt;
# translate xlib_surface so that target pixel is at 0, 0&lt;br /&gt;
cairo_context.set_source_surface(xlib_surface, -x, -y)&lt;br /&gt;
cairo_context.rectangle(0,0,1,1)&lt;br /&gt;
cairo_context.set_operator(cairo.OPERATOR_SOURCE)&lt;br /&gt;
cairo_context.fill()&lt;br /&gt;
cairo_surface.flush() # ensure all writing is done&lt;br /&gt;
# Read the pixel&lt;br /&gt;
return (ord(pixels[2]), ord(pixels[1]), ord(pixels[0]), 0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Going from Cairo in GTK-2 to Cairo in GTK-3===&lt;br /&gt;
&lt;br /&gt;
(For more detailes, see http://developer.gnome.org/pangomm/2.28/annotated.html)&lt;br /&gt;
&lt;br /&gt;
The Cairo/Pango interaction is a little different:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from gi.repository import Pango, PangoCairo&lt;br /&gt;
&lt;br /&gt;
cairo_context = ...&lt;br /&gt;
pango_layout = PangoCairo.create_layout(cairo_context)&lt;br /&gt;
fd = Pango.FontDescription(&#039;Sans&#039;)&lt;br /&gt;
fd.set_size(12 * Pango.SCALE)&lt;br /&gt;
pango_layout.set_font_description(fd)&lt;br /&gt;
pango_layout.set_text(&#039;Hello World&#039;, -1)&lt;br /&gt;
cairo_context.set_source_rgb(1, 0, 0)&lt;br /&gt;
PangoCairo.update_layout(cairo_context, pango_layout)&lt;br /&gt;
PangoCairo.show_layout(cairo_context, pango_layout)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The get_extents() method if different in PangoCairo. It calculates an extent as a Rectangle, but doesn&#039;t return anything. There is a method, get_logical_extents() that returns a Rectangle. Alas, it is not necessarily available after v1.16. Note that Rectangle is not a list but a class with methods for get_x(), get_y(), get_width(), and get_height(), so you cannot iter over it.&lt;br /&gt;
&lt;br /&gt;
Note that the &amp;lt;samp&amp;gt;cairo.Region&amp;lt;/samp&amp;gt; will no longer work in Gtk+3 &lt;br /&gt;
&lt;br /&gt;
==== Replacing pixmaps with Cairo ====&lt;br /&gt;
You need to replace your pixmaps with Cairo in GTK3. For an example on how this is done, see: http://developer.gnome.org/gtk3/3.5/ch24s02.html#idp129615008 &lt;br /&gt;
&lt;br /&gt;
===Taking a screenshot and making a thumbnail===&lt;br /&gt;
To make a screenshot of the window:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
width, height = window.get_width(), window.get_height()&lt;br /&gt;
thumb_surface = Gdk.Window.create_similar_surface(window,&lt;br /&gt;
                                                  cairo.CONTENT_COLOR,&lt;br /&gt;
                                                  width, height)&lt;br /&gt;
&lt;br /&gt;
thumb_width, thumb_height = style.zoom(100), style.zoom(80)&lt;br /&gt;
cairo_context = cairo.Context(thumb_surface)&lt;br /&gt;
thumb_scale_w = thumb_width * 1.0 / width&lt;br /&gt;
thumb_scale_h = thumb_height * 1.0 / height&lt;br /&gt;
cairo_context.scale(thumb_scale_w, thumb_scale_h)&lt;br /&gt;
Gdk.cairo_set_source_window(cairo_context, window, 0, 0)&lt;br /&gt;
cairo_context.paint()&lt;br /&gt;
thumb_surface.write_to_png(png_path_or_filelike_object)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Creating a video widget===&lt;br /&gt;
&lt;br /&gt;
Some necessary changes include:&lt;br /&gt;
&lt;br /&gt;
Using&lt;br /&gt;
 get_property(&#039;window&#039;).get_xid()&lt;br /&gt;
&lt;br /&gt;
Instead of&lt;br /&gt;
 window.xid&lt;br /&gt;
Using&lt;br /&gt;
 set_double_buffered(False)&lt;br /&gt;
 set_app_paintable(True)&lt;br /&gt;
Instead of&lt;br /&gt;
 unset_flags(gtk.DOUBLE_BUFFERED)&lt;br /&gt;
 set_flags(gtk.APP_PAINTABLE)&lt;br /&gt;
&lt;br /&gt;
=Hacks to help in porting=&lt;br /&gt;
&lt;br /&gt;
=== Use the same keyboard and mouse ===&lt;br /&gt;
If you have an XO, I&#039;m sure you want to take a look at [[User:Humitos/x2x|this]]...&lt;br /&gt;
===Use Extended Python debugger===&lt;br /&gt;
&#039;&#039;&#039;epdb&#039;&#039;&#039; library is useful to inspect the code while the Activity is running.&lt;br /&gt;
 sudo yum install python-epdb&lt;br /&gt;
After that I put some trace point in the code where I can stop and make my tests by doing this:&lt;br /&gt;
 import epdb;epdb.set_trace()&lt;br /&gt;
Finally I run Get Books Activity from the Terminal Activity to be able to write some code on a shell. This is the command that I use:&lt;br /&gt;
 sugar-launch org.laptop.sugar.GetBooksActivity&lt;br /&gt;
See also [[Development Team/Debugging]].&lt;br /&gt;
===Check logs with &#039;&#039;multitail&#039;&#039;===&lt;br /&gt;
Here is a really useful command to open new logs automatically: [[User:Humitos/MultiTail]]&lt;br /&gt;
===Use the pygobject code as example===&lt;br /&gt;
[https://live.gnome.org/PyGObject pygobject] is what we use to make Gtk3 activities. So, it&#039;s really useful to take a look at the code examples that are there. Even more, you can run some demo application that show how to use something specific about the library.&lt;br /&gt;
*Clone the code:&lt;br /&gt;
 git clone git://git.gnome.org/pygobject&lt;br /&gt;
*Run an example&lt;br /&gt;
 cd pygobject&lt;br /&gt;
 cd demos/gtk-demo/demos&lt;br /&gt;
 python pixbuf.py&lt;br /&gt;
*Grep the code to search for something useful&lt;br /&gt;
 cd pygobject&lt;br /&gt;
 git grep GdkPixbuf&lt;br /&gt;
===Monitoring DBus===&lt;br /&gt;
Not sure how this command works, but it can give us an interesting information. If you run this command and plug an USB drive you will see useful information&lt;br /&gt;
 dbus-monitor --system&lt;br /&gt;
&lt;br /&gt;
=Port to Python 3=&lt;br /&gt;
We are migrating towards Python 3. Python 3 does not support GTK+ 2. Hence, once the activity is ported to GTK+ 3, please consider porting the activity from Python 2 to Python 3. &lt;br /&gt;
&lt;br /&gt;
Ref: [https://github.com/sugarlabs/sugar-docs/blob/master/src/python-porting-guide.md Guide to port activities to Python 3]&lt;br /&gt;
&lt;br /&gt;
=Releasing activities (for maintainers)=&lt;br /&gt;
Once an activity is ported, a new release can be made. The major version should be greater than the existing one. &lt;br /&gt;
&lt;br /&gt;
Please follow [https://github.com/sugarlabs/sugar-docs/blob/master/src/contributing.md#checklist---maintainer this] guide for releasing a new version &lt;br /&gt;
&lt;br /&gt;
=Notes=&lt;br /&gt;
These are the changes implemented by developers while porting activities&lt;br /&gt;
*&amp;lt;code&amp;gt;Gtk.Widget.hide_all()&amp;lt;/code&amp;gt; does not exist anymore. We should use just &amp;lt;code&amp;gt;.hide&amp;lt;/code&amp;gt;&lt;br /&gt;
**Ref: http://developer.gnome.org/gtk3/3.5/GtkWidget.html#gtk-widget-hide&lt;br /&gt;
&lt;br /&gt;
*If the code creates some own object, and it defines some properties, you should use &#039;&#039;&#039;__gproperties__&#039;&#039;&#039; dictionary: http://python-gtk-3-tutorial.readthedocs.org/en/latest/objects.html#GObject.GObject.__gproperties__&lt;br /&gt;
*&amp;lt;code&amp;gt;Gtk.ListStore&amp;lt;/code&amp;gt; doesn&#039;t have the method &#039;&#039;&#039;.reorder&#039;&#039;&#039;. There is a [https://bugzilla.gnome.org/show_bug.cgi?id=677941 ticket] reported upstream about this.&lt;br /&gt;
*I replaced the use of &amp;lt;code&amp;gt;dbus&amp;lt;/code&amp;gt; by [http://developer.gnome.org/gio/unstable/pt02.html Gio] to monitor the (dis)connection of pen drives&lt;br /&gt;
*Migrate custom signals:&lt;br /&gt;
**If you have defined custom gtk objects with custom signal you should migrate them to [http://python-gtk-3-tutorial.readthedocs.org/en/latest/objects.html the new way] to do this.  You should replace this:  from gobject import signal_new, TYPE_INT, TYPE_STRING, TYPE_BOOLEAN, \ TYPE_PYOBJECT, TYPE_NONE, SIGNAL_RUN_LAST   signal_new(&#039;extlistview-modified&#039;, gtk.TreeView, SIGNAL_RUN_LAST, TYPE_NONE,             ()) by adding the signal definition inside the object that you are creating using the &amp;lt;code&amp;gt;__gsignals__&amp;lt;/code&amp;gt; dictionary like this (in this case Gtk.TreeView is the class that our object inherits):  from gi.repository import GObject   class ExtListView(Gtk.TreeView):     __gsignals__ = {       &#039;extlistview-modified&#039;: (GObject.SignalFlags.RUN_LAST, None,                              ()),        } The last argument of the signal definition are the argument types that the callback will receive.&lt;br /&gt;
* Change the mouse cursor&lt;br /&gt;
** Example use case: When the activity is working and we want to show a &#039;&#039;work in progress&#039;&#039; cursor.&lt;br /&gt;
** Replace this:&lt;br /&gt;
 self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))&lt;br /&gt;
with:&lt;br /&gt;
 from gi.repository import Gdk&lt;br /&gt;
 self.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))&lt;br /&gt;
=Resources=&lt;br /&gt;
*PyGI Documentation: https://lazka.github.io/pgi-docs/&lt;br /&gt;
*PyGtk documentation&lt;br /&gt;
**Gtk3: [http://python-gtk-3-tutorial.readthedocs.org/ http://python-gtk-3-tutorial.readthedocs.org]&lt;br /&gt;
**gtk2: http://www.pygtk.org/docs/pygtk/&lt;br /&gt;
*Reference Manual&lt;br /&gt;
**Gtk3: http://developer.gnome.org/gtk3/3.4/&lt;br /&gt;
*Gdk documentation:&lt;br /&gt;
**Gdk3: http://developer.gnome.org/gdk/2.24/&lt;br /&gt;
*OLPC Documentation: http://wiki.laptop.org/go/Activities/PortingToGtk3&lt;br /&gt;
*Used to know the arguments of &amp;lt;code&amp;gt;GdkPixbuf.Pixbuf.save_to_bufferv&amp;lt;/code&amp;gt; https://mail.gnome.org/archives/javascript-list/2011-March/msg00001.html&lt;br /&gt;
&lt;br /&gt;
* Pango documentation: http://developer.gnome.org/pangomm&lt;br /&gt;
&lt;br /&gt;
* Gst-1.0 documentation: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/index.html&lt;br /&gt;
&lt;br /&gt;
* Gst-1.0 porting hints: https://wiki.ubuntu.com/Novacut/GStreamer1.0&lt;br /&gt;
[[Category:Developer]]&lt;br /&gt;
&lt;br /&gt;
= More porting wiki pages =&lt;br /&gt;
&lt;br /&gt;
{{Special:PrefixIndex/Features/GTK3/Porting}}&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting&amp;diff=101661</id>
		<title>Features/GTK3/Porting</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting&amp;diff=101661"/>
		<updated>2018-04-04T15:42:39Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: Merge useful content from https://wiki.sugarlabs.org/go/Features/GTK3/Porting/GetBooks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Porting an existing activity to GTK3=&lt;br /&gt;
This is a guide to porting an existing activity from GTK2 to [http://developer.gnome.org/gtk3/stable/ GTK3]. It also shows the changes to use the new Sugar toolkit that also now uses [[Features/GTK3|GTK3]]. This guide uses the [https://github.com/sugarlabs/hello-world hello-world] activity as a simple example.&lt;br /&gt;
&lt;br /&gt;
Here are some instances of porting activities, for reference:&lt;br /&gt;
* [https://github.com/sugarlabs/biorhythm/commit/c16de3b70cce2cc6f8af933e2b062c844a47c144/ Biorhythm]&lt;br /&gt;
* [https://github.com/sugarlabs/peru-learns-english-activity/commit/caa2cde526b3823a5a1f7d200a76ad5bc3502b0e Peru Learns English, includes GStreamer and GST update]&lt;br /&gt;
* [https://github.com/sugarlabs/jump/commit/b75410d2879d9829df942726f5465b7cf5a9d98d Port of Jump Activity]&lt;br /&gt;
* [https://github.com/sugarlabs/iknowMadagascar/commit/44ba42645ac4fcd9e06b4add7fa3b6ce2e0d9c3d Port of I-know-Madagascar]&lt;br /&gt;
&lt;br /&gt;
=Steps to Port an Activity to Gtk3=&lt;br /&gt;
#Read the [http://wiki.sugarlabs.org/go/Features/GTK3 Sugar Official Wiki]&lt;br /&gt;
#Resolve any existing pull requests before porting to avoid conflicts at a later stage.&lt;br /&gt;
#Run this [http://git.gnome.org/browse/pygobject/tree/pygi-convert.sh script] that will convert automatically things as much as it can. This is to avoid some stressful manually conversions that a &amp;quot;simple script&amp;quot; can do using &#039;&#039;sed&#039;&#039; :)&lt;br /&gt;
#Convert all the &amp;lt;code&amp;gt;from sugar.* import&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;from sugar&amp;lt;/code&amp;gt;&#039;&#039;&#039;3&#039;&#039;&#039;&amp;lt;code&amp;gt;.* import&amp;lt;/code&amp;gt; using [http://dev.laptop.org/~manuq/sugar-convert.sh this script]&lt;br /&gt;
#Follow the [[Development Team/Code guidelines|Code Guidelines]] during all the porting process&lt;br /&gt;
#Make the API changes in sugar-toolkit-gtk3&lt;br /&gt;
#Write comments on the code, by adding &#039;&#039;&#039;# README:&#039;&#039;&#039;, &#039;&#039;&#039;# TODO:&#039;&#039;&#039; and &#039;&#039;&#039;# FIXME:&#039;&#039;&#039; explaining what are the problems that you are having with that chunk of code. Put a link if it&#039;s necessary&lt;br /&gt;
Note: If you are considering to fix some &#039;&#039;pep8&#039;&#039; or &#039;&#039;pylint&#039;&#039; errors/warnings, please create two separate patch files (one for the port and one for the pylint/pep8 changes). If we follow this way it is easier to check the port patches, if not the information about the port itself it&#039;s difficult to follow&lt;br /&gt;
&lt;br /&gt;
==Cleanup, adopt to API changes in sugar-toolkit-gtk3 ==&lt;br /&gt;
* the keep button has been removed completely&lt;br /&gt;
* the old-style toolbar has been removed&lt;br /&gt;
* set_toolbar_box is used instead of set_toolbox (see in [http://git.sugarlabs.org/~walter/abacus/walter-cairo/commit/6871dd340a89ade3b5361457e1bd1d58276a8efc Abacus])&lt;br /&gt;
* remove import of deprecated ActivityToolbox (see [http://git.sugarlabs.org/hello-world/mainline/commit/22060a3063b2d6fd38d6b1cd8d44946170255af3 hello-world])&lt;br /&gt;
* support for &#039;service_name&#039; and &#039;class&#039; has been removed from the activity.info make sure you are using: &#039;bundle_id&#039; instead of &#039;service_name&#039; and &#039;exec&#039; instead of &#039;class&#039; (see in [http://git.sugarlabs.org/record/mainline/commit/6e8968c71e474e2d8d86886badf5cf7d70217dc5 Record])&lt;br /&gt;
* &amp;lt;code&amp;gt;sugar3.activity.Activity&amp;lt;/code&amp;gt; doesn&#039;t have the &#039;&#039;window&#039;&#039; attribute. Use the &amp;lt;code&amp;gt;.get_window()&amp;lt;/code&amp;gt; method instead.&lt;br /&gt;
&lt;br /&gt;
==Port the activity from GTK2 to GTK3==&lt;br /&gt;
To start, change the importing instruction for GTK from&lt;br /&gt;
 import gtk&lt;br /&gt;
to&lt;br /&gt;
 import gi&lt;br /&gt;
 gi.require_version(&#039;Gtk&#039;, &#039;3.0&#039;)&lt;br /&gt;
 from gi.repository import Gtk&lt;br /&gt;
&lt;br /&gt;
Note that require_version needs to called only the first time when Gtk is being imported.&lt;br /&gt;
&lt;br /&gt;
Here are some more examples of imports that may be used:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from gi.repository import Gdk, Pango, Gobject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then you have to change each call that involves Gtk, for example creating a button will look now like this:&lt;br /&gt;
 button = Gtk.Button()&lt;br /&gt;
&lt;br /&gt;
A simple hello world program in GTK3 looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from gi.repository import Gtk&lt;br /&gt;
&lt;br /&gt;
def _destroy_cb(widget, data=None):&lt;br /&gt;
    Gtk.main_quit()&lt;br /&gt;
&lt;br /&gt;
w = Gtk.Window()&lt;br /&gt;
w.connect(&amp;quot;destroy&amp;quot;, _destroy_cb)&lt;br /&gt;
label = Gtk.Label(&#039;Hello World!&#039;)&lt;br /&gt;
w.add(label)&lt;br /&gt;
w.show_all()&lt;br /&gt;
&lt;br /&gt;
Gtk.main()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For porting your activity you do have to change your calls for accessing widgets and services in the new GTK3 sugar-toolkit as well. The new namespace is called [https://developer.sugarlabs.org/sugar3/ sugar3], trying to reflect that GTK3 is the underlying technology. For example the import of the base activity class has to be changed from&lt;br /&gt;
 from sugar.activity import activity&lt;br /&gt;
to&lt;br /&gt;
 from sugar3.activity import activity&lt;br /&gt;
&lt;br /&gt;
Make sure you change the setup.py in your activity to point to the new toolkit as well:&lt;br /&gt;
  from sugar3.activity import bundlebuilder&lt;br /&gt;
&lt;br /&gt;
The changes that were needed to port the hello-world activity can be seen in [http://git.sugarlabs.org/hello-world/mainline/commit/508e1c518b56cbde5508e560c8a2ff38a3518583 this commit].&lt;br /&gt;
&lt;br /&gt;
Ok, let&#039;s do these changes now for your activity. Make sure you are in your master branch using the &#039;git branch&#039; command (the master branch should have a &#039;*&#039; before it). Make your changes, commit them (&#039;git commit -a&#039;) and push them to the remote repository (&#039;git push origin master&#039;).&lt;br /&gt;
&lt;br /&gt;
====Simple example on creating a toolbar====&lt;br /&gt;
One of Sugar&#039;s activity most unique user interface includes the toolbar. In order to reference the relevant modules and graphics, the sugar3 library has to be imported. These are the relevant ones that would enable us to create a simple toolbar containing the activity button and the stop button.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sugar3.activity import activity&lt;br /&gt;
from sugar3.graphics.toolbarbox import ToolbarBox&lt;br /&gt;
from sugar3.activity.widgets import ActivityToolbarButton&lt;br /&gt;
from sugar3.activity.widgets import StopButton&lt;br /&gt;
from sugar3.graphics.toolbarbox import ToolbarButton&lt;br /&gt;
from sugar3.graphics import style&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since the ActivityToolbar() module has been deprecated, the toolbar can now be called using&lt;br /&gt;
 ToolbarBox()&lt;br /&gt;
Then, from the ToolbarBox(), include the ActivityButton and StopButton. In order for the StopButton to be align to the right as per Sugar activity interface, a separator has to be included as well.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
toolbar_box = ToolbarBox()&lt;br /&gt;
&lt;br /&gt;
activity_button = ActivityToolbarButton(self)&lt;br /&gt;
toolbar_box.toolbar.insert(activity_button, 0)&lt;br /&gt;
activity_button.show()&lt;br /&gt;
&lt;br /&gt;
separator = Gtk.SeparatorToolItem()&lt;br /&gt;
separator.props.draw = False&lt;br /&gt;
separator.set_expand(True)&lt;br /&gt;
toolbar_box.toolbar.insert(separator, -1)&lt;br /&gt;
separator.show()&lt;br /&gt;
&lt;br /&gt;
stop_button = StopButton(self)&lt;br /&gt;
toolbar_box.toolbar.insert(stop_button, -1)&lt;br /&gt;
stop_button.show()&lt;br /&gt;
self.set_toolbar_box(toolbar_box)&lt;br /&gt;
toolbar_box.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tools===&lt;br /&gt;
There are tools to help you do the porting. There is a script in the pygobject repository for porting called [http://git.gnome.org/browse/pygobject/tree/pygi-convert.sh pygi-convert.sh], more info about the script can be found in [http://live.gnome.org/PyGObject/IntrospectionPorting the PyGObject Introspection Porting guide].&lt;br /&gt;
&lt;br /&gt;
Here is a script to automate the rename of the imports &#039;&#039;&#039;sugar&#039;&#039;&#039; to &#039;&#039;&#039;sugar3&#039;&#039;&#039;: [http://dev.laptop.org/~manuq/sugar-convert.sh sugar-convert.sh].&lt;br /&gt;
&lt;br /&gt;
If you are having trouble finding how a particular GTK class/method/constant has been named in PyGI, run [http://dev.laptop.org/~dsd/20110806/pygi-enumerate.py pygi-enumerate.py] and grep the output. (this app lists all identified methods and constants).  Usage example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ python pygi-enumerate.py | grep get_selection&lt;br /&gt;
Gtk.AccelLabel.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.Editable.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.Entry.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.IconView.get_selection_mode() (instance method)&lt;br /&gt;
Gtk.Label.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.SelectionData.get_selection() (instance method)&lt;br /&gt;
Gtk.SpinButton.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.TextBuffer.get_selection_bound() (instance method)&lt;br /&gt;
Gtk.TextBuffer.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.TreeView.get_selection() (instance method)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Constructor considerations ===&lt;br /&gt;
&lt;br /&gt;
With PyGI it is possible to use Python-like constructors, or &amp;quot;new&amp;quot; functions e.g. the following are (usually) equivalent:&lt;br /&gt;
 label = Gtk.Button()&lt;br /&gt;
 label = Gtk.Button.new()&lt;br /&gt;
&lt;br /&gt;
However, the first form is preferred: it is more Python-like. Internally, the difference is that Gtk.Label.new() translates to a call to gtk_label_new(), whereas Gtk.Label() (the preferred form) will directly construct an instance of GtkLabel at the GObject level.&lt;br /&gt;
&lt;br /&gt;
If the constructor takes parameters, they &#039;&#039;&#039;must&#039;&#039;&#039; be named. The parameters correspond to GObject properties in the API documentation which are usually marked as &amp;quot;Construct&amp;quot;. For example, the following code will not work:&lt;br /&gt;
&lt;br /&gt;
 expander = Gtk.Expander(&amp;quot;my expander&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
The (confusing) error is:&lt;br /&gt;
 TypeError: GObject.__init__() takes exactly 0 arguments (1 given)&lt;br /&gt;
&lt;br /&gt;
The solution is to go to the [http://developer.gnome.org/gtk3/3.2/GtkExpander.html#GtkExpander.properties GtkExpander API documentation] and find the appropriate property that we wish to set. In this case it is &amp;lt;b&amp;gt;label&amp;lt;/b&amp;gt; (which is a Construct property, further increasing our confidence of success), so the code should be:&lt;br /&gt;
&lt;br /&gt;
 expander = Gtk.Expander(label=&amp;quot;my expander&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Combining the two points above, if you wish to call a construct-like function such as gtk_button_new_with_label(), you do have the option of calling Gtk.Button.new_with_label(), however if we check the [http://developer.gnome.org/gtk3/3.2/GtkButton.html#GtkButton.properties GtkButton properties] we see one called &amp;quot;label&amp;quot; which is equivalent. Therefore gtk_button_new_with_label(&amp;quot;foo&amp;quot;) should be called as:&lt;br /&gt;
 button = Gtk.Button(label=&amp;quot;foo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== HBox, VBox, pack_start and pack_end ===&lt;br /&gt;
&lt;br /&gt;
GtkHBox and GtkVBox, commonly used containers in GTK2 code, have pack_start and pack_end methods. These take 4 parameters:&lt;br /&gt;
# The widget to pack into the container&lt;br /&gt;
# &#039;&#039;&#039;expand&#039;&#039;&#039;: Whether the child should receive extra space when the container grows (default True)&lt;br /&gt;
# &#039;&#039;&#039;fill&#039;&#039;&#039;: True if space given to child by the expand option is actually allocated to child, rather than just padding it. This parameter has no effect if expand is set to False. A child is always allocated the full height of a gtk.HBox and the full width of a gtk.VBox. This option affects the other dimension. (default True)&lt;br /&gt;
# &#039;&#039;&#039;padding&#039;&#039;&#039;: extra space in pixels to put between child and its neighbor (default 0)&lt;br /&gt;
&lt;br /&gt;
In PyGTK, the expand, fill and padding parameters were optional: if unspecified, the default values above were used. In PyGI, these parameters are &#039;&#039;&#039;not&#039;&#039;&#039; optional: all 4 must be specified. Hence the rules for adding in the extra parameters are:&lt;br /&gt;
&lt;br /&gt;
# If &#039;&#039;&#039;expand&#039;&#039;&#039; was not set, use value True&lt;br /&gt;
# If &#039;&#039;&#039;fill&#039;&#039;&#039; was not set, use value True. (however, if expand is False, this parameter gets ignored so False is an equally acceptable option when expand=False)&lt;br /&gt;
# If &#039;&#039;&#039;padding&#039;&#039;&#039; was not set, use value 0.&lt;br /&gt;
&lt;br /&gt;
These parameters can be specified either as positional arguments or as named keyword arguments, however all 4 must always be specified. Some developers prefer keyword arguments, arguing that the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;box.pack_start(widget, expand=True, fill=False, padding=4)&amp;lt;/pre&amp;gt;&lt;br /&gt;
is much more readable than:&lt;br /&gt;
&amp;lt;pre&amp;gt;box.pack_start(widget, True, False, 4)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, these functions are called extremely often; any mildly seasoned GTK developer will have memorized the order and meaning of the parameters. Some developers therefore prefer to avoid the extra work of dropping in hundreds of keyword arguments throughout the code and just use the positional ones. This is really up to you.&lt;br /&gt;
&lt;br /&gt;
If you are using pack_start with the default values (expand=True, fill=True and padding=0), you can avoid using pack_start (and the parameter pain that it brings with it) by just using .add for some added cleanliness, e.g.&lt;br /&gt;
&amp;lt;pre&amp;gt;box.pack_start(widget, True, True, 0)&amp;lt;/pre&amp;gt;&lt;br /&gt;
can be replaced with:&lt;br /&gt;
&amp;lt;pre&amp;gt;box.add(widget)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is as far as you need to go for now. However, in GTK3, GtkVBox and GtkHBox have been deprecated, which means they might be removed in GTK3. The replacement is to use GtkBox directly, and you may wish to make this change now. e.g.:&lt;br /&gt;
&amp;lt;pre&amp;gt;vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=True, spacing=8)&amp;lt;/pre&amp;gt;&lt;br /&gt;
However, it must be noted that if GtkBox is used directly (instead of using GtkHBox/GtkVBox), the default value of &#039;&#039;&#039;expand&#039;&#039;&#039; is now &#039;&#039;&#039;False&#039;&#039;&#039;. The implications of this are:&lt;br /&gt;
# You need to check your .add() calls, as previously they would behave as pack_start with expand=True, but now they will behave as expand=False (you need to change them to use pack_start with expand=True to retain the old behaviour)&lt;br /&gt;
# Every single pack_start call that has expand=False and padding=0 (and any value of fill) can be converted to .add() for cleanliness&lt;br /&gt;
&lt;br /&gt;
=== GtkAlignment considerations ===&lt;br /&gt;
&lt;br /&gt;
In PyGTK, the gtk.Alignment constructor takes four optional parameters:&lt;br /&gt;
# xalign: the fraction of horizontal free space to the left of the child widget. Ranges from 0.0 to 1.0. Default value 0.0.&lt;br /&gt;
# yalign: the fraction of vertical free space above the child widget. Ranges from 0.0 to 1.0. Default value 0.0.&lt;br /&gt;
# xscale: the fraction of horizontal free space that the child widget absorbs, from 0.0 to 1.0. Default value 0.0.&lt;br /&gt;
# yscale: the fraction of vertical free space that the child widget absorbs, from 0.0 to 1.0. Default value 0.0&lt;br /&gt;
&lt;br /&gt;
In PyGI/GTK3, these parameters are still optional when used in the Gtk.Alignment constructor (as keyword arguments, as explained above). However, the default values have changed. They are now:&lt;br /&gt;
# xalign: default value 0.5&lt;br /&gt;
# yalign: default value 0.5&lt;br /&gt;
# xscale: default value 1&lt;br /&gt;
# yscale: default value 1&lt;br /&gt;
&lt;br /&gt;
If your code was relying on the default value of 0 for any of these parameters in PyGTK, you will now need to explicitly specify that in your constructor. Similarly, if you were previously using construction parameters to select the now-default values, those parameters can be dropped.&lt;br /&gt;
&lt;br /&gt;
Additionally, PyGTK accepted these construction parameters as positional arguments. As explained above, they must now be converted to keyword arguments.&lt;br /&gt;
&lt;br /&gt;
=== Gtk Menu Popup ===&lt;br /&gt;
The Gtk.Menu.popup function now works slightly differently. &lt;br /&gt;
The user supplied positioning function now takes different parameters. These are menu, x, y, push_in and user_data. &lt;br /&gt;
=== Gdk ===&lt;br /&gt;
Previously, gdk was an attribute of the gtk module, which means that it can be called through gtk. For example, if we want to use color_parse():&lt;br /&gt;
 gtk.gdk.color_parse(color)&lt;br /&gt;
However, what we have to do now is:&lt;br /&gt;
 from gi.repository import Gdk&lt;br /&gt;
Then we can modify the code to the following:&lt;br /&gt;
 Gdk.color_parse(color)&lt;br /&gt;
&lt;br /&gt;
=== Pango ===&lt;br /&gt;
Following the release of Gtk3, we should not be importing pango like this:&lt;br /&gt;
 import pango&lt;br /&gt;
In fact, we can now import pango as an attribute within the gtk3 library:&lt;br /&gt;
 from gi.repository import Pango as pango&lt;br /&gt;
=== Gio.Settings from GConf ===&lt;br /&gt;
Any use of GConf should be ported to Gio.Settings.&lt;br /&gt;
&lt;br /&gt;
=== Other considerations ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;self.allocation&#039;&#039; property is no longer available.  Please search your code for &amp;quot;self.allocation&amp;quot; and replace it for &amp;quot;self.get_allocation()&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So to get the allocation size:&lt;br /&gt;
&lt;br /&gt;
 self.allocation.width&lt;br /&gt;
 self.allocation.height&lt;br /&gt;
&lt;br /&gt;
should be replaced by:&lt;br /&gt;
&lt;br /&gt;
 self.get_allocated_width()&lt;br /&gt;
 self.get_allocated_height()&lt;br /&gt;
&lt;br /&gt;
=== Constants ===&lt;br /&gt;
&lt;br /&gt;
Most of the constants have slightly different formats, e.g.,&lt;br /&gt;
&lt;br /&gt;
gtk.STATE_NORMAL became Gtk.StateFlags.NORMAL&lt;br /&gt;
gtk.RESPONSE_ACCEPT became Gtk.ResponseType.ACCEPT&lt;br /&gt;
gtk.JUSTIFY_CENTER became Gtk.Justification.CENTER&lt;br /&gt;
gtk.RELIEF_NONE became Gtk.ReliefStyle.NONE&lt;br /&gt;
&lt;br /&gt;
=== Pixbufs ===&lt;br /&gt;
&lt;br /&gt;
The pixbuf libraies are in their own repository&lt;br /&gt;
&lt;br /&gt;
 from gi.repository import GdkPixbuf&lt;br /&gt;
&lt;br /&gt;
 GdkPixbuf.Pixbuf.new_from_file()&lt;br /&gt;
&lt;br /&gt;
===Changes to the Clipboard===&lt;br /&gt;
Two things to note:&lt;br /&gt;
&lt;br /&gt;
1. You need to specify a clipboard using get()&lt;br /&gt;
    clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)&lt;br /&gt;
2. You need to pass a length to set_text()&lt;br /&gt;
    clipboard.set_text(string, len(string))&lt;br /&gt;
&lt;br /&gt;
See [http://python-gtk-3-tutorial.readthedocs.org/en/latest/clipboard.html] for more details.&lt;br /&gt;
&lt;br /&gt;
===Changes to Drag-and-Drop===&lt;br /&gt;
Slightly different syntax:&lt;br /&gt;
        self.drag_dest_set(Gtk.DestDefaults.ALL, [],&lt;br /&gt;
                           Gdk.DragAction.COPY)&lt;br /&gt;
        self.drag_dest_set_target_list(Gtk.TargetList.new([]))&lt;br /&gt;
        self.drag_dest_add_text_targets()&lt;br /&gt;
        self.connect(&#039;drag_data_received&#039;, self._drag_data_received)&lt;br /&gt;
&lt;br /&gt;
and:&lt;br /&gt;
        data.get_text()&lt;br /&gt;
or:&lt;br /&gt;
        data.get_image()&lt;br /&gt;
&lt;br /&gt;
See [http://python-gtk-3-tutorial.readthedocs.org/en/latest/drag_and_drop.html] for more details.&lt;br /&gt;
&lt;br /&gt;
===Going from Drawable to Cairo===&lt;br /&gt;
&lt;br /&gt;
GTK-3 does not support gtk Drawable objects, so the first step is to get your activity running under Cairo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import cairo&lt;br /&gt;
&lt;br /&gt;
# From activity.Activity, you inherit a canvas.&lt;br /&gt;
# Create a Cairo context from the window.&lt;br /&gt;
cairo_context = self.canvas.get_window().cairo_create()&lt;br /&gt;
&lt;br /&gt;
# Create an XLib surface to be used for drawing&lt;br /&gt;
xlib_surface = surface.create_similar(cairo.CONTENT_COLOR,&lt;br /&gt;
                                      gtk.gdk.screen_width(),&lt;br /&gt;
                                      gtk.gdk.screen_height())&lt;br /&gt;
&lt;br /&gt;
# You&#039;ll need a Cairo context from which you&#039;ll build a GTK Cairo context&lt;br /&gt;
cairo_context = cairo.Context(xlib_surface)&lt;br /&gt;
cairo_context = gtk.gdk.CairoContext(cairo_context)&lt;br /&gt;
&lt;br /&gt;
# Use this context as you would a Drawable, substituting Cairo commands&lt;br /&gt;
# for gtk commands, e.g.,&lt;br /&gt;
cairo_context.move_to(0, 0)&lt;br /&gt;
cairo_context.line_to(100, 100)&lt;br /&gt;
# Cairo uses floats from 0 to 1 for RGB values&lt;br /&gt;
cairo_context.set_source_rgb(r, g, b)&lt;br /&gt;
cairo_context.rectangle(x, y, w, h)&lt;br /&gt;
cairo_context.fill()&lt;br /&gt;
&lt;br /&gt;
# To invalidate a region to force a refresh, use:&lt;br /&gt;
self.canvas.queue_draw_area(x, y, w, h)&lt;br /&gt;
&lt;br /&gt;
# Handle the expose event&lt;br /&gt;
# &amp;quot;expose&amp;quot; became &amp;quot;draw&amp;quot; for the cairo signal &lt;br /&gt;
def do_expose_event(self, event):&lt;br /&gt;
    # Create the cairo context&lt;br /&gt;
    cairo_context = self.canvas.get_window().cairo_create()&lt;br /&gt;
    cairo_context.rectangle(event.area.x, event.area.y,&lt;br /&gt;
                            event.area.width, event.area.height)&lt;br /&gt;
    cairo_context.clip()&lt;br /&gt;
    cairo_context.set_source_surface(xlib_surface)&lt;br /&gt;
    cairo_context.paint()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pango is a bit different when used with Cairo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import pango, pangocairo&lt;br /&gt;
&lt;br /&gt;
# Again, from the xlib_surface...&lt;br /&gt;
cairo_context = cairo.Context(xlib_surface)&lt;br /&gt;
&lt;br /&gt;
# Create a PangoCairo context&lt;br /&gt;
cairo_context = pangocairo.CairoContext(cairo_context)&lt;br /&gt;
&lt;br /&gt;
# The pango layout is created from the Cairo context&lt;br /&gt;
pango_layout = cairo_context.create_layout()&lt;br /&gt;
&lt;br /&gt;
# You still use pango to set up font descriptions.&lt;br /&gt;
fd = pango.FontDescription(&#039;Sans&#039;)&lt;br /&gt;
fd.set_size(12 * pango.SCALE)&lt;br /&gt;
&lt;br /&gt;
# Tell your pango layout about your font description&lt;br /&gt;
pango_layout.set_font_description(fd)&lt;br /&gt;
&lt;br /&gt;
# Write text to your pango layout&lt;br /&gt;
pango_layout.set_text(&#039;Hello world&#039;, -1)&lt;br /&gt;
&lt;br /&gt;
# Position it within the Cairo context&lt;br /&gt;
cairo_context.save()&lt;br /&gt;
cairo_context.translate(x, y)&lt;br /&gt;
cairo_context.rotate(pi / 3)  # You can rotate text and images in Cairo&lt;br /&gt;
cairo_context.set_source_rgb(1, 0, 0)&lt;br /&gt;
&lt;br /&gt;
# Finally, draw the text&lt;br /&gt;
cairo_context.update_layout(pango_layout)&lt;br /&gt;
cairo_context.show_layout(pango_layout)&lt;br /&gt;
cairo_context.restore()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To draw a bitmap...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Again, from the xlib_surface...&lt;br /&gt;
cairo_context = cairo.Context(xlib_surface)&lt;br /&gt;
&lt;br /&gt;
# Create a gtk context&lt;br /&gt;
cairo_context = gtk.gdk.CairoContext(cairo_context)&lt;br /&gt;
cairo_context.set_source_pixbuf(pixbuf, x, y)&lt;br /&gt;
cairo_context.rectangle(x, y, w, h)&lt;br /&gt;
cairo_context.fill()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To read a pixel from the xlib surface...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# create a new 1x1 cairo surface&lt;br /&gt;
cairo_surface = cairo.ImageSurface(cairo.FORMAT_RGB24, 1, 1);&lt;br /&gt;
cairo_context = cairo.Context(cairo_surface)&lt;br /&gt;
# translate xlib_surface so that target pixel is at 0, 0&lt;br /&gt;
cairo_context.set_source_surface(xlib_surface, -x, -y)&lt;br /&gt;
cairo_context.rectangle(0,0,1,1)&lt;br /&gt;
cairo_context.set_operator(cairo.OPERATOR_SOURCE)&lt;br /&gt;
cairo_context.fill()&lt;br /&gt;
cairo_surface.flush() # ensure all writing is done&lt;br /&gt;
# Read the pixel&lt;br /&gt;
return (ord(pixels[2]), ord(pixels[1]), ord(pixels[0]), 0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Going from Cairo in GTK-2 to Cairo in GTK-3===&lt;br /&gt;
&lt;br /&gt;
(For more detailes, see http://developer.gnome.org/pangomm/2.28/annotated.html)&lt;br /&gt;
&lt;br /&gt;
The Cairo/Pango interaction is a little different:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from gi.repository import Pango, PangoCairo&lt;br /&gt;
&lt;br /&gt;
cairo_context = ...&lt;br /&gt;
pango_layout = PangoCairo.create_layout(cairo_context)&lt;br /&gt;
fd = Pango.FontDescription(&#039;Sans&#039;)&lt;br /&gt;
fd.set_size(12 * Pango.SCALE)&lt;br /&gt;
pango_layout.set_font_description(fd)&lt;br /&gt;
pango_layout.set_text(&#039;Hello World&#039;, -1)&lt;br /&gt;
cairo_context.set_source_rgb(1, 0, 0)&lt;br /&gt;
PangoCairo.update_layout(cairo_context, pango_layout)&lt;br /&gt;
PangoCairo.show_layout(cairo_context, pango_layout)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The get_extents() method if different in PangoCairo. It calculates an extent as a Rectangle, but doesn&#039;t return anything. There is a method, get_logical_extents() that returns a Rectangle. Alas, it is not necessarily available after v1.16. Note that Rectangle is not a list but a class with methods for get_x(), get_y(), get_width(), and get_height(), so you cannot iter over it.&lt;br /&gt;
&lt;br /&gt;
Note that the &amp;lt;samp&amp;gt;cairo.Region&amp;lt;/samp&amp;gt; will no longer work in Gtk+3 &lt;br /&gt;
&lt;br /&gt;
==== Replacing pixmaps with Cairo ====&lt;br /&gt;
You need to replace your pixmaps with Cairo in GTK3. For an example on how this is done, see: http://developer.gnome.org/gtk3/3.5/ch24s02.html#idp129615008 &lt;br /&gt;
&lt;br /&gt;
===Taking a screenshot and making a thumbnail===&lt;br /&gt;
To make a screenshot of the window:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
width, height = window.get_width(), window.get_height()&lt;br /&gt;
thumb_surface = Gdk.Window.create_similar_surface(window,&lt;br /&gt;
                                                  cairo.CONTENT_COLOR,&lt;br /&gt;
                                                  width, height)&lt;br /&gt;
&lt;br /&gt;
thumb_width, thumb_height = style.zoom(100), style.zoom(80)&lt;br /&gt;
cairo_context = cairo.Context(thumb_surface)&lt;br /&gt;
thumb_scale_w = thumb_width * 1.0 / width&lt;br /&gt;
thumb_scale_h = thumb_height * 1.0 / height&lt;br /&gt;
cairo_context.scale(thumb_scale_w, thumb_scale_h)&lt;br /&gt;
Gdk.cairo_set_source_window(cairo_context, window, 0, 0)&lt;br /&gt;
cairo_context.paint()&lt;br /&gt;
thumb_surface.write_to_png(png_path_or_filelike_object)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Creating a video widget===&lt;br /&gt;
&lt;br /&gt;
Some necessary changes include:&lt;br /&gt;
&lt;br /&gt;
Using&lt;br /&gt;
 get_property(&#039;window&#039;).get_xid()&lt;br /&gt;
&lt;br /&gt;
Instead of&lt;br /&gt;
 window.xid&lt;br /&gt;
Using&lt;br /&gt;
 set_double_buffered(False)&lt;br /&gt;
 set_app_paintable(True)&lt;br /&gt;
Instead of&lt;br /&gt;
 unset_flags(gtk.DOUBLE_BUFFERED)&lt;br /&gt;
 set_flags(gtk.APP_PAINTABLE)&lt;br /&gt;
&lt;br /&gt;
=Hacks to help in porting=&lt;br /&gt;
&lt;br /&gt;
=== Use the same keyboard and mouse ===&lt;br /&gt;
If you have an XO, I&#039;m sure you want to take a look at [[User:Humitos/x2x|this]]...&lt;br /&gt;
===Use Extended Python debugger===&lt;br /&gt;
&#039;&#039;&#039;epdb&#039;&#039;&#039; library is useful to inspect the code while the Activity is running.&lt;br /&gt;
 sudo yum install python-epdb&lt;br /&gt;
After that I put some trace point in the code where I can stop and make my tests by doing this:&lt;br /&gt;
 import epdb;epdb.set_trace()&lt;br /&gt;
Finally I run Get Books Activity from the Terminal Activity to be able to write some code on a shell. This is the command that I use:&lt;br /&gt;
 sugar-launch org.laptop.sugar.GetBooksActivity&lt;br /&gt;
See also [[Development Team/Debugging]].&lt;br /&gt;
===Check logs with &#039;&#039;multitail&#039;&#039;===&lt;br /&gt;
Here is a really useful command to open new logs automatically: [[User:Humitos/MultiTail]]&lt;br /&gt;
===Use the pygobject code as example===&lt;br /&gt;
[https://live.gnome.org/PyGObject pygobject] is what we use to make Gtk3 activities. So, it&#039;s really useful to take a look at the code examples that are there. Even more, you can run some demo application that show how to use something specific about the library.&lt;br /&gt;
*Clone the code:&lt;br /&gt;
 git clone git://git.gnome.org/pygobject&lt;br /&gt;
*Run an example&lt;br /&gt;
 cd pygobject&lt;br /&gt;
 cd demos/gtk-demo/demos&lt;br /&gt;
 python pixbuf.py&lt;br /&gt;
*Grep the code to search for something useful&lt;br /&gt;
 cd pygobject&lt;br /&gt;
 git grep GdkPixbuf&lt;br /&gt;
===Monitoring DBus===&lt;br /&gt;
Not sure how this command works, but it can give us an interesting information. If you run this command and plug an USB drive you will see useful information&lt;br /&gt;
 dbus-monitor --system&lt;br /&gt;
&lt;br /&gt;
=Port to Python 3=&lt;br /&gt;
We are migrating towards Python 3. Python 3 does not support GTK+ 2. Hence, once the activity is ported to GTK+ 3, please consider porting the activity from Python 2 to Python 3. &lt;br /&gt;
&lt;br /&gt;
Ref: [https://github.com/sugarlabs/sugar-docs/blob/master/src/python-porting-guide.md Guide to port activities to Python 3]&lt;br /&gt;
&lt;br /&gt;
=Releasing activities (for maintainers)=&lt;br /&gt;
Once an activity is ported, a new release can be made. The major version should be greater than the existing one. &lt;br /&gt;
&lt;br /&gt;
Please follow [https://github.com/sugarlabs/sugar-docs/blob/master/src/contributing.md#checklist---maintainer this] guide for releasing a new version &lt;br /&gt;
&lt;br /&gt;
=Notes=&lt;br /&gt;
These are the changes implemented by developers while porting activities&lt;br /&gt;
*&amp;lt;code&amp;gt;Gtk.Widget.hide_all()&amp;lt;/code&amp;gt; does not exist anymore. We should use just &amp;lt;code&amp;gt;.hide&amp;lt;/code&amp;gt;&lt;br /&gt;
**Ref: http://developer.gnome.org/gtk3/3.5/GtkWidget.html#gtk-widget-hide&lt;br /&gt;
&lt;br /&gt;
*If the code creates some own object, and it defines some properties, you should use &#039;&#039;&#039;__gproperties__&#039;&#039;&#039; dictionary: http://python-gtk-3-tutorial.readthedocs.org/en/latest/objects.html#GObject.GObject.__gproperties__&lt;br /&gt;
*&amp;lt;code&amp;gt;Gtk.ListStore&amp;lt;/code&amp;gt; doesn&#039;t have the method &#039;&#039;&#039;.reorder&#039;&#039;&#039;. There is a [https://bugzilla.gnome.org/show_bug.cgi?id=677941 ticket] reported upstream about this.&lt;br /&gt;
*I replaced the use of &amp;lt;code&amp;gt;dbus&amp;lt;/code&amp;gt; by [http://developer.gnome.org/gio/unstable/pt02.html Gio] to monitor the (dis)connection of pen drives&lt;br /&gt;
*Migrate custom signals:&lt;br /&gt;
**If you have defined custom gtk objects with custom signal you should migrate them to [http://python-gtk-3-tutorial.readthedocs.org/en/latest/objects.html the new way] to do this.  You should replace this:  from gobject import signal_new, TYPE_INT, TYPE_STRING, TYPE_BOOLEAN, \ TYPE_PYOBJECT, TYPE_NONE, SIGNAL_RUN_LAST   signal_new(&#039;extlistview-modified&#039;, gtk.TreeView, SIGNAL_RUN_LAST, TYPE_NONE,             ()) by adding the signal definition inside the object that you are creating using the &amp;lt;code&amp;gt;__gsignals__&amp;lt;/code&amp;gt; dictionary like this (in this case Gtk.TreeView is the class that our object inherits):  from gi.repository import GObject   class ExtListView(Gtk.TreeView):     __gsignals__ = {       &#039;extlistview-modified&#039;: (GObject.SignalFlags.RUN_LAST, None,                              ()),        } The last argument of the signal definition are the argument types that the callback will receive.&lt;br /&gt;
* Change the mouse cursor&lt;br /&gt;
** Example use case: When the activity is working and we want to show a &#039;&#039;work in progress&#039;&#039; cursor.&lt;br /&gt;
** Replace this:&lt;br /&gt;
 self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))&lt;br /&gt;
with:&lt;br /&gt;
 from gi.repository import Gdk&lt;br /&gt;
 self.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))&lt;br /&gt;
=Resources=&lt;br /&gt;
*PyGI Documentation: https://lazka.github.io/pgi-docs/&lt;br /&gt;
*PyGtk documentation&lt;br /&gt;
**Gtk3: [http://python-gtk-3-tutorial.readthedocs.org/ http://python-gtk-3-tutorial.readthedocs.org]&lt;br /&gt;
**gtk2: http://www.pygtk.org/docs/pygtk/&lt;br /&gt;
*Reference Manual&lt;br /&gt;
**Gtk3: http://developer.gnome.org/gtk3/3.4/&lt;br /&gt;
*Gdk documentation:&lt;br /&gt;
**Gdk3: http://developer.gnome.org/gdk/2.24/&lt;br /&gt;
*OLPC Documentation: http://wiki.laptop.org/go/Activities/PortingToGtk3&lt;br /&gt;
*Used to know the arguments of &amp;lt;code&amp;gt;GdkPixbuf.Pixbuf.save_to_bufferv&amp;lt;/code&amp;gt; https://mail.gnome.org/archives/javascript-list/2011-March/msg00001.html&lt;br /&gt;
&lt;br /&gt;
* Pango documentation: http://developer.gnome.org/pangomm&lt;br /&gt;
&lt;br /&gt;
* Gst-1.0 documentation: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/index.html&lt;br /&gt;
&lt;br /&gt;
* Gst-1.0 porting hints: https://wiki.ubuntu.com/Novacut/GStreamer1.0&lt;br /&gt;
[[Category:Developer]]&lt;br /&gt;
&lt;br /&gt;
= More porting wiki pages =&lt;br /&gt;
&lt;br /&gt;
{{Special:PrefixIndex/Features/GTK3/Porting}}&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting&amp;diff=101660</id>
		<title>Features/GTK3/Porting</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Features/GTK3/Porting&amp;diff=101660"/>
		<updated>2018-04-04T14:43:23Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Porting an existing activity to GTK3=&lt;br /&gt;
This is a guide to porting an existing activity from GTK2 to [http://developer.gnome.org/gtk3/stable/ GTK3]. It also shows the changes to use the new Sugar toolkit that also now uses [[Features/GTK3|GTK3]]. This guide uses the [https://github.com/sugarlabs/hello-world hello-world] activity as a simple example.&lt;br /&gt;
&lt;br /&gt;
There is another guide that uses this one as reference. It was made while porting GetBooks Activity [[Features/GTK3/Porting/GetBooks]]&lt;br /&gt;
&lt;br /&gt;
If you would like to reference other examples of GTK3 port:&lt;br /&gt;
* [https://github.com/sugarlabs/biorhythm/commit/c16de3b70cce2cc6f8af933e2b062c844a47c144/ Biorhythm]&lt;br /&gt;
* [https://github.com/sugarlabs/peru-learns-english-activity/commit/caa2cde526b3823a5a1f7d200a76ad5bc3502b0e Peru Learns English, includes GStreamer and GST update]&lt;br /&gt;
&lt;br /&gt;
==Cleanup, adopt to API changes in sugar-toolkit-gtk3 ==&lt;br /&gt;
* the keep button has been removed completely&lt;br /&gt;
* the old-style toolbar has been removed&lt;br /&gt;
* set_toolbar_box is used instead of set_toolbox (see in [http://git.sugarlabs.org/~walter/abacus/walter-cairo/commit/6871dd340a89ade3b5361457e1bd1d58276a8efc Abacus])&lt;br /&gt;
* remove import of deprecated ActivityToolbox (see [http://git.sugarlabs.org/hello-world/mainline/commit/22060a3063b2d6fd38d6b1cd8d44946170255af3 hello-world])&lt;br /&gt;
* support for &#039;service_name&#039; and &#039;class&#039; has been removed from the activity.info make sure you are using: &#039;bundle_id&#039; instead of &#039;service_name&#039; and &#039;exec&#039; instead of &#039;class&#039; (see in [http://git.sugarlabs.org/record/mainline/commit/6e8968c71e474e2d8d86886badf5cf7d70217dc5 Record])&lt;br /&gt;
&lt;br /&gt;
==Port the activity from GTK2 to GTK3==&lt;br /&gt;
To start, change the importing instruction for GTK from&lt;br /&gt;
 import gtk&lt;br /&gt;
to&lt;br /&gt;
 import gi&lt;br /&gt;
 gi.require_version(&#039;Gtk&#039;, &#039;3.0&#039;)&lt;br /&gt;
 from gi.repository import Gtk&lt;br /&gt;
&lt;br /&gt;
Note that require_version needs to called only the first time when Gtk is being imported.&lt;br /&gt;
&lt;br /&gt;
Here are some more examples of imports that may be used:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from gi.repository import Gdk, Pango, Gobject&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then you have to change each call that involves Gtk, for example creating a button will look now like this:&lt;br /&gt;
 button = Gtk.Button()&lt;br /&gt;
&lt;br /&gt;
A simple hello world program in GTK3 looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from gi.repository import Gtk&lt;br /&gt;
&lt;br /&gt;
def _destroy_cb(widget, data=None):&lt;br /&gt;
    Gtk.main_quit()&lt;br /&gt;
&lt;br /&gt;
w = Gtk.Window()&lt;br /&gt;
w.connect(&amp;quot;destroy&amp;quot;, _destroy_cb)&lt;br /&gt;
label = Gtk.Label(&#039;Hello World!&#039;)&lt;br /&gt;
w.add(label)&lt;br /&gt;
w.show_all()&lt;br /&gt;
&lt;br /&gt;
Gtk.main()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For porting your activity you do have to change your calls for accessing widgets and services in the new GTK3 sugar-toolkit as well. The new namespace is called [https://developer.sugarlabs.org/sugar3/ sugar3], trying to reflect that GTK3 is the underlying technology. For example the import of the base activity class has to be changed from&lt;br /&gt;
 from sugar.activity import activity&lt;br /&gt;
to&lt;br /&gt;
 from sugar3.activity import activity&lt;br /&gt;
&lt;br /&gt;
Make sure you change the setup.py in your activity to point to the new toolkit as well:&lt;br /&gt;
  from sugar3.activity import bundlebuilder&lt;br /&gt;
&lt;br /&gt;
The changes that were needed to port the hello-world activity can be seen in [http://git.sugarlabs.org/hello-world/mainline/commit/508e1c518b56cbde5508e560c8a2ff38a3518583 this commit].&lt;br /&gt;
&lt;br /&gt;
Ok, let&#039;s do these changes now for your activity. Make sure you are in your master branch using the &#039;git branch&#039; command (the master branch should have a &#039;*&#039; before it). Make your changes, commit them (&#039;git commit -a&#039;) and push them to the remote repository (&#039;git push origin master&#039;).&lt;br /&gt;
&lt;br /&gt;
====Simple example on creating a toolbar====&lt;br /&gt;
One of Sugar&#039;s activity most unique user interface includes the toolbar. In order to reference the relevant modules and graphics, the sugar3 library has to be imported. These are the relevant ones that would enable us to create a simple toolbar containing the activity button and the stop button.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sugar3.activity import activity&lt;br /&gt;
from sugar3.graphics.toolbarbox import ToolbarBox&lt;br /&gt;
from sugar3.activity.widgets import ActivityToolbarButton&lt;br /&gt;
from sugar3.activity.widgets import StopButton&lt;br /&gt;
from sugar3.graphics.toolbarbox import ToolbarButton&lt;br /&gt;
from sugar3.graphics import style&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since the ActivityToolbar() module has been deprecated, the toolbar can now be called using&lt;br /&gt;
 ToolbarBox()&lt;br /&gt;
Then, from the ToolbarBox(), include the ActivityButton and StopButton. In order for the StopButton to be align to the right as per Sugar activity interface, a separator has to be included as well.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
toolbar_box = ToolbarBox()&lt;br /&gt;
&lt;br /&gt;
activity_button = ActivityToolbarButton(self)&lt;br /&gt;
toolbar_box.toolbar.insert(activity_button, 0)&lt;br /&gt;
activity_button.show()&lt;br /&gt;
&lt;br /&gt;
separator = Gtk.SeparatorToolItem()&lt;br /&gt;
separator.props.draw = False&lt;br /&gt;
separator.set_expand(True)&lt;br /&gt;
toolbar_box.toolbar.insert(separator, -1)&lt;br /&gt;
separator.show()&lt;br /&gt;
&lt;br /&gt;
stop_button = StopButton(self)&lt;br /&gt;
toolbar_box.toolbar.insert(stop_button, -1)&lt;br /&gt;
stop_button.show()&lt;br /&gt;
self.set_toolbar_box(toolbar_box)&lt;br /&gt;
toolbar_box.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tools===&lt;br /&gt;
There are tools to help you do the porting. There is a script in the pygobject repository for porting called [http://git.gnome.org/browse/pygobject/tree/pygi-convert.sh pygi-convert.sh], more info about the script can be found in [http://live.gnome.org/PyGObject/IntrospectionPorting the PyGObject Introspection Porting guide].&lt;br /&gt;
&lt;br /&gt;
Here is a script to automate the rename of the imports &#039;&#039;&#039;sugar&#039;&#039;&#039; to &#039;&#039;&#039;sugar3&#039;&#039;&#039;: [http://dev.laptop.org/~manuq/sugar-convert.sh sugar-convert.sh].&lt;br /&gt;
&lt;br /&gt;
If you are having trouble finding how a particular GTK class/method/constant has been named in PyGI, run [http://dev.laptop.org/~dsd/20110806/pygi-enumerate.py pygi-enumerate.py] and grep the output. (this app lists all identified methods and constants).  Usage example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ python pygi-enumerate.py | grep get_selection&lt;br /&gt;
Gtk.AccelLabel.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.Editable.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.Entry.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.IconView.get_selection_mode() (instance method)&lt;br /&gt;
Gtk.Label.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.SelectionData.get_selection() (instance method)&lt;br /&gt;
Gtk.SpinButton.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.TextBuffer.get_selection_bound() (instance method)&lt;br /&gt;
Gtk.TextBuffer.get_selection_bounds() (instance method)&lt;br /&gt;
Gtk.TreeView.get_selection() (instance method)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Constructor considerations ===&lt;br /&gt;
&lt;br /&gt;
With PyGI it is possible to use Python-like constructors, or &amp;quot;new&amp;quot; functions e.g. the following are (usually) equivalent:&lt;br /&gt;
 label = Gtk.Button()&lt;br /&gt;
 label = Gtk.Button.new()&lt;br /&gt;
&lt;br /&gt;
However, the first form is preferred: it is more Python-like. Internally, the difference is that Gtk.Label.new() translates to a call to gtk_label_new(), whereas Gtk.Label() (the preferred form) will directly construct an instance of GtkLabel at the GObject level.&lt;br /&gt;
&lt;br /&gt;
If the constructor takes parameters, they &#039;&#039;&#039;must&#039;&#039;&#039; be named. The parameters correspond to GObject properties in the API documentation which are usually marked as &amp;quot;Construct&amp;quot;. For example, the following code will not work:&lt;br /&gt;
&lt;br /&gt;
 expander = Gtk.Expander(&amp;quot;my expander&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
The (confusing) error is:&lt;br /&gt;
 TypeError: GObject.__init__() takes exactly 0 arguments (1 given)&lt;br /&gt;
&lt;br /&gt;
The solution is to go to the [http://developer.gnome.org/gtk3/3.2/GtkExpander.html#GtkExpander.properties GtkExpander API documentation] and find the appropriate property that we wish to set. In this case it is &amp;lt;b&amp;gt;label&amp;lt;/b&amp;gt; (which is a Construct property, further increasing our confidence of success), so the code should be:&lt;br /&gt;
&lt;br /&gt;
 expander = Gtk.Expander(label=&amp;quot;my expander&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Combining the two points above, if you wish to call a construct-like function such as gtk_button_new_with_label(), you do have the option of calling Gtk.Button.new_with_label(), however if we check the [http://developer.gnome.org/gtk3/3.2/GtkButton.html#GtkButton.properties GtkButton properties] we see one called &amp;quot;label&amp;quot; which is equivalent. Therefore gtk_button_new_with_label(&amp;quot;foo&amp;quot;) should be called as:&lt;br /&gt;
 button = Gtk.Button(label=&amp;quot;foo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== HBox, VBox, pack_start and pack_end ===&lt;br /&gt;
&lt;br /&gt;
GtkHBox and GtkVBox, commonly used containers in GTK2 code, have pack_start and pack_end methods. These take 4 parameters:&lt;br /&gt;
# The widget to pack into the container&lt;br /&gt;
# &#039;&#039;&#039;expand&#039;&#039;&#039;: Whether the child should receive extra space when the container grows (default True)&lt;br /&gt;
# &#039;&#039;&#039;fill&#039;&#039;&#039;: True if space given to child by the expand option is actually allocated to child, rather than just padding it. This parameter has no effect if expand is set to False. A child is always allocated the full height of a gtk.HBox and the full width of a gtk.VBox. This option affects the other dimension. (default True)&lt;br /&gt;
# &#039;&#039;&#039;padding&#039;&#039;&#039;: extra space in pixels to put between child and its neighbor (default 0)&lt;br /&gt;
&lt;br /&gt;
In PyGTK, the expand, fill and padding parameters were optional: if unspecified, the default values above were used. In PyGI, these parameters are &#039;&#039;&#039;not&#039;&#039;&#039; optional: all 4 must be specified. Hence the rules for adding in the extra parameters are:&lt;br /&gt;
&lt;br /&gt;
# If &#039;&#039;&#039;expand&#039;&#039;&#039; was not set, use value True&lt;br /&gt;
# If &#039;&#039;&#039;fill&#039;&#039;&#039; was not set, use value True. (however, if expand is False, this parameter gets ignored so False is an equally acceptable option when expand=False)&lt;br /&gt;
# If &#039;&#039;&#039;padding&#039;&#039;&#039; was not set, use value 0.&lt;br /&gt;
&lt;br /&gt;
These parameters can be specified either as positional arguments or as named keyword arguments, however all 4 must always be specified. Some developers prefer keyword arguments, arguing that the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;box.pack_start(widget, expand=True, fill=False, padding=4)&amp;lt;/pre&amp;gt;&lt;br /&gt;
is much more readable than:&lt;br /&gt;
&amp;lt;pre&amp;gt;box.pack_start(widget, True, False, 4)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, these functions are called extremely often; any mildly seasoned GTK developer will have memorized the order and meaning of the parameters. Some developers therefore prefer to avoid the extra work of dropping in hundreds of keyword arguments throughout the code and just use the positional ones. This is really up to you.&lt;br /&gt;
&lt;br /&gt;
If you are using pack_start with the default values (expand=True, fill=True and padding=0), you can avoid using pack_start (and the parameter pain that it brings with it) by just using .add for some added cleanliness, e.g.&lt;br /&gt;
&amp;lt;pre&amp;gt;box.pack_start(widget, True, True, 0)&amp;lt;/pre&amp;gt;&lt;br /&gt;
can be replaced with:&lt;br /&gt;
&amp;lt;pre&amp;gt;box.add(widget)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is as far as you need to go for now. However, in GTK3, GtkVBox and GtkHBox have been deprecated, which means they might be removed in GTK3. The replacement is to use GtkBox directly, and you may wish to make this change now. e.g.:&lt;br /&gt;
&amp;lt;pre&amp;gt;vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, homogeneous=True, spacing=8)&amp;lt;/pre&amp;gt;&lt;br /&gt;
However, it must be noted that if GtkBox is used directly (instead of using GtkHBox/GtkVBox), the default value of &#039;&#039;&#039;expand&#039;&#039;&#039; is now &#039;&#039;&#039;False&#039;&#039;&#039;. The implications of this are:&lt;br /&gt;
# You need to check your .add() calls, as previously they would behave as pack_start with expand=True, but now they will behave as expand=False (you need to change them to use pack_start with expand=True to retain the old behaviour)&lt;br /&gt;
# Every single pack_start call that has expand=False and padding=0 (and any value of fill) can be converted to .add() for cleanliness&lt;br /&gt;
&lt;br /&gt;
=== GtkAlignment considerations ===&lt;br /&gt;
&lt;br /&gt;
In PyGTK, the gtk.Alignment constructor takes four optional parameters:&lt;br /&gt;
# xalign: the fraction of horizontal free space to the left of the child widget. Ranges from 0.0 to 1.0. Default value 0.0.&lt;br /&gt;
# yalign: the fraction of vertical free space above the child widget. Ranges from 0.0 to 1.0. Default value 0.0.&lt;br /&gt;
# xscale: the fraction of horizontal free space that the child widget absorbs, from 0.0 to 1.0. Default value 0.0.&lt;br /&gt;
# yscale: the fraction of vertical free space that the child widget absorbs, from 0.0 to 1.0. Default value 0.0&lt;br /&gt;
&lt;br /&gt;
In PyGI/GTK3, these parameters are still optional when used in the Gtk.Alignment constructor (as keyword arguments, as explained above). However, the default values have changed. They are now:&lt;br /&gt;
# xalign: default value 0.5&lt;br /&gt;
# yalign: default value 0.5&lt;br /&gt;
# xscale: default value 1&lt;br /&gt;
# yscale: default value 1&lt;br /&gt;
&lt;br /&gt;
If your code was relying on the default value of 0 for any of these parameters in PyGTK, you will now need to explicitly specify that in your constructor. Similarly, if you were previously using construction parameters to select the now-default values, those parameters can be dropped.&lt;br /&gt;
&lt;br /&gt;
Additionally, PyGTK accepted these construction parameters as positional arguments. As explained above, they must now be converted to keyword arguments.&lt;br /&gt;
&lt;br /&gt;
=== Gtk Menu Popup ===&lt;br /&gt;
The Gtk.Menu.popup function now works slightly differently. &lt;br /&gt;
The user supplied positioning function now takes different parameters. These are menu, x, y, push_in and user_data. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gdk ===&lt;br /&gt;
Previously, gdk was an attribute of the gtk module, which means that it can be called through gtk. For example, if we want to use color_parse():&lt;br /&gt;
 gtk.gdk.color_parse(color)&lt;br /&gt;
However, what we have to do now is:&lt;br /&gt;
 from gi.repository import Gdk&lt;br /&gt;
Then we can modify the code to the following:&lt;br /&gt;
 Gdk.color_parse(color)&lt;br /&gt;
&lt;br /&gt;
=== Pango ===&lt;br /&gt;
Following the release of Gtk3, we should not be importing pango like this:&lt;br /&gt;
 import pango&lt;br /&gt;
In fact, we can now import pango as an attribute within the gtk3 library:&lt;br /&gt;
 from gi.repository import Pango as pango&lt;br /&gt;
=== Gio.Settings from GConf ===&lt;br /&gt;
Any use of GConf should be ported to Gio.Settings.&lt;br /&gt;
&lt;br /&gt;
=== Other considerations ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;self.allocation&#039;&#039; property is no longer available.  Please search your code for &amp;quot;self.allocation&amp;quot; and replace it for &amp;quot;self.get_allocation()&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So to get the allocation size:&lt;br /&gt;
&lt;br /&gt;
 self.allocation.width&lt;br /&gt;
 self.allocation.height&lt;br /&gt;
&lt;br /&gt;
should be replaced by:&lt;br /&gt;
&lt;br /&gt;
 self.get_allocated_width()&lt;br /&gt;
 self.get_allocated_height()&lt;br /&gt;
&lt;br /&gt;
=== Constants ===&lt;br /&gt;
&lt;br /&gt;
Most of the constants have slightly different formats, e.g.,&lt;br /&gt;
&lt;br /&gt;
gtk.STATE_NORMAL became Gtk.StateFlags.NORMAL&lt;br /&gt;
gtk.RESPONSE_ACCEPT became Gtk.ResponseType.ACCEPT&lt;br /&gt;
gtk.JUSTIFY_CENTER became Gtk.Justification.CENTER&lt;br /&gt;
gtk.RELIEF_NONE became Gtk.ReliefStyle.NONE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Pixbufs ===&lt;br /&gt;
&lt;br /&gt;
The pixbuf libraies are in their own repository&lt;br /&gt;
&lt;br /&gt;
 from gi.repository import GdkPixbuf&lt;br /&gt;
&lt;br /&gt;
 GdkPixbuf.Pixbuf.new_from_file()&lt;br /&gt;
&lt;br /&gt;
==Releasing activities (for maintainers)==&lt;br /&gt;
Once an activity is ported, a new release can be made. The major version should be greater than the existing one.&lt;br /&gt;
&lt;br /&gt;
Please follow [https://github.com/sugarlabs/sugar-docs/blob/master/src/contributing.md#checklist---maintainer this] guide for releasing a new version &lt;br /&gt;
&lt;br /&gt;
==Port to Python 3==&lt;br /&gt;
We are migrating towards Python 3. Python 3 does not support GTK+ 2. Hence, once the activity is ported to GTK+ 3, please also continue porting the activity from Python 2 to Python 3.&lt;br /&gt;
&lt;br /&gt;
Ref: [https://github.com/sugarlabs/sugar-docs/blob/master/src/python-porting-guide.md Guide to port activities to Python 3] &lt;br /&gt;
&lt;br /&gt;
== Tips to Activity Developers ==&lt;br /&gt;
&lt;br /&gt;
===Changes to the Clipboard===&lt;br /&gt;
Two things to note:&lt;br /&gt;
&lt;br /&gt;
1. You need to specify a clipboard using get()&lt;br /&gt;
    clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)&lt;br /&gt;
2. You need to pass a length to set_text()&lt;br /&gt;
    clipboard.set_text(string, len(string))&lt;br /&gt;
&lt;br /&gt;
See [http://python-gtk-3-tutorial.readthedocs.org/en/latest/clipboard.html] for more details.&lt;br /&gt;
&lt;br /&gt;
===Changes to Drag-and-Drop===&lt;br /&gt;
Slightly different syntax:&lt;br /&gt;
        self.drag_dest_set(Gtk.DestDefaults.ALL, [],&lt;br /&gt;
                           Gdk.DragAction.COPY)&lt;br /&gt;
        self.drag_dest_set_target_list(Gtk.TargetList.new([]))&lt;br /&gt;
        self.drag_dest_add_text_targets()&lt;br /&gt;
        self.connect(&#039;drag_data_received&#039;, self._drag_data_received)&lt;br /&gt;
&lt;br /&gt;
and:&lt;br /&gt;
        data.get_text()&lt;br /&gt;
or:&lt;br /&gt;
        data.get_image()&lt;br /&gt;
&lt;br /&gt;
See [http://python-gtk-3-tutorial.readthedocs.org/en/latest/drag_and_drop.html] for more details.&lt;br /&gt;
&lt;br /&gt;
===Going from Drawable to Cairo===&lt;br /&gt;
&lt;br /&gt;
GTK-3 does not support gtk Drawable objects, so the first step is to get your activity running under Cairo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import cairo&lt;br /&gt;
&lt;br /&gt;
# From activity.Activity, you inherit a canvas.&lt;br /&gt;
# Create a Cairo context from the window.&lt;br /&gt;
cairo_context = self.canvas.get_window().cairo_create()&lt;br /&gt;
&lt;br /&gt;
# Create an XLib surface to be used for drawing&lt;br /&gt;
xlib_surface = surface.create_similar(cairo.CONTENT_COLOR,&lt;br /&gt;
                                      gtk.gdk.screen_width(),&lt;br /&gt;
                                      gtk.gdk.screen_height())&lt;br /&gt;
&lt;br /&gt;
# You&#039;ll need a Cairo context from which you&#039;ll build a GTK Cairo context&lt;br /&gt;
cairo_context = cairo.Context(xlib_surface)&lt;br /&gt;
cairo_context = gtk.gdk.CairoContext(cairo_context)&lt;br /&gt;
&lt;br /&gt;
# Use this context as you would a Drawable, substituting Cairo commands&lt;br /&gt;
# for gtk commands, e.g.,&lt;br /&gt;
cairo_context.move_to(0, 0)&lt;br /&gt;
cairo_context.line_to(100, 100)&lt;br /&gt;
# Cairo uses floats from 0 to 1 for RGB values&lt;br /&gt;
cairo_context.set_source_rgb(r, g, b)&lt;br /&gt;
cairo_context.rectangle(x, y, w, h)&lt;br /&gt;
cairo_context.fill()&lt;br /&gt;
&lt;br /&gt;
# To invalidate a region to force a refresh, use:&lt;br /&gt;
self.canvas.queue_draw_area(x, y, w, h)&lt;br /&gt;
&lt;br /&gt;
# Handle the expose event&lt;br /&gt;
# &amp;quot;expose&amp;quot; became &amp;quot;draw&amp;quot; for the cairo signal &lt;br /&gt;
def do_expose_event(self, event):&lt;br /&gt;
    # Create the cairo context&lt;br /&gt;
    cairo_context = self.canvas.get_window().cairo_create()&lt;br /&gt;
    cairo_context.rectangle(event.area.x, event.area.y,&lt;br /&gt;
                            event.area.width, event.area.height)&lt;br /&gt;
    cairo_context.clip()&lt;br /&gt;
    cairo_context.set_source_surface(xlib_surface)&lt;br /&gt;
    cairo_context.paint()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pango is a bit different when used with Cairo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import pango, pangocairo&lt;br /&gt;
&lt;br /&gt;
# Again, from the xlib_surface...&lt;br /&gt;
cairo_context = cairo.Context(xlib_surface)&lt;br /&gt;
&lt;br /&gt;
# Create a PangoCairo context&lt;br /&gt;
cairo_context = pangocairo.CairoContext(cairo_context)&lt;br /&gt;
&lt;br /&gt;
# The pango layout is created from the Cairo context&lt;br /&gt;
pango_layout = cairo_context.create_layout()&lt;br /&gt;
&lt;br /&gt;
# You still use pango to set up font descriptions.&lt;br /&gt;
fd = pango.FontDescription(&#039;Sans&#039;)&lt;br /&gt;
fd.set_size(12 * pango.SCALE)&lt;br /&gt;
&lt;br /&gt;
# Tell your pango layout about your font description&lt;br /&gt;
pango_layout.set_font_description(fd)&lt;br /&gt;
&lt;br /&gt;
# Write text to your pango layout&lt;br /&gt;
pango_layout.set_text(&#039;Hello world&#039;, -1)&lt;br /&gt;
&lt;br /&gt;
# Position it within the Cairo context&lt;br /&gt;
cairo_context.save()&lt;br /&gt;
cairo_context.translate(x, y)&lt;br /&gt;
cairo_context.rotate(pi / 3)  # You can rotate text and images in Cairo&lt;br /&gt;
cairo_context.set_source_rgb(1, 0, 0)&lt;br /&gt;
&lt;br /&gt;
# Finally, draw the text&lt;br /&gt;
cairo_context.update_layout(pango_layout)&lt;br /&gt;
cairo_context.show_layout(pango_layout)&lt;br /&gt;
cairo_context.restore()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To draw a bitmap...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Again, from the xlib_surface...&lt;br /&gt;
cairo_context = cairo.Context(xlib_surface)&lt;br /&gt;
&lt;br /&gt;
# Create a gtk context&lt;br /&gt;
cairo_context = gtk.gdk.CairoContext(cairo_context)&lt;br /&gt;
cairo_context.set_source_pixbuf(pixbuf, x, y)&lt;br /&gt;
cairo_context.rectangle(x, y, w, h)&lt;br /&gt;
cairo_context.fill()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To read a pixel from the xlib surface...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# create a new 1x1 cairo surface&lt;br /&gt;
cairo_surface = cairo.ImageSurface(cairo.FORMAT_RGB24, 1, 1);&lt;br /&gt;
cairo_context = cairo.Context(cairo_surface)&lt;br /&gt;
# translate xlib_surface so that target pixel is at 0, 0&lt;br /&gt;
cairo_context.set_source_surface(xlib_surface, -x, -y)&lt;br /&gt;
cairo_context.rectangle(0,0,1,1)&lt;br /&gt;
cairo_context.set_operator(cairo.OPERATOR_SOURCE)&lt;br /&gt;
cairo_context.fill()&lt;br /&gt;
cairo_surface.flush() # ensure all writing is done&lt;br /&gt;
# Read the pixel&lt;br /&gt;
return (ord(pixels[2]), ord(pixels[1]), ord(pixels[0]), 0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Going from Cairo in GTK-2 to Cairo in GTK-3===&lt;br /&gt;
&lt;br /&gt;
(See http://developer.gnome.org/pangomm/2.28/annotated.html for more details)&lt;br /&gt;
Not much changes, but...&lt;br /&gt;
&lt;br /&gt;
The Cairo/Pango interaction is a little different:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from gi.repository import Pango, PangoCairo&lt;br /&gt;
&lt;br /&gt;
cairo_context = ...&lt;br /&gt;
pango_layout = PangoCairo.create_layout(cairo_context)&lt;br /&gt;
fd = Pango.FontDescription(&#039;Sans&#039;)&lt;br /&gt;
fd.set_size(12 * Pango.SCALE)&lt;br /&gt;
pango_layout.set_font_description(fd)&lt;br /&gt;
pango_layout.set_text(&#039;Hello World&#039;, -1)&lt;br /&gt;
cairo_context.set_source_rgb(1, 0, 0)&lt;br /&gt;
PangoCairo.update_layout(cairo_context, pango_layout)&lt;br /&gt;
PangoCairo.show_layout(cairo_context, pango_layout)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The get_extents() method if different in PangoCairo. It calculates an extent as a Rectangle, but doesn&#039;t return anything. There is a method, get_logical_extents() that returns a Rectangle. Alas, it is not necessarily available after v1.16. Note that Rectangle is not a list but a class with methods for get_x(), get_y(), get_width(), and get_height(), so you cannot iter over it.&lt;br /&gt;
&lt;br /&gt;
Note that the &amp;lt;samp&amp;gt;cairo.Region&amp;lt;/samp&amp;gt; will no longer work in Gtk+3 &lt;br /&gt;
&lt;br /&gt;
==== Replacing pixmaps with Cairo ====&lt;br /&gt;
You need to replace your pixmaps with Cairo in GTK3. See http://developer.gnome.org/gtk3/3.5/ch24s02.html#idp129615008 for example code.&lt;br /&gt;
&lt;br /&gt;
===Taking a screenshot and making a thumbnail===&lt;br /&gt;
To make a screenshot of the window:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
width, height = window.get_width(), window.get_height()&lt;br /&gt;
thumb_surface = Gdk.Window.create_similar_surface(window,&lt;br /&gt;
                                                  cairo.CONTENT_COLOR,&lt;br /&gt;
                                                  width, height)&lt;br /&gt;
&lt;br /&gt;
thumb_width, thumb_height = style.zoom(100), style.zoom(80)&lt;br /&gt;
cairo_context = cairo.Context(thumb_surface)&lt;br /&gt;
thumb_scale_w = thumb_width * 1.0 / width&lt;br /&gt;
thumb_scale_h = thumb_height * 1.0 / height&lt;br /&gt;
cairo_context.scale(thumb_scale_w, thumb_scale_h)&lt;br /&gt;
Gdk.cairo_set_source_window(cairo_context, window, 0, 0)&lt;br /&gt;
cairo_context.paint()&lt;br /&gt;
thumb_surface.write_to_png(png_path_or_filelike_object)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Creating a video widget===&lt;br /&gt;
&lt;br /&gt;
Haven&#039;t gotten this working yet, but some necessary changes include:&lt;br /&gt;
&lt;br /&gt;
Instead of&lt;br /&gt;
 window.xid&lt;br /&gt;
use&lt;br /&gt;
 get_property(&#039;window&#039;).get_xid()&lt;br /&gt;
&lt;br /&gt;
Instead of&lt;br /&gt;
 unset_flags(gtk.DOUBLE_BUFFERED)&lt;br /&gt;
 set_flags(gtk.APP_PAINTABLE)&lt;br /&gt;
use&lt;br /&gt;
 set_double_buffered(False)&lt;br /&gt;
 set_app_paintable(True)&lt;br /&gt;
&lt;br /&gt;
A more basic question is whether or not we migrate to gstreamer-1.0. If we do, some helpful documentation is found here [https://wiki.ubuntu.com/Novacut/GStreamer1.0].&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
PyGI Documentation: https://lazka.github.io/pgi-docs/&lt;br /&gt;
&lt;br /&gt;
gtk2: http://www.pygtk.org/docs/pygtk/&lt;br /&gt;
* Reference Manual&lt;br /&gt;
:: Gtk3: http://developer.gnome.org/gtk3/3.4/&lt;br /&gt;
* Gdk documentation:&lt;br /&gt;
:: Gdk3: http://developer.gnome.org/gdk/2.24/&lt;br /&gt;
* Pango documentation:&lt;br /&gt;
:: GTK3: http://developer.gnome.org/pangomm&lt;br /&gt;
* Gst-1.0 documentation&lt;br /&gt;
:: Gst-1: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/index.html&lt;br /&gt;
* Gst-1.0 porting hints&lt;br /&gt;
:: https://wiki.ubuntu.com/Novacut/GStreamer1.0 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer]]&lt;br /&gt;
&lt;br /&gt;
= More porting wiki pages =&lt;br /&gt;
&lt;br /&gt;
{{Special:PrefixIndex/Features/GTK3/Porting}}&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=User:Pro-panda&amp;diff=101566</id>
		<title>User:Pro-panda</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=User:Pro-panda&amp;diff=101566"/>
		<updated>2018-03-21T06:19:41Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: /* Bio */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Rahul Bothra ==&lt;br /&gt;
&lt;br /&gt;
=== Bio ===&lt;br /&gt;
I am Rahul Bothra, Computer Science sophomore at BITS Pilani, Pilani. I am from India and usually code from 03:30(UTC) to 18:00(UTC). In my free time, I like playing Piano, and learning new algorithms. I am a core member of BITS-ACM (Campus Chapter) at our college, where we conduct lectures and  events like Hackathon and workshopos to promote almost all areas of computing.&lt;br /&gt;
&lt;br /&gt;
==== Skills ====&lt;br /&gt;
*Python, C, Shell, SQL (Postgres and MySQL) and NoSQL (MongoDB)&lt;br /&gt;
*Learnt in coursework: Assembly, Java&lt;br /&gt;
&lt;br /&gt;
==== Areas of Interest ====&lt;br /&gt;
Logic Programming and Data Strucutures and Algorithms&lt;br /&gt;
&lt;br /&gt;
==== Future areas for exploration (~6 months) ====&lt;br /&gt;
Image Processing and Natural Language Processing&lt;br /&gt;
&lt;br /&gt;
==== Me and Sugar Labs ====&lt;br /&gt;
My first contribution to Sugar Labs was working on [https://github.com/sugarlabs/sugar/issues/780 this] issue. Since then I have been contributing regularly by fixing bugs, suggesting ideas and creating and maintaining activities.&lt;br /&gt;
; Motivation&lt;br /&gt;
: Back in December&#039; 17, when I started to prepare for GSoC 2018, I decided to work for Sugar Labs. My motivation was its idea and the impact it had on the society&lt;br /&gt;
&lt;br /&gt;
; Experience&lt;br /&gt;
: My work with Sugar Labs was my first introduction to an Open Source Organisation. I got to learn the workings of a big Open Source project, which is more than just writing code. I was constantly guided by the community, pointing where I went wrong and how to improve myself. Working for Sugar Labs has now become a part of my daily routine and I enjoy doing the same.&lt;br /&gt;
&lt;br /&gt;
==== Contact/Feedback ====&lt;br /&gt;
Email: f2016015@pilani.bits-pilani.ac.in&lt;br /&gt;
&lt;br /&gt;
Github: https://github.com/Pro-Panda&lt;br /&gt;
&lt;br /&gt;
I would love to hear suggestions to improve myself, or discuss any ideas.&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=User:Pro-panda&amp;diff=101565</id>
		<title>User:Pro-panda</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=User:Pro-panda&amp;diff=101565"/>
		<updated>2018-03-21T06:11:38Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: /* Bio */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Rahul Bothra ==&lt;br /&gt;
&lt;br /&gt;
=== Bio ===&lt;br /&gt;
I am Rahul Bothra, Computer Science sophomore at BITS Pilani, Pilani. I am from India and usually code from 03:30(UTC) to 18:00(UTC). In my free time, I like playing Piano, and learning new algorithms. I am a core member of BITS-ACM (Campus Chapter) at our college, where we conduct lectures and  events like Hackathon and workshopos to promote almost all areas of computing.&lt;br /&gt;
&lt;br /&gt;
==== Skills ====&lt;br /&gt;
*Python, C, Shell, SQL (Postgres and MySQL) and NoSQL (MongoDB)&lt;br /&gt;
*Learnt in coursework: Assembly, Java&lt;br /&gt;
&lt;br /&gt;
==== Areas of Interest ====&lt;br /&gt;
Logic Programming and Data Strucutures and Algorithms&lt;br /&gt;
&lt;br /&gt;
==== Future areas for exploration (~6 months) ====&lt;br /&gt;
Image Processing and Natural Language Processing&lt;br /&gt;
&lt;br /&gt;
==== Me and Sugar Labs ====&lt;br /&gt;
My first contribution to Sugar Labs was working on [https://github.com/sugarlabs/sugar/issues/780 this] issue. Since then I have been contributing regularly by fixing bugs, suggesting ideas and creating and maintaining activities.&lt;br /&gt;
; Motivation&lt;br /&gt;
: Back in December&#039; 17, when I started to prepare for GSoC 2018, I decided to work for Sugar Labs. My motivation was its idea and the impact it had on the society&lt;br /&gt;
&lt;br /&gt;
; Experience&lt;br /&gt;
: My work with Sugar Labs was my first introduction to an Open Source Organisation. I got to learn the workings of a big Open Source project, which is more than just writing code. I was constantly guided by the community, pointing where I went wrong and how to improve myself. Working for Sugar Labs has now become a part of my daily routine and I enjoy doing the same.&lt;br /&gt;
&lt;br /&gt;
==== Contact/Feedback ====&lt;br /&gt;
Email: f2016015@pilani.bits-pilani.ac.in&lt;br /&gt;
&lt;br /&gt;
Github: https://github.com/Pro-Panda&lt;br /&gt;
&lt;br /&gt;
I would love to hear my mistakes/suggestions to improve myself, or discuss any ideas&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=User:Pro-panda&amp;diff=101564</id>
		<title>User:Pro-panda</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=User:Pro-panda&amp;diff=101564"/>
		<updated>2018-03-21T06:09:10Z</updated>

		<summary type="html">&lt;p&gt;Pro-panda: User Profile: Rahul Bothra | Pro-Panda&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Rahul Bothra ==&lt;br /&gt;
&lt;br /&gt;
=== Bio ===&lt;br /&gt;
I am Rahul Bothra, Computer Science sophomore at BITS Pilani, Pilani. I am from India and usually code from 03:30(UTC) to 18:00(UTC). In my free timme, I like playing Piano, and learning new algorithms. I am a core member of BITS-ACM (Campus Chapter) at our college, where we conduct lectures and  events like Hackathon and workshopos to promote almost all areas of computing.&lt;br /&gt;
&lt;br /&gt;
==== Skills ====&lt;br /&gt;
*Python, C, Shell, SQL (Postgres and MySQL) and NoSQL (MongoDB)&lt;br /&gt;
*Learnt in coursework: Assembly, Java&lt;br /&gt;
&lt;br /&gt;
==== Areas of Interest ====&lt;br /&gt;
Logic Programming and Data Strucutures and Algorithms&lt;br /&gt;
&lt;br /&gt;
==== Future areas for exploration (~6 months) ====&lt;br /&gt;
Image Processing and Natural Language Processing&lt;br /&gt;
&lt;br /&gt;
==== Me and Sugar Labs ====&lt;br /&gt;
My first contribution to Sugar Labs was working on [https://github.com/sugarlabs/sugar/issues/780 this] issue. Since then I have been contributing regularly by fixing bugs, suggesting ideas and creating and maintaining activities.&lt;br /&gt;
; Motivation&lt;br /&gt;
: Back in December&#039; 17, when I started to prepare for GSoC 2018, I decided to work for Sugar Labs. My motivation was its idea and the impact it had on the society&lt;br /&gt;
&lt;br /&gt;
; Experience&lt;br /&gt;
: My work with Sugar Labs was my first introduction to an Open Source Organisation. I got to learn the workings of a big Open Source project, which is more than just writing code. I was constantly guided by the community, pointing where I went wrong and how to improve myself. Working for Sugar Labs has become a part of my daily routine and I enjoy doing the same.&lt;br /&gt;
&lt;br /&gt;
==== Contact/Feedback ====&lt;br /&gt;
Email: f2016015@pilani.bits-pilani.ac.in&lt;br /&gt;
&lt;br /&gt;
Github: https://github.com/Pro-Panda&lt;br /&gt;
&lt;br /&gt;
I would love to know my mistakes or any suggestions to improve myself, or discuss any ideas&lt;/div&gt;</summary>
		<author><name>Pro-panda</name></author>
	</entry>
</feed>