I’ve been using Firefox 3 Beta 2 for weeks now, and it’s absolutely amazing. There’s not much else to say other than that. Just a few quick points, and then I have a gripe.

The Good

  • Memory consumption is so amazingly low compared to Firefox 2. I actually don’t find myself constantly killing my browser these days.

  • GNOME/GTK+ integration is finally up to par I think. Browser shell widgets look more native, web controls look native. Fantastic icon theme integration. Firefox finally feels like part of my desktop now. Kudos to all the great GNOME love. It’s about time!

  • The new location bar drop down is awesome.

  • There are subtle attempts of humor.

  • It’s been rock solid, more-so than Firefox 2 ever has been, barring the typical Adobe Flash freezes.

  • We have packages with proper distro-integration patches for openSUSE 10.3 (1click Install and yes, it will replace your Firefox 2. I live on the edge!)

The Gripe

I hate the new full page zoom! So many people rant and rave about how awesome this feature is. It’s horrible. It breaks usability and accessibility of web pages.

When reading a page in a properly designed web site (proper semantic markup and good CSS) in Firefox 2, text would re-flow properly when I zoomed. This allowed me to read a page with increased zoom without breaking the layout of the page, but also not causing it to scroll horizontally. In Firefox 3, everything zooms in, often causing me to have to scroll horizontally to read the page in question. Utterly bad.

The closest thing I’ve been able to do is set mousewheel.withcontrolkey.action to 3, causing text zoom to happen when I hold control and use the scroll wheel. The problem with this is that it’s hard to know how many levels you’ve zoomed (I have an insane scroll wheel with ball bearings… it’s very fast and sensitive) and there is no reset (like CTRL+0, traditionally). Also… I just like CTRL++, and CTRL+-.

Firefox 3 - about:config

So how can I completely disable the full page zoom and have my normal buttons behave like I’m used to?

This is the biggest downfall in Firefox 3, but on the whole, it’s awesome.

The new Banshee logo Only a few months overdue, we’ve finally released a new stable Banshee. This release includes a slew of important bug fixes and a handful of new features.

iPod

On the iPod side of things, there have been some pretty heavy changes since the last release. We now require PodSleuth and the latest ipod-sharp. This is the first release that drops libipoddevice, the hardware layer that was obsoleted by PodSleuth.

What users should care about is that this release supports the new Nano and Classic iPods. We currently are not supporting the iPod Touch nor the iPhone. Of course, my personal stance towards any iPod, especially the iPod Touch and the iPhone is to simply avoid the hardware and the lock-in that goes with it.

Last.fm

The biggest new feature users will notice is the Last.fm streaming plugin that Gabriel Burt wrote a few months ago. This plugin allows you to listen to Last.fm radio stations with all the love/ban glory expected from Last.fm clients.

We have opted to disable this plugin at runtime by default for now, but it is built by default and can easily be enabled through the plugins dialog. Gabriel has blogged in detail about this awesome new plugin.

Album Track Editing… now even easier… again

A couple of months ago I found myself in the position, yet again, of wanting to import a CD that didn’t have metadata in MusicBrainz. I have blogged about the excellent track editor in Banshee before, but I continue to want to improve it. Editing an entire album’s metadata can be a tedious task, but I think I have greatly simplified it yet again.

Now you can select a table or list (from a web site, for example) of track names for the album you are editing and paste the entire selection into the first “Title” field in the track editor. The selection will be parsed and applied to all of the tracks in the editor.

For example, I went to Amazon.com, found the album, selected all of the tracks, and pasted it into the first title entry in the Banshee track editor. I didn’t have to type any of the titles on the CD. I created a screencast of the entire process of filling in all of the album metadata manually. Slick, though it’s still of course always better if the metadata can be found in the first place via MusicBrainz.

Batch pasting titles into the track editor for an album
Screencast demoing the new batch title editing for albums without automatically resolved metadata. Ogg/Theora, 46 seconds, 3.2 MB.

With metadata on the mind, I should note that Banshee’s metadata services stack is very versatile and allows for any number of metadata providers. We have a few, including MusicBrainz, Rhapsody, and Amazon. However, the Amazon provider does not fetch metadata, it just downloads cover art (and same applies for the Rhapsody one). It would be really nice if someone provided a full Amazon provider (or Rhapsody) that used their web services API.

