Older blog entries for CharlesGoodwin (starting at number 6)

I just dropped my car keys 3 times between getting out of the car and the 5 yards to my front door. Sleeping improperly really does affect motor control and I'm just glad the mistakes were that trivial and not occuring from behind the wheel. Must not drive tired.

Also I think I'm obsessive. I was pissed off that I didn't have any worthwhile email after my 4 and a bit hours of sleep.

Now it is a choice between going for a run and going back to bed. I should go for a run... but sleep is so nice.

Another eventful day.

Progress today was great on the Ibex widgets, as I narrowed down a number of issues and put together some templates that effectively implement margin/pad from CSS (good for HTML devs learning Ibex quickly) and worked out how to play correctly with resources.

An Ibex resource:

(which happens to point to the north image of the bevel2up border)

Obviously the border template has to be much more generic, so the idea was to pass it a resource. In the end, this turned out to be fairly simple [1]:

.org.ibex.theme.win2k.image["bevel" + thickness + form]
(which is passed to the border template as the base for a border)

Border then takes over:

border ++= function(v) {
    // 'cos border also has to accept strings
    if (typeof(v) == "object") {
        $nw.fill = v["nw"];
        $nw.fill = v["nn"];
        $nw.fill = v["ne"];
        $nw.fill = v["ww"];
        $nw.fill = v["ee"];
        $nw.fill = v["sw"];
        $nw.fill = v["ss"];
        $nw.fill = v["se"];

Anyway, once that was established, progress was quite rapid and I probably managed to get 3-400 loc done in a few hours despite the girlfriend [2].

Note: the ++= syntax is for registering traps, which are a powerful form of event notification used in Ibex (something I haven't come across elsewhere). The above code is a write trap which is fired when the border property is put to. A read trap (fired on a read) is done the same way except without the argument for the function, ie function() instead of function(v). And you can register and unregister as many traps as you like on any property, so you can create a powerful cascade of traps for handling complex behaviour through just a single property.

Anyway, gotta end the blog before it becomes a lecture on Ibex... I'm just enjoying it, lots. Why else would I be up at 4am when I'm gonna be dragged out of bed in 5 hours time? XAML ain't seen us coming (despite a Microsoft employee being subscribed to our dev list)! ;-)

[1] The string-based method for manipulated resources is resource["subresource"], which allows for some really clever tricks (a topic for another time!) although it can get verbose for manipulating several levels. That requires nesting the square brackets (.res["sub"]["sub2"]["sub3"]) instead of using a string version of the dot-syntax (".res.sub.sub2.sub3") as I had been trying to do.

[2] She wonders why I frequently stay up til 2am or 3am (or 4am as it is tonight) just to struggle to wake up at 9... it's when I get the most peace and quiet as she's sleeping but I can't tell her that as I don't like to be on the receiving end of pain. Best to fool her into believeing I'm a geek! ;-)

A productive day!

Not only did I get some decent exercise done (I'm almost able to do a decent run these days!) after letting myself go for the last 9 months (after a couple of good years of Thai boxing ever other day), but I also did some decent coding too!

Managed to establish that some bugs in the Ibex core were really just badly reported errors [1]. I'm spending a lot of time fighting my way around these kind of bugs in Ibex at the moment. It's making widget development both difficult and labourious. If only Adam would prioritise a bit better and get these things fixed. ;) Still, we have a nice set of bugs in bugzilla now waiting for maintainence!

People are going to be really surprised by Ibex when it's done. We'll be making releases over the next few months and I'm preparing some really comprehensive tutorials. It's exciting stuff.

My next problem is I have to pay the bills. Hmm... long term job or contract work. How on earth do you get contract work - by cold calling it seems. Not fun.

[1] A <ui:box redirect="target"> should be <ui:box redirect="$target"> - a one line 'target not found' error would suffice but a stack of exceptions just offered no clue. I fell for this because with Lithium (the previous version of XWT/Ibex) the syntax was $-less for redirects: <redirect target="target" />

3 Mar 2004 (updated 3 Mar 2004 at 23:49 UTC) »

Oh my God. I cannot believe this went out on TV to children... I used to watch that when I was a nipper...

In all seriousness, it's obviously edited. Even allowing for a time lapse between video and audio, some of the dialogue doesn't match the mouth motions in several scenes. Phew!

Edit: Just saw Alan's post on the GIMP, noting his comment that, "Much to my annoyance the GIMP makes little effort to clone the Adobe Photoshop user interface or any [other] well known interface".

To adapt a well known phrase, one man's annoyance is another man's joy. I dig the GIMP's interface which can be a joy to use with a decent WM. (Sadly Metacity lacks a few telling tools which may explain your frustration.) I absolutely abhorred the Photoshop interface after having not used it (in favour of el GIMP!) for a few years. I found editting multiple images at the same time in Photoshop 6 (not tried 7) to be very difficult and slow.

And v2 of the GIMP really is an incredibly nice tool to use in my very humble opinion.

I think ultimately it comes down to liking what you're familiar with. Something unfamiliar almost always feels unwieldy, especially when you're trying to accomplish a similar task for which you are already set in your ways with doing.

Just finished improving on that Abiword toc dialogue mockup (one, two, three) although there's still room for further improvement.

Although at the moment I'm suffering from an incredibly frustrating problem with Gecko-based browsers. If the focus is with the browser and I press a key, it crashes [1]. Strangely this problem is also affecting several Gnome games (not that I'm wasting time with them... I can't at the moment as they crash) and Gnome-panel. I've really no idea what's causing it and have been trying for days to fix it.

These are the times when setting uber-optimising compile-time flags [2] comes back to haunt you, as fomit-frame-pointer makes debugging practically impossible. Looks like an emerge -e world with fomit-frame-pointer unset is required - bye bye cpu for 2-3 days.

[1] Meaning I'm posting to advogato and any other web pages by copying/pasting from gedit using the mouse. It's either that or use Lynx.
[2] A side-effect of using Gentoo ;)

28 Feb 2004 (updated 28 Feb 2004 at 11:51 UTC) »

After seeing some dreadful suggestions [1] for the AbiWord Table of Contents dialogue [2], I used Glade to create a mockup that better represented the expectations of the average user.

Surprisingly (or unsurprisingly?) it wasn't well received.

"Not representing functionality..."

Some people have no imagination; what did he think the 'Custom Style' button was intended for? Since the advanced stuff had already been represented [1] I didn't think I needed to redo what had already been done.

Anyway, Dom pointed out that cascading dialogues are a no-go (and from a usability perspective I do agree, I wasn't really thinking clearly at 1am last night) so I'll redo the mockup with an 'advanced' tab instead and this time I'll make the damned advanced dialogue too.

I have to say, Glade was quite fun to use. It has a few annoyances [3] but I really don't see what the complaints are about. Then again, I come from a box-based layout background with my work on XWT so I quickly understood how the layout worked. It's only major shortcoming is the lack of undo/redo functionality - quite annoying when you accidentally delete a container when you meant to delete a widget.

[1] Like this and this - the thread contains more details

[2] Martin Sevior has done some wonderful stuff on adding TOC functionality to AbiWord; it updates live (no having 'update field' like in MS Word) among other nifty features

[3] The two thinks that irked me were 1) not initially showing the widget-view yet it is needed to display any existing windows when you open a project and 2) how do I get rid of the damned label on a checkbox - 'empty contents' just left a gaping grey hole

Now I have an online journal thanks to advogato.org!

I'm tired and I've really been procrastinating on getting the Gnome Office website up to scratch. I did a lot of good design work in a 36 hour period but have failed to live up to the billing since then...

I've got to incorporate some of the themes from Ryan Pavlik's design. I've got some good ideas on how to do this, but I've been stuck recently trying to do a Gnumeric SVG icon.

However, since then I've been working much harder on XWT. The project is being renamed to Ibex, so the work has all been in the 'Ibex namespace'. Once we have a few demos we'll make a few big announcements and impress a few people.

Anyway, time to go for a run and get some energy going in order to aid motivation.

New Advogato Features

New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.

Keep up with the latest Advogato features by reading the Advogato status blog.

If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!