You are viewing [info]mbarnes's journal

Previous 10

Oct. 9th, 2011

Coming Soon in Evolution 3.4

I’m overdue for an update on what the Evolution team has been up to lately.  This development cycle should be interesting, as we have several projects converging for the next major release in March: Evolution 3.4. It’s still pretty early in the 3.3 cycle, so everything is still tentative at this point. But here’s some of the major features we have cooking, in addition to our steady stream of bug fixes and incremental enhancements.


New D-Bus Service for Email

Srinivasa Ragavan is working toward breaking email handling out of Evolution and moving it out to a separate D-Bus service as we do currently for address books and calendars. That will allow for things like new mail notifications without having to have Evolution running, and also provide a more formal way for other Evolution-Data-Server clients to access mail stores.


Evolution, Meet WebKit

Dan Vratil has taken on the task of porting Evolution’s email rendering from our old and outdated HTML engine (“GtkHtml”) to the more modern WebKit/GTK+. Dan tells me he’s taking advantage of WebKit’s full support for JavaScript and CSS (which GtkHtml lacks) to make rendering more efficient and to unify the email, contact, task, and memo previews with a shared style.

We’re treating email rendering and email composing as separate projects. Right now it’s looking like we’ll continue using GtkHtml for email composing in Evolution 3.4, but fear not -- we’ll get to it. We’re as eager to drop GtkHtml as anyone.



Automated Account Setup

Punit Jain is merging the automated mail account setup feature from “express” mode into the regular Evolution Account Assistant. This is the feature where you give Evolution your email address and it checks the address’s domain against a database of known service providers and can often populate all the server details for you, making account setup quick and easy.


Goodbye GConf

Rodrigo Moya has been porting all of Evolution’s simple GConf keys to dconf and fixing up our code to access the new keys via GLib’s own GSettings API. So one less package dependency for Evolution 3.4. As for the not-so-simple GConf keys, see below.


New Backend for Microsoft Exchange

David Woodhouse and his team at Intel, along with Chenthill Palanisamy at Novell, have developed a new Evolution backend that can talk to Microsoft Exchange 2007 and 2010 by way of Microsoft‘s “Exchange Web Services”, a publicly documented SOAP-based API.

The new backend package is called “evolution-ews”.

In order to avoid all the craziness of the GNOME 2-to-3 transition, the backend was originally developed exclusively for Evolution 2.32. Chenthill has been busy porting it forward to 3.2 so it can start syncing up with GNOME’s regular release schedule.

Hopefully Microsoft will stick to its Web Services interface for a good long while so we can stop having to write new Exchange backends every few years.  :)



New Backend for Kolab Groupware

Christian Hilberg and his team at kernel concepts and tarent GmbH have developed a brand new Evolution backend for Kolab Groupware servers.

The new backend package is called “evolution-kolab”.

As with “evolution-ews”, the initial development was targeted at a fixed and now older version of Evolution, and Christian is ready to begin forward porting it and eventually syncing up with GNOME’s regular release schedule.


Saner Account Storage

As for me, I’ve been toiling away for most the year on those not-so-simple GConf keys I mentioned earlier -- the ones that we stuff account information into in the form of XML blobs.

Evolution’s account storage will soon move to plain text files in a simpler .ini-style syntax. Account data will be easier to read, easier to edit, easier to back up, easier to copy to other systems.

We’ll also introduce another new D-Bus service to manage these account files and also centralize some account-related background jobs that Evolution currently handles (but shouldn’t) such as GNOME Online Accounts monitoring.

I could ramble on about this but I’ll save it for a separate blog post.



As you can see, quite a lot going on at once. Any questions, feel free to email me, or email Evolution’s development mailing list, or jump on Evolution’s IRC channel: #evolution on GIMPNet (irc.gimp.org).

May. 25th, 2010

Evolution is rocking on Windows

Fridrich Štrba has been doing an awesome job of integrating the latest Evolution release on Windows. We have a new Windows installer!

Since he's not on Planet GNOME, I'm acting as his proxy. Check out his latest blog post for details and lots of pretty screenshots.

Mar. 5th, 2010

A handy sidebar trick in Evolution

In Evolution, you can display multiple calendars, task lists or memo lists at once by check marking their names in the sidebar.  I'm not a heavy calendar or memo list user myself, but I do practice the Getting Things Done methodology with Evolution's task lists.  Here's my current set of lists:

So much to do...

Earlier today, Nick Jenkins filed a bug complaining about how cumbersome it is to just focus on one list (or calendar).  And he's right.  You basically have two choices: 1) go through the sidebar and manually un-check everything you don't want to see, which is ridiculously cumbersome, or 2) right-click on the item you do want to see and select "Show Only This whatever" from the pop-up menu, which check marks that item and clears all others.

 