The problem with this however, for Amazon, is that it requires a developer key (at least it did in years past), and this is why we have never invested time into implementing one. Instead we just rely on MusicBrainz, and perform cover art downloads from Amazon if the MusicBrainz metadata has an associated ASIN.

Ugh, this song sucks!

Another minor little feature users may notice is a new “Play next song” button that shows up in the notification area bubbles. It’s quite nice when you’re listening to music in the background and a song you hate starts playing. Easy to skip without switching interfaces. Of course, if you have multimedia keys set up, I suppose that’s even easier.

Notification bubble allows skipping songs
Notification bubble allows skipping songs!

MTP

Alan McGovern has nearly completely rewritten our MTP support and we are close to enabling it by default. The next release should have solid MTP support, and we hope to roll 0.13.3 within the next two weeks. The new MTP support uses libmtp instead of libgphoto2. This decision was made for a number of reasons, though I am really not informed enough to convey them properly. Alan has blogged a bit about his changes and his reasons for switching libraries.

We encourage users to try the new MTP support in this release, but we do not want to see distributions packaging it at this time. To enable MTP support from source, pass --enable-mtp to configure. There are a handful of known issues with many MTP devices, and these will be addressed in 0.13.3. Nevertheless, we wanted to get something out the door.

Mono.Zeroconf

I blogged about my new Mono.Zeroconf library a few weeks ago, and this release of Banshee is the first to require it. It greatly simplifies zeroconf logic inside Banshee itself by allowing us to target only one API instead of two (Bonjour and Avahi). Only the DAAP plugin uses it, so if you do not wish to install Mono.Zeroconf, pass --disable-daap to configure.

Great, but what about the really cool stuff?

While 0.13.2 is a solid release with some exciting new features, the real goodies are in our unstable trunk. We have done a ton of work on trunk, rewriting Banshee nearly from the ground up. Performance improvements are massive, and we expect to have some sort of preview release out within the next two months. Now that we are winding down with this stable series, 0.13.2 is out the door, and winter holidays are over, we will be heads down on trunk, making great strides.

Expect lots of blogging in the coming months about details of trunk. In the mean time we have a high level roadmap that can be tracked. Stay tuned, because a lot of really exciting stuff is happening in the Banshee universe!

We are hard at work on the next generation of Banshee, and I’ll be posting details and juicy screencasts and screenshots soon. What I’m curious about now is what we should call Plugins in our UI. We use Mono.Addins in trunk now, and I have been thinking about renaming Plugins in the UI to something else, such as Extensions. My first thought was, “what does everyone else use?”

That wasn’t so helpful:

  • Banshee, Totem, gedit: Plugins
  • F-Spot, Epiphany, Firefox: Extensions
  • Tomboy: Add-ins

While this is just a small sampling of GNOME applications I thought of in 30 seconds, by far I think Tomboy loses. Add-ins, especially hyphenated, is weird. Note that Firefox seems to mix Extensions and Add-ons. Extra weird.

So the vote is between keeping it Plugins or switching to Extensions. I don’t care either way, but it would be nice to settle on some consistency within GNOME. Or maybe it doesn’t matter. Just a thought.

Some other names we have thought of include: Plugstensions, Bundleups, Snap-Ins, Snap-Ons, and snorp even recommended Butt-Plugs, but I don’t want to think too far into that one. I am sure Strap-Ons was in the running at some point too.

This is where you leave your €0.02. I hope it gets philosophical.

UPDATE: It seems like Extensions wins. Bugs filed against Totem, gedit, Rhythmbox, Tomboy, MonoDevelop, and Banshee. Other applications I’ve run across are already using Extensions, like F-Spot and Epiphany.

I remember the days, not so long ago, when I could drop new fonts in my ~/.fonts directory and run fc-cache. The next time I instantiated a GNOME font chooser dialog somewhere, I would see my new fonts. It seems that in GNOME 2.20, I now need to restart my entire GNOME session to have the fonts show up. What is up with that? There must be a way around this. Anyone? Anyone?

Granted, I don’t even think I should have to run fc-cache. Ideally I should just be able to drop a bunch of fonts into the fonts directory in Nautilus and everything just works. That doesn’t seem to be the case either.

UPDATE: fc-cache works now, and I see my fonts without restarting the session. I apparently had a corrupt font cache or something. Although I’m not sure why a session restart addressed it. I’d still be interested in knowing if it’s possible to add fonts without using a terminal — it’s not obvious to me at all how this is accomplished in GNOME.

