Canonical Voices

Posts tagged with 'introspection'


Ubuntu App Developer Week – Day 2 Summary

Wow, what a great follow-up to the first day! The second Ubuntu App Developer Week brought lots of awesome: great speakers and sessions, great participation, improvisation, Python, GTK, KDE, Qt, PyGI, Zeitgeist, Gstreamer, Introspection, Thunderbird, Unity, API Integration, hacking, fun… all the buzzwords you can associate when developing in your favourite Free Software Platform.

PyGTK is dead, long live PyGI! Using gobject-introspection in Python

By Martin Pitt

Martin’s complementary session to the GObject Introspection (GI) one on Monday was very popular. He started off with a recap of what GI is and the importance of the availability of several programming language bindings in any modern development platform. He provided an overview on how GI works in practice, and then delved into how it actually works in Python through the use of Pygobject and the gi.repository module, with lots of coding examples and comparison with traditiona GTK+ C code. After that he described other API differences, in particular the caveats with contructoirs, passing arrays, output arguments, GDestroyNotify and what to do with non-introspectable functions or methods. The next topic where overrides: how to provide custom code to override the introspected library’s objects. The second part of the session focused on explaining in detail how to migrate old PyGtk code to GTK3 and PyGI, in a series of easy guidelines: renaming, checking and repeating, and packaging changes. He wrapped up with a series of pointers on how to learn more and a Q+A session with lots of interesting questions from the audience.

Check out the session log here.

Zeitgeist API & Zeitgeist Application Integration

By Manish Sinha (???? ??????) and Seif Lotfy

For this session we had the luxury of having two key members of the Zeitgeist project to explain us all the details on how to integrate it to your own projects.  Manish, one of the Zeitgest developers, kicked off with an introduction on what Zeitgeist is: an automatic event logger which logs the events that happen on your computer. He then went on through the details of the Zeitgest terminology (events, manifestations, actors, timestamps…), architecture, and its interaction with D-Bus, with an overview of the API interface and the existing bindings: Python, C/Vala and C#. The session went on with examples of how real world applications and data providers use Zeitgeist, such as EOG plugins or Tomboy. Seif then chipped in with an example of  how Zeitgeist support was integrated into a GEdit plugin. Throughout the session lots of interesting questions were raised by the audience.

Check out the session log here.

GStreamer+Python: Multimedia Swiss Army Machete

By Jason DeRose

A very intersesting session indeed. In it, Jason explained all the points why GStreamer is the multimedia framework due to its economy of scale and why Python is the perfect complement with its simplicity and language clarity. According to him, together they provide the ultimative multimedia development tool, and this was why he chose to use them in hos own project: Novacut, the distributed video editor. From this point on, it was “Learning by doing”, and he then walked thorugh the code examples he’d set up for the session, showcasing how simple it is to work with multimedia streams with his swiss army machete :)

Check out the session log here.

KDE Development Intro: Q+A

By Harald Sitter and Jonathan Riddell

I’d especially like to mention this session due to a change of schedule. The original speaker, KDE/Kubuntu ninja Joathan Thomas could not make if due to last-minute commitments. But no worries, KDE/Kubuntu friends are always there to lend a hand, and in no time Harald and Jonathan stepped up to fill the gap and do an impromptu KDE Development Intro and Q+A session. In there they gave an overview on the essentials every prospective KDE developer should know and answered in detail the questions in the audience. All in all a great insight on how to get started developing KDE apps.

Check out the session log here.

Thunderbird + Unity = Awesome, and how JSCtypes lets you get to the candy

By Mike Conley

Mike has been working over the last 3 months at Mozilla on ways in which Thunderbird can integrate nicely into Ubuntu, in particular with Unity. He started explaining the main points he’s been focusing on: the messaging menu, the Unity launcher adn Ubuntu One, and for the rest of the session he covered the first two. Going straight to the subject, the next topic was to explain what a Thunderbird extension is, and how they are written using a mixture of Javascript, the XUL mark-up language and CSS, all executed by the Gecko engine. He then introduced JS-CTypes, which allow developers to access C libraries directly from Chrome-level Javascript code. and how he used them to write a Unity launcher add-on. the resto of the session focused on this subject, with plenty of code examples.

Check out the session log here.

STORY: Unity, hacking on a real-world app

By Marco Trevisan