Handy, right?  Well, not so much if you use it frequently enough.  Nick was asking for an easier way, so I suggested we make triple-clicking on a sidebar item a shortcut for the "show only" menu item.  (Triple instead of double-click so it's not so easy to trigger by accident.)

Took about a half hour to hack together and I have to say I'm startled at how much easier this simple enhancement allows me to manage my task lists!  I like it enough that I snuck it in at the last minute for Evolution 2.30.

Feb. 14th, 2010

Using GStreamer to sample arcade music

Recently I discovered the online Arcade History database has added music samples for some games.  For example, they now have music for the mid-80's racing game Out Run.

I thought it would be cool to integrate that into my MAME front-end, GNOME Video Arcade, and wound up blowing the whole weekend on it. I'm happy to say it's finished already, and works great!

My foray into basic GStreamer programming was suprisingly pleasant. The API is nicely designed and well-documented, and simple use cases like mine are made easy. The "playbin" plugin pretty much did all the work. I just fed it Arcade History URIs and wired up a simple user interface to follow state transitions from the audio stream.

GStreamer is an example of the kind of high-quality software engineering that I strive to emulate in my own work.


 

Sep. 18th, 2009

Evolution is 100% Bonobo-free!

A couple years ago I wasn't sure I'd ever see the day, but today I'm delighted to announce that Evolution has finally dropped not only its Bonobo dependency but also its libgnome and libgnomeui dependencies (see for yourself)! This will debut as 2.29.1.

Quick recap of recent events:
  • We created our gnome-2-28 branch earlier than usual to get a head start on Evolution 2.29 development.
  • We merged the kill-bonobo branch that I talked about awhile back.
  • We ported the address book side of Evolution-Data-Server from Bonobo to D-Bus, and are currently finishing up the calendar side.
  • We are tracking both Evolution regressions and Evolution-Data-Server regressions. If you're the bleeding-edge / early-adopter type please help us test the new code and report any more regressions!
  • Bonobo-free Evolution packages for Fedora 12 are available from my Fedora People page. The package versions are relabeled as 2.27.99 for easier integration with Fedora 12 but it's actually the 2.29 code in disguise.
Next project for me is to get Evolution-Exchange back on its feet. With Bonobo gone the poor thing is all confused now and refuses to build.

Jul. 26th, 2009

Still a Kid at Age 33

As a child of the 80's I was just old enough to get swept up in the craze of what has come to be known as the golden age of arcade games. I have fond memories of pouring my weekly allowance into those old coin-operated machines at our local grocery store, mall, laundromat, bowling alley... practically every place I went had at least one or two. I credit my fascination with those games for getting me started with computers and programming at an early age. For me, the nostalgia has never really worn off.

For my 33rd birthday this weekend, Candace and I made our annual pilgrimage to Funspot Family Fun Center in Weirs Beach, New Hampshire. Funspot is home of the largest video arcade in the world. If you're at all a fan of classic video games and you live in or are visiting New England, you really must see this place. While sporting the usual fare for these "fun center" type places, the real treasure is up on the third level (yeah, it's that big), away from the mainstream crowds, where you'll find the The American Classic Arcade Museum. The museum holds over 250 video game and pinball machines of yesteryear, and is where much of the hilarious yet highly engrossing documentary The King of Kong was filmed.

Suffice it to say I had a blast. Set the day's high score on a number of machines, including a 263,000 point game of Donkey Kong. Also had to play a few rounds on their famous Pac-Man machine, but I swear I was better at that game when I was eight. Can't wait to go back.

 
 

Jun. 20th, 2009

Fedora Packages for Kill-Bonobo

Fedora 12 ("Rawhide") packages for Evolution's kill-bonobo branch are now available. Install this repo file to get updates through yum. The branch is currently synced with Evolution 2.27.3.

As stated previously, not everything is functional yet. Please file bugs for the parts that are. I'll try to post updates at least weekly.

Jun. 17th, 2009

Evolution Will Soon Bid Farewell to Bonobo

This is a combination announcement, history lesson, status report and call for help.

For nearly a year I've been laboring over an Evolution branch named kill-bonobo, whose goal is exactly that: eradicate Bonobo from Evolution once and for all. According to the GNOME release schedule, I'm due for a status report. (Note, this only pertains to the application itself. The data server is already being ported from Bonobo to D-Bus by Ross Burton. The two projects are independent.)

The kill-bonobo branch is strictly an internal cleanup effort, albeit a massive one. It's not about adding features or radically changing the end-user experience. It's about making Evolution easier to maintain and enhance as we enter into the GNOME 3 era. So if I've done a good job, users will hardly notice any difference when the branch is finally merged.

Those who are interested in testing the branch can skip to the "How to Help" section.

Why We Need It

