- Got a roofer to look at our loft, which has a squirrel problem. We need our eave combs (i.e. the things that block the gap at the bottom of the tiles) replacing. Quote expected next week.
- Taught DisOrder how to use Secret Rabbit Code.
- Added drag and drop and playlist support to Disobedience.
- Wrote a new manual for Disobedience. It's also grown some help buttons which link into the appropriate bits of the manual.
Disobedience, DisOrder's GUI client, uses a GtkTreeView to display its current queue of tracks (and for various other purposes). It allows rearrangement of the queue by drag and drop. The high-level support for this in GtkTreeView is rather unsatisfactory for two reasons:
- You can only drag one track (row) at a time. It should be possible to drag the whole selection.
- You cannot drag between widgets. Playlist editing in particular is likely to make this important.
(Actually the model where it reports the effects of the drag and drop by inserted/deleted signals on the underlying model is also quite inconvenient for me: Disobedience has to translate it back into a move which it communicates to the server.)
Fixing this involves doing rather a lot of the drag-and-drop work yourself, and while the documentation does exist it is not always clear or even complete. There is existing code out there, and I referred to it while working some of this out; but describing it in English online seems worthwhile. In addition, while some of the code is inextricably mixed with Disobedience's internal workings, a couple of independent modules are presented, which should be usable in other C programs.
This articles assumes some familiarity with GTK+. I have tried as far as reasonably possible to remove DisOrder-specific issues from the discussion here, but note that this isn't always possible.( Read on... )
There are a couple of scripts I've written to help me with development of DisOrder (and of other things).
polybuild can build multiple programs on multiple computers; it produces a HTML “scoreboard” showing the results. I've been using it for a while from time to time to ensure that changes made in one place haven't broken something elsewhere. Here's an example while a build is underway:
For each platform, the left column is for the build (./configure and make) and the right column for tests (make check). Grey means hasn't started, yellow means underway, green means success and red means failure. As you can see, VCS is having some trouble on some of the platforms. The various symbols (other than “?”) link to logfiles containing the relevant build output. Here's the final state:
(heceptor, my FreeBSD machine, doesn't show up because it's turned off. Since I know this perfectly well its invisibility doesn't matter to me, but obviously this would be a problem for some users.)
stabilize is rather more recent. I use it to maintain a disorder.stable branch that tracks disorder.dev; changes are only pushed from the latter to the former when the branch can pass make check. It also emails me if anything has gone wrong, so if I didn't bother to run the tests myself (they take quite a while) then I still find out within the hour that I made a mistake.
stabilize has no associated pretty pictures l-)
Both are quite optimized for my particular setup, but it should be at least possible to use them more widely. Also both only support Bazaar but they could be adapted to other version control systems.
Both can be acquired by:
bzr clone http://www.greenend.org.uk/rjk/bzr/rjk-
Having the menu bar in the window rather than in the normal OS X menu bar is rather weird, but presumably that's fixable. It doesn't produce an application bundle yet either; it might be worth waiting until the GTK+ libraries are more stable before attempting that. Drag and drop is the only thing I've found that doesn't work so far.
What's new here:
- The queue and choose tabs now use a GtkTreeView rather than locally implementing everything in a layout. The main effect of this is that everything works in a manner much more consistent with other GTK+ applications, and you can do things like rearrange and resize the columns (although GTK's implementation of column resizing is crazy and broken).
- GTK+ (or rather Pango) takes care of ellipsizing long track names, which means they are truncated at the column's edge, rather than being truncated to a fixed size and forcing the column width.
- The choose tab now has the track length visible and a checkbox that not only shows the playing state but also can be used to add the track to the queue. The latter isn't completely new, you could always middle-click to do this and a notes icon appeared by playing tracks, but now it's much clearer that you can do this.
This is all on a branch and there's still more work to do but will be in a future release.
One of the things I needed for the user management window below was to convert from single bit in a bitmap to its bit number. (Rights are represented internally as a bitmap, but you want the bit number to index the array of GtkCheckButton widgets that represented them.)( An unportable answer and a portable one )
(comments locked due to excess spam which for some reason targets this article in particular.)
--- server/play.c 2008-03-03 22:56:22 +0000 +++ server/play.c 2008-03-09 11:10:46 +0000 @@ -389,8 +390,14 @@ /* np will be the pipe to disorder-normalize */ if(socketpair(PF_UNIX, SOCK_STREAM, 0, np) < 0) fatal(errno, "error calling socketpair"); + /* Beware of the Leopard! On OS X 10.5.x, the order of the shutdown + * calls here DOES MATTER. If you do the SHUT_WR first then the SHUT_RD + * fails iwth "Socket is not connected". I think this is a bug but + * provided implementors either don't care about the order or all agree + * about the order, choosing the reliable order is an adequate + * workaround. */ + xshutdown(np, SHUT_RD); /* decoder writes to np */ xshutdown(np, SHUT_WR); /* normalize reads from np */ - xshutdown(np, SHUT_RD); /* decoder writes to np */ blocking(np); blocking(np); /* Start disorder-normalize */
So far Alioth is out as it appears to be only for Debian developers (though the front page and project registration form sneakily don't tell you this, implying instead that it's for “Open Source developers” in general) and Savannah is out because the hosting requirements insist on GFDL for manuals, and DisOrder's documentation is GPL'd and are likely to remain that way (the point being that you can copy and modify the documentation exactly when you can do so to the source code).
That leaves Sourceforge, which although it seems to be a bit quicker than I remember it is annoyingly infested with adverts, and Launchpad, which I've had one commenter in favor of and one recommendation against (albeit without an explanation as to why).
What web browsers should I test DisOrder against? I've successfully tested with:
- Firefox 2
- Konqueror 3
- Safari 3
- MSIE 7
- Opera 9
Are there any other at least reasonably widely used browsers, ideally that I can download for free, that I can test with?
(See comments re IE6, and browsers I've tried that don't work.)( Relevant bits of changelog )
What you get when you initially visit the web interface is now, instead of a blunt demand for a username and password, read-only access. In fact the administrator can open this up a bit, for instance giving guests the ability to scratch randomly chosen tracks but not those specifically requested by someone.
There is also a registration page where you can create yourself a new login automatically. This can be disabled for sites that would rather a human was in the loop for any new logins.
The full design can be found here but if you don't want to read that, have some screenshots instead:( Screenshots )
Since chiarkwiki is now dead, I need something to replace the DisOrder wishlist page. It's now an HTML page that only I can edit, but what I really want is a bug tracking system, both for wishlist items and real bugs.
I'd like to not run a whole BTS just for one project, so one of the development hosting services seems like the obvious answer. The ones I know of are:
Right now I'd only be interested in bug tracking and closely related facilities, rather than somewhere to host source code or whatever. It's not completely impossible that other facilities might be useful in the future though.
So does anyone have either any suggestions beyond the above, or relevant experience of using them either as a developer or for the matter just as a user wanting to report a bug - which one would you choose and on what grounds?