The last session of the day was one of my favourite ones: an inspiring personal story. Marco is a community contributor to Unity who told us about his journey since he found an application itch to scratch and until his own feature was landed. He started with a very easy to understand overview of the Unity architecture and how all the pieces fit together, following with the story on how he found something that needed improvement and how he went about fixing it: indicator-sound not being precise when setting the volume with the mouse wheel. Do read it, as it is going to be a great help to all of you who are looking on how to get started contributing to Ubuntu development.

Check out the session log here.

The Day Ahead: Upcoming Sessions for Day 3

A quick look at today’s session lineup for your development pleasure:

16:00 UTC
Qt Quick: QML the Language – Jürgen Bocklage-Ryannel
Here’s a special treat for anyone interested in Qt development: Jürgen Bocklage-Ryannel, from Nokia, the maker of Qt, will be introducing Qt Quick and QML as the language used in Qt Quick. He’ll be showing some elements of the UI and the general process, and tell you the right places to go to to get more information.

17:00 UTC
Make your applications work in the cloud with Ubuntu OneStuart Langridge
Who else than the Ubuntu One mastermind himself could tell you better about supercharging your apps with cloud functionality? Join Stuart in this talk where he’ll be describing how to integrate Ubuntu One into your applications and bring your users to cloud 9 ;)

18:00 UTC
Take control of your desktop easily with DBusAlejandro J. Cura
D-Bus, the cross-desktop message bus system, is becoming more and more ubiquitous in any Free Software distribution. You can bring your applications to a whole new level letting them talk to other ones in a desktop session, and Alejandro can tell you exactly how to do that.

19:00 UTC
Touchégg: Bringing Multitouch Gestures to your DesktopJosé Expósito
It’s always great to see real-world examples of how the newest and coolest technologies are being used. José will be showcasing his multitouch-based application, Touchégg, introducing its features, describing how to add new multitouch gestures, the technologies used to develop it, and how it uses the uTouch-GEIS API. Check out the summary and the logs from the other Multitouch session on Monday to learn more.

20:00 UTC
Unity: Integrating with Launcher and PlacesMikkel Kamstrup Erlandsen
Do you want your application to seamlessly blend into the new Ubuntu user interface experience? Do you want it to provide all interaction capabilities that Unity provides? Then join Unity developer Mikkel Kamstrup in his walkthrough with examples on how to plug your app into the Launcher and Places API.

21:00 UTC
Tracking Source Code History with BazaarJelmer Vernooij
Learn how to control the history of your source code with a distributed and modern revision control system. Bazaar is powerful, fast, and most importantly, easy and fun to use. Jelmer has had a lot to do in developing Bazaar, so he knows well what he’s talking about. Join him in this session where he’ll tell you the basics and more sophisticated uses of the revision control system used to develop Ubuntu and thousands of other projects in Launchpad.

Looking forward to seeing you all there in a few hours!

Read more

A while back I posted an example of how to create a rounded rectangle actor with clutter using the Python bindings. Last night I started to write a small UI in which I’m using Clutter and wanted to get the same effect but this time I used gobject introspection. The differences are not huge but nevertheless here you have the example code of the same exercise using gi.

from gi.repository import Cogl, Clutter, GtkClutter
class RoundedRectangle(GtkClutter.Actor):
    """Base actor for a rounded retangle."""
    def __init__(self, width, height, arc, step, 
                 color=None, border_color=None, border_width=0):
        """Create a new instance."""
        super(RoundedRectangle, self).__init__()
        self._width = width
        self._height = height
        self._arc = arc
        self._step = step
        if color:
            self._color = color
            self._color = Cogl.Color()
            self._color.init_from_4f(0, 0, 0, 1)
        if border_color:
            self._border_color = border_color
            self._border_color = Cogl.Color()
            self._border_color.init_from_4f(0, 0, 0, 1)
        self._border_width = border_width
    def do_paint(self):
        # Draw a rectangle for the clipping
        Cogl.path_round_rectangle(0, 0, self._width, self._height, self._arc, self._step)
        # Start the clip
        # set color to border color
        # draw the rectangle for the border which is the same size and the
        # object
        Cogl.path_round_rectangle(0, 0, self._width, self._height, self._arc, self._step)
        # color the path usign the border color
        # draw the content with is the same size minus the wirth of the border
        # finish the clip
        Cogl.path_round_rectangle(self._border_width, self._border_width, 
        self._width - self._border_width, 
        self._height - self._border_width, self._arc, self._step)
    def do_pick(self, color):
        if not self.should_pick_paint():
        # do pick gets a Clutter color but no a Cogl one, we need to convert it
        color = Cogl.Color()
        color.init_from_4f( , , , color.alpha)
        Cogl.path_round_rectangle(0, 0, self._width, self._height, self._arc, self._step)
        # Start the clip
        # set color to border color
        # draw the rectangle for the border which is the same size and the
        # object
        Cogl.path_round_rectangle(0, 0, self._width, self._height, self._arc, self._step)