I was not present for the early evolution of Evolution, so this account is based on historical research and discussions with some of the old-timers. Hopefully they won't clobber me for getting the details wrong, or for calling them old-timers.

Evolution's original design consisted of a simple skeletal "shell" which served as the framework for out-of-process Bonobo components. Each component managed different types of information: one for email, one for calendar events, one for contacts, etc. The components talked amongst themselves via CORBA, which handled all the IPC. Ettore Perazzoli, in his paper for the 2001 Ottawa Linux Symposium, wrote:
It is interesting to note that the various pieces of Evolution are currently out-of-process components, and that CORBA deals with the inter-process communication nicely and transparently; it would be possible to turn these components into shared libraries without any substantial changes to the code.
And that's exactly what happened. The components were turned into shared libraries sometime later to help address some design issues and to make the application more debuggable. Evolution then became — and has remained — one monolithic process. Most of its functionality is still supplied by in-process Bonobo components loaded at run-time. Bonobo was kept around in part for the menu merging capabilities of libbonoboui, but also because it was already very deeply ingrained in the application by then. To this day, Bonobo still handles all the inter-component communication, even though it's all one process.

Fast forward to present day. Bonobo has fallen out of favor with the rest of the GNOME community and its libraries are now deprecated (or planned to be deprecated — the distinction is unclear). GTK+ has gained a menu merging capability in GtkUIManager, GObject has gained a module loading system in GTypeModule, and developers are scrambling to migrate code away from deprecated libraries and API in preparation for GNOME 3.

Moreover, the inability of Evolution components to interact directly with the central shell continues to be a major design impediment. Certain bugs cannot be fixed and enhancements cannot be implemented with Bonobo in the way. Even something as simple as setting the proper relationship between a dialog window and the main application window can't be done under the current design without breaking the component/shell abstraction.

In short, Bonobo's time has passed and it needs to get gone.

What's Finished

A New Shell

I have rewritten Evolution's shell from scratch. While still adhering to the original design principles, it now loads components (I'm calling them "shell backends" just to get away from the CORBA nomenclature) at startup via GTypeModule. Each main shell window provides a central GtkUIManager instance for shell backends to merge and un-merge their menus and tool bars. The new shell provides a bunch of other convenient services that it didn't, or couldn't, before. The API is now mostly stable, and it's documented! (A trend I hope to continue.)

The shell itself is a subclass of UniqueApp from libunique, so Evolution is still a single instance application. In fact, that feature has improved. Starting a second Evolution instance with no command-line options will now raise and focus the current window instead of opening a new one; a behavior greatly preferred by users. Also, Evolution will now terminate when it's finished handling a command-line URI and there are no other Evolution windows running.

Infrastructure

Beyond the shell, it's mostly been a matter of slogging through the rest of the code and adapting it to the new shell API and the more modern GTK+ APIs. Turns out, Evolution has a lot of code, and a lot of infrastructure that piggybacks on Bonobo. Needless to say, that's why it's taking so long.

All of the menus and tool bars, and many of the stand-alone buttons and combo boxes, are now proxy widgets for GtkActions. EMenu and EPopup — the mechanisms that allow plugins to extend menus — are being phased out in favor of EPluginUI, which works with GtkUIManager. In fact, many of the plugins themselves are being phased out — their features being properly integrated into the application.

Asynchronous activity tracking — that's those percent-complete and error messages in the status bar — is now more object-oriented. The shell even lends a hand in routing and tracking these activities. I have a number of ideas for leveraging this new framework. Eventually I'd like to eliminate pop-up error dialogs altogether in favor of something less obnoxious, such as "inline" alert messages similar to those in Firefox, gedit, Sound Juicer and Evince. Also, better shutdown management — where Evolution tells you what network activities are keeping it from shutting down and allows you to cancel them.

Just getting the thing to build was another challenge. What I assume was once a nice layered design with clean separation of concerns has grown into a tangled mess of circular dependencies. I've managed to resolve most of the linking issues by shuffling source code around and routing application-wide events through the shell. But there's still the issue of library modules linking to library modules (plugins linking to shell backends and shell backends linking to one another), which is not portable and in fact prevents Evolution from building on Mac OS X.

Shell Backends

The contact, memo and task backends are done, and I'm currently wrapping up some loose ends on the mailer. All are usable and ready for testing. I personally have been using the kill-bonobo branch for daily email and task management since February.

Calendars, however, are another story. See below.

What's Unfinished

The branch is about 75% complete. It's usable, but there's still significant work to be done.

The Calendar

The calendar is half-finished and is not yet usable. This is the last major piece left.

I was attempting to split up the massive GnomeCalendar class into smaller, more manageable pieces. But I got burnt out and had to set it aside for awhile, and then never got back to it. At this point I'm in favor of just getting it working as quickly as possible. I can take another shot at refactoring it later when I'm feeling masochistic again.