We’ve been hard at work on openSUSE 10.3, to be released in a couple of weeks. RC1 marked the “transition point” for me. I’ve moved my main machines over to 10.3 RC1 from 10.2. It’s very nice to be running the latest GNOME again. Some major things I was involved in for the 10.3 cycle:

  • Lots of Banshee work, of course. The latest release (0.13.1) is in openSUSE 10.3, and we will be pushing major updates into the proper channels when they are ready. We plan to deliver support for the new disgusting iPods in the coming weeks, probably just after the final release of 10.3.
  • The new codecs installation web application. We have hooked into the proper places in GStreamer to handle “codec missing” problems in Totem and Banshee.

    If you are missing a codec, you will be taken to the new codecs web application. Depending on what codecs you are missing, what’s displayed on the web page will change. For instance, if you installed from only the OSS media and tried to play an MP3 through a GStreamer application, you will be given a 1-Click Install option for the Fluendo MP3 decoder (which is now shipped and installed by default through the non-OSS patterns, like the DVD).

    What we are able to offer for our users through this web application will likely change for the better in the future, but we have a wonderful solid starting place for the release.

  • Shipping Brasero. This is a new all-singing-all-dancing CD/DVD burning application for GNOME with a lot of potential and very active development.

    Because Brasero is so new, this decision was initially a bit daunting, especially when coupled with the bad experiences some of our users had with previous versions on openSUSE 10.2, but it has been rock solid in all testing so far. Kudos Brasero developers! In openSUSE 11 we will investigate making Brasero the default burning application for GNOME (currently it is still Nautilus, but Brasero is installed by default).

openSUSE 10.3
openSUSE 10.3 RC1 - Click for Full Screenshot

One of the first things I did after switching my primary machine to 10.3 was some theme work. I am a big fan of Gilouche — great color scheme and it has some wonderful custom theme polish for the new GNOME Main Menu, Application Browser, Control Center shell, and the new International Clock. However, I really like the Clearlooks Gummy theme that is new in GNOME 2.20. So naturally I had to combine the two. Garrett will investigate making it official, but I am going to link to my version right now for anyone interested in using it now.

Anyway, here is Gummy Gilouche! It’s featured in the screenshot above, so click it for a better preview. I disabled the gradients that are drawn on the tabs. If you want to enable or disable certain things in Clearlooks or this Gilouche derivative, see Marco Barisione’s post for details.

I highly recommend everyone check out openSUSE 10.3 - the RC1 is solid, and the final release will be out soon. Keep it on your radar!

31 Jul 2007

What Now?

Dear Lazy Web, would someone enlighten me on exactly what has changed this time in nautilus-cd-burner? Pretend I am an ISV, and we actually consume the public API in this platform component. It breaks for my application every six months like clockwork. Why?

I have been spending most of my time in the last few weeks working on the new pieces of Banshee, namely the DBus support and the list view. The SourceManager and its sources are now fully exposed over DBus. Exposing their artist/album/track models over DBus is next.

Mostly though I’ve been working on fixing up the drawing code, general refactoring, and cleaning up of the list view. There is now essentially a theme class that does all of the drawing, much like what GTK+ should provide. Implementing cute drawing of contiguous selections last night made me quite happy.

Gratuitous!

Gratuitous. Yummy.

I am a fan of custom widgets. I write a lot of them. Most are not over the top, or even noticeable, but are useful. In fact, most of my widgets I more often call “composite” widgets instead of “custom.” That is, a widget that does some common things to a group of child widgets. Not much involved, but reusable and useful in some context. Gtk# makes this kind of widget writing actually a simple and natural thing to do, unlike C, where you start your work by despising the task at hand. Ahhh - the usefulness of a good binding.

However, I have also written a number of full blown custom widgets, wherein I handle all input and drawing. It’s this kind of custom widget I’d like to talk about today. Actually, let’s just skip to the drawing part!

Ideally, when a custom widget needs to draw some control part, the first thing the author should do to accomplish this is look to see if there is some style that can be reused in GTK. Adhering to this guideline means the custom widget should look like the rest of GTK. It’s good for integration on a number of levels. It’s at this level that the problem arises: in many cases the theme engine will completely ignore the draw request!