I’ve got to say, that although introspection does bring a great opportunity for Python developers to get to the gobject libraries easiyly, it does make the Python code look very un-pynthonic…

Read more

GNOME 3.0 and Ubuntu Natty are currently undergoing a major architectural shift from GTK 2.0 to 3.0. Part of this is that the previous set of manually maintained language bindings, such as PyGTK, are being deprecated in favor of GObject Introspection, a really cool technology!

For us this means that we have to port all our PyGTK applications from PyGTK 2 to gobject-introspection and GTK 3.0 at the same time. I started with that for my own projects (Apport and Jockey) a few days ago, and along the way encountered a number of problems. They are being fixed (particular thanks to the quick responsiveness of John Palmieri!), so I guess after a few of those iterations, porting should actually become straight forward and solid.

So now I’m proud to announce Apport 1.16 which is now fully working with GTK 3.0 and pygobject-introspection. I just uploaded it to Ubuntu Natty, where it can get some wider testing. I also have a pygi/GTK3.0 branch for Jockey, which is also mostly working now, but it’s blocked on the availability of a GIR for AppIndicator. Once that lands, I’ll release and upload the Jockey as well.

For other people working on porting, these are the bugs and problems I’ve encountered:

  • [pygobject] GtkMessageDialog constructors did not work at all. This was fixed in pygobject 2.27, so it works fine in Natty, but there is little to no chance of making these work in Ubuntu 10.10.
  • [pygobject] Gtk.init_check() crashes (upstream bug). It’s not strictly necessary, though, just avoids crashes (and crash reports) when calling it without a $DISPLAY. I’ll put that back once that gets fixed.
  • [pygobject] You can’t pass unicode objects as method arguments or property values (upstream bug). Method arguments were recently fixed in upstream git head, and I backported it to the Natty package, so these work now. Property values are still outstanding. The workaround for both is to convert unicode values to bytes with .encode('UTF-8') everywhere.
  • [pygobject] is a great help which automates most of the mechanical rewriting work and thus gets you 90% of the porting done automatically. It’s currently missing MessageDialog constants, and is a bit inconvenient to call. I sent two patches upstream (upstream bug) which improve this.
  • [GIR availability] libnotify did not build a GIR yet (upstream bug). This was fixed in upstream git head with some contributions of mine, and I uploaded it to Natty. This works quite well now, although add_action() crashes on passing the callback. This is still to be investigated.
  • [GIR availability] There is no Application Indicator GIR, as already mentioned. Our DX team and Ken VanDine are working on this, so this should get fixed soon.
  • [GTK] Many dialogs now scale in a very ugly manner: Instead of resizing the contents, the dialog just grows huge outer padding. This is due to a change of the default “fill” property, and apparently is not fully understood yet (upstream bug). As a workaround I explicitly added the fill property to the top-level GTKBox in my GTKBuilder .ui files. (Note that this happens in C as well, it’s not a GI specific bug.)
  • [GTK] Building GtkRadioButton groups is currently a bit inconvenient and requires special-casing for the first group member, due to some missing annotations. I sent a patch upstream which fixes that (upstream bug).
  • [GTK] After initial porting, a lot of my dialogs got way too narrow with wrapped labels and text, because GTK 3 changed the behaviour and handling of widget and window sizes. This is intended, not a bug, but it does require some adaptions in the GtkBuilder files and also in the code. The GTK 2 ? 3 migration guide has a section about it.

Despite those, I’m impressed how well gobject-introspection already works. It was relatively painless for me to generate a GIR from a libnotify (thanks to the annotations already being mostly correct for building the documentation) and use it from Python. In another couple of months this will be rock solid, and porting our bigger pygtk projects like ubiquity and software-center will hopefully become feasible.

Read more