Plugins

Many of the plugins still have to be adapted to EPluginUI and the new shell. This is a highly parallelizable area where I could use some help from volunteers. The working and non-working plugins are listed in "configure.ac" (search for PLUGINS NOT BUILDING YET).

Evolution Exchange

Evolution Exchange (formerly the "Ximian Connector for Microsoft Exchange Server") presents an interesting problem. The evolution-exchange-storage process is the last out-of-process Bonobo component that talks to the shell. Ximian originally released this software under a non-free license, and used the split process design to bypass the linking restrictions imposed by the GPL. Later, after Ximian was acquired by Novell, it was released under an open-source license. But the design remained unchanged, even after Evolution was collapsed into a single process application.

I'm uncertain of what to do with this. To me, the best solution would be to convert the storage process to shared library modules for the Evolution and Evolution Data Server processes. But that could take some doing, and time is short. Plus, Evolution Exchange is being phased out by Evolution MAPI anyway. Another option is to hack together a quick and dirty D-Bus API for the shell, which the storage process can use. But I'm hesitant to expose a poorly thought out D-Bus API just for a corner case.

Third-Party Extensions

Third-party extensions such as evolution-rss, evolution-brutus, and evolution-jescs will likely require some re-design. I will lend a hand here as much as possible.

How to Help

The best way to help right now is to test drive the kill-bonobo branch and file Evolution bug reports at http://bugzilla.gnome.org/. Since this is an unofficial branch I have my own little system for tracking reports in Bugzilla. But really, if you do file a bug just mention that you're running the kill-bonobo branch and I'll take care of the rest.
  • Existing bugs that the branch may be able to address are tagged with evolution[kill-bonobo] in the Status Whiteboard field. (Bug List)

  • Existing bugs that the branch has successfully addressed are tagged with evolution[kill-bonobo] in the Status Whiteboard field and the Summary field prefixed with [KB-Fixed]. (Bug List)

  • Regressions that the branch has introduced get tagged with evolution[kill-bonobo] in the Status Whiteboard field and the Summary field prefixed with [regression]. These are what I'm looking for. (Bug List)

Evolution developers and contributors looking to hack on stuff could start by picking a non-working plugin and getting it back on its feet (see the previous section). That would probably acquaint you with the new shell API, and possibly expose bugs or shortcomings in the design. Catch me on GimpNet (channel #evolution) if you're interested in this.

For Fedora users, I will attempt to publish a kill-bonobo RPM repository for Fedora 12 / Rawhide in the near future. Stay tuned.

Credits

Finally, I have to give props to my employer for humoring me through this ordeal, especially since I've consistently underestimated the workload. While the work has been largely exploratory and at times overwhelming, in the end it's been highly educational and satisfying.

Apr. 15th, 2009

Evolution Attachment Rewrite

Today I finished a rewrite of Evolution's attachment handling code. What was supposed to be a short detour from a much larger ongoing project (more on that later) ballooned into a month-long overhaul. I had already sketched out plans for a rewrite a year ago. This was just preparation meeting opportunity.

The goals of the rewrite were primarily internal code cleanup, but there's some UI bling too:

  • Attachment handling code is currently scattered throughout Evolution, with lots of duplication. The rewrite collects everything in one place.

  • Migrate from GnomeIconList (deprecated) to GtkIconView, with a custom GtkTreeModel specifically for attachments. And throw in a GtkTreeView option just for kicks.

  • Better utilize GIO for file operations, thumbnails, emblems, etc. Abstract away the distinction between local and remote files. Stop using threads, and make sure all blocking calls are asynchronous.

  • Migrate the attachment popup menus to GtkUIManager.

  • Kill off a couple frivolous attachment-related plugins and support the functionality directly. We ship way too many plugins as it is and I'm gradually killing off the silly ones.

  • Make the whole thing extensible, to help resolve some cyclic dependencies within the application. The mailer now handles the mail-related parts, the calendar handles the calendar-related parts, and so on.


Here's a few screenshots. The first two show off the new icon and list views when composing email, and demonstrate simultaneously loading from or saving to remote stores (I used some big audio files here for better illustration of the progress bars). Both file operations are cancellable. The third screenshot shows off the attachment UI for received emails.


Icon View


List View


Received Attachments

Feb. 26th, 2009

GNOME Video Arcade has moved to GitHub

To better acquaint myself with the way of the future, I've moved my GNOME Video Arcade project from SourceForge to GitHub, and also set up a horribly amateurish website for it.

GNOME Video Arcade is a simple MAME frontend written to suit my own aesthetic taste better than other UNIX-based frontends, most of which I find too clunky and cluttered. And it's something to hack on when I'm burnt out from my real job.

Previous 10