In GTK there are a number of theme drawing primitives: hline, vline, shadow, arrow, box, check, focus, tab - to name a few. It’s then up to the theme engine to actually draw the requested style. A “detail” can be passed to each of the drawing functions that the engine can use as a hint. I think these details are somewhat standard, but I can’t find any documentation of them.

So what’s the problem? I have come to the conclusion that either I do not know what I am doing or theme engine authors do not understand the object model and power of GTK itself.

For instanced, when I try to ask GTK to draw a box in the same style that it’s drawn for the GtkTreeView, I get just a regular plain box. No special theming. Why? Because the engine itself is written to not allow this!

Take this snippet, from Clearlooks:

else if (DETAIL ("button") && widget && widget->parent &&
    (GE_IS_TREE_VIEW(widget->parent) ||
    GE_IS_CLIST (widget->parent) ||
    ge_object_is_a (G_OBJECT(widget->parent), "ETree"))) /* ECanvas inside ETree */

Here it will only draw the requested style if it has the proper detail, and the widget happens to be a real GtkTreeView (among other special cases). This makes it impossible for custom widgets to be written which emulate the look of stock GTK. Evidence of this can be seen throughout the desktop.

Let’s start with a stock GtkTreeView. Observe very carefully how the header looks. This is what the three custom widgets following have to try to mimic because it is impossible to actually request this style to be drawn.

GTK Headers in GtkTreeView

Here’s Evolution’s ETree headers. They use the “button” detail to actually draw each column header, probably because the author ran into this larger issue when writing the theming for the widget. In fact, there’s a separate hard coded hack in Clearlooks itself (which can be seen in the snippet above) to draw the button in a special way just for ETree, implying that even the engine author knows this is an issue!

GTK Headers in ETree

For XUL, there is a theme that uses the GTK theming engine. Most widgets look okay, after padding and spacing hacks, but I point back to their list view. Here’s a screenshot of how their headers are drawn. I talked with Garrett about this, and he said he remembers running into this very same issue when working on the Firefox/GTK theme.

GTK Headers in XUL

Finally, when working on my new high performance data binding 2.0 synergistic .NET list view widget, I again ran into this problem (I have run against similar problems in other custom widgets) when working on the drawing code for my headers. I used another hack to best replicate what I observed in most themes. I drew one large “button” box for the entire header at something like (-10, -10, Allocation.Width + 20, Allocation.Height + 20). This way there would be no button border or rounding, but you could get the subtle gradient/raised look that themes often draw. A nice hack that worked relatively well, but was still a nasty hack at the end of the day.

GTK Headers in Managed List View

This is just one example of inconsistency regarding custom widgets due to limitations in the theme engine. It’s not just Clearlooks however. In the gtk-engines module, there is a support library of common functions that theme engines can use. There are a bunch of macros taking the form GE_IS*. These macros are used to determine the type of an object, so that theme parts can be drawn in different ways depending on what widget they are to be drawn.

Here’s a really crappy shell command that counts all of the GE_IS* instances in gtk-engines to show how ingrained the idea of using an object’s type to conditionally style it is:

(s=0; for v in $(grep -c GE_IS `find -iregex "^.*\.[ch]$" | xargs` | cut -d':' -f 2); do s=$((s + v)); done; echo $s)

I’m sure there’s an easier way to get the sum of the counts from grep, but I am just that lame. Anyway, I am counting 286. Wow.

My widget does not derive from GtkTreeView, so I cannot use the styles defined for it by the engine. Because of this, custom widgets immediately become second class citizens. This is bad for complex applications that may do their own theming, and probably ISVs if they care, and most certainly for other toolkits (XUL, QT, Wx) which can use the GTK engine to provide a theme that integrates applications consuming another toolkit with the rest of GTK.

This limitation is pointless to me. All of this object-hierarchy-bound conditional theming can be replaced with a much better detail system that would allow any widget to draw any style. Details should also be published and made standard so it is easy to replicate the styles of a particular widget. The bottom line is that the theme engine should never need to know, or at least never require a widget to be of a particular type for the desired style to be drawn.

There are also a lot of other minor issues, mainly regarding RC styles and proper descriptions of states and colors. There are many themes that do not follow the directions when defining colors for states, which leads to many inconsistencies in custom widgets. This just needs to be better documented.

Of course, and again, maybe I just “don’t get it.” After all I am no theming expert… What I do know is that if I can’t achieve consistent widget theming in GTK, I might as well stop trying to fake it. I have decided, although tentatively, to just use Cairo to do all my drawing with my new list widget, and make it blend the best I can by reusing RC colors. Good-bye GTK Style API.

I perhaps should disclose publicly now that the decision was made on November 1, 2006 to lift the proactive ban on Jono’s World of Metal, which was originally put in place during GUADEC 2006. We may have to re-evaluate the lift in Birmingham however.

Jono, welcome to our project!

The next 6 months are going to represent exciting, drastic, and hopefully welcome changes to Banshee. I will write more in the coming days about what else will land in the near future. You may be able to get a hint from our roadmap.

Oh, Jono, Pepsi is fine as long as it comes with a whiskey chaser, but sadly I won’t be going to LRL. See you at GUADEC!

I will be mentoring Scott Peterson this year in the Google SoC. Scott has contributed a number of excellent patches to Banshee in the past, and I’m quite pleased to be working with him.

He loves tacos and coincidentally, so do I. As a result, he will be doing the official port of Banshee to Windows! Taco Power. The primary action items for Scott will be full hardware support, getting the GStreamer stack working (CD ripping, playback, transcoding), CD Burning, implementing a native playback engine, and all around fixes and refactoring where necessary. After that I’d like to see a slick installer wrapped around it that pulls in the necessary runtime components. I am quite eager for this work to start, as is Scott, and I’m looking forward to another great year of SoC. Good luck Scott!

In an ultimately related note, I installed VMWare Workstation 6 Beta, and it is bloody awesome. Finally USB 2.0 support, and all the devices show up automatically without having to tweak some files. With Workstation 6, I installed and ran Windows Vista for the first time. What a joke. I’ll be testing Scott’s work under XP and Vista, and I was curious to see what we’re up against anyway.

Vista validates my feelings towards GNOME, Linux, and our community. We are rocking in our world, and it shows. Vista looks like nothing more than some glassy upgrades to the XP UI with little change in functionality and lots of extra obfuscation. I don’t think these guys even know what HIG is. You also are constantly answering menial questions. Any time something happens, you get a message along these lines: “A program has been started, do you want to do this? If you started this action, continue.”.

Installing the VMWare Tools was really fun. First Vista asked me twice if I wanted to run the installer. Yes. Then for every driver the installer installed, Vista asked me to confirm that I wanted to install it. I think I had to click “Continue” at least 15 times. This is their answer to keeping the computer secure, the user safe. ASK LOTS CONFUSING OF QUESTIONS (at least you will choose the correct answer no less than 50% of the time!).

Even worse is that after all these years, they obviously have never tested any of their software on real users. It is incredibly hard to navigate through dialog boxes and prompts. It’s the classic usability issue we know so well in GNOME - the difference is that we have fixed it, we are aware of it, and we are better for it. Here’s a perfect example. I ran the Windows Update stuff, but wanted to restart since VMWare Tools finally finished installing. So I clicked “Stop” in the updater. I was stopped by the Vista police and had to answer some questions regarding my actions. It went something like this (mind you, the button I clicked was labeled “Stop”):

“Are you sure you want to cancel Windows Update?”
[Continue] [Cancel]

WTF? There are so many things wrong here. Let’s see. I clicked “Stop.” So here, does “Continue” mean “Continue Updating” or does it mean “Continue Stopping?” Maybe “Cancel” means “Cancel Updater.” Hmm. Maybe “Cancel” means “Cancel my stop update request.” Nothing about these statements are clear. It’s like a flow chart from hell. It really isn’t possible to make the right choice. You are playing Russian Roulette.

In GNOME it would have gone something like this.

“Are you sure you want to stop the GNOME software updater?”
“You can resume the updater at a later time by going to Control Center, Software Updates. The updater will resume from this point.”
[Continue Updating] [Stop Updating]

I don’t even have to read the dialog text to figure out my correct choice. This is simple stuff.

Anyway, there are so many other things wrong with Vista that I have run into, and I think I’ve explored the system for all of 15 minutes so far. This is the quality that comes out of the Microsoft Machine after 5 or more years of development. This is what they managed to produce. Awful. They live in a box of delusion.

I didn’t mean for this post to turn into a Vista review, so I’ll stop before I become too irate. I had some other more important updates to write about, but I’ll save that for another post. GNOME rocks.

Next Page »