New week, new adventures
Actually, the number of new adventures has been strictly limited by my birthday first, and by a strange feeling of drowsiness that lasted all week (and still lasts as I’m writing this). Probably, it’s due to the fact that I’ve been sleeping like four hours per night since the last week-end. Yep, that’s probably it.
Dictionary Sources
The stuff (which should land in CVS as soon as I can fix up a test unit for it) coded in two days is the spiffy new dictionary source configuration file. Since we could have multiple dictionary sources, and thus multiple contextes, we also need a way to tell Dictionary what to use. Steal^H^H^H^HTaking inspiration from the new Gedit plugin systems which uses .desktop
files for defining meta-data bound to a plug-in (author, name, description, etc.), I’ve designed a .desktop
file for dictionary sources:
[Dictionary] _Name=Default _Description=Default Dictionary server Transport=dictd Hostname=dict.org Port=2628
The Transport
does the trick: it specifies which GdictContext
implementation should be used. Each dictionary source file is interpreted by the GdictSource
class, which loads the .desktop
file from an absolute path and creates the right GdictContext
for you.
These sources should go inside default directories – right now, the only hard-coded directory is $DATADIR/gdict-1.0/sources
, but GNOME Dictionary will also check into $HOME/.gnome2/gdict-1.0/sources
(and, in the end, I’d like to use $XDG_DATA_DIRS/gdict-1.0/sources). All the dictionary source files found in those directory will be loaded by the GdictSourceLoader
object; using this object, you’ll be able to access the whole sources list or directly get the GdictSource
for a particular name. Oh, and if you look at the format of the dictionary source file, you’ll see that both the Name and Description keys are localizable.
As soon as I begin adding transports (in form of GdictContext
implementations) to GNOME Dictionary, more dictionary sources will be made available; if I add run-time plug-ins to libgdict in the future (maybe the next development cycle), those plug-ins will have to provide a dictionary source file in order to be used.
How does this change the code for a dictionary client? Now, you’ll have to load the dictionary sources and get the source you want, say the default one:
GMainLoop *main_loop; GdictSourceLoader *loader; GdictSource *default; GdictContext *context; main_loop = g_main_loop_new (NULL, FALSE); loader = gdict_source_loader_new (); source = gdict_source_loader_get_source (loader, "Default"); context = gdict_source_get_context (source); g_signal_connect (context, "definition-found", G_CALLBACK (definition_found_cb), NULL); gdict_context_define_word (context, "vera", "GNOME", NULL); g_main_loop_run (main_loop); g_object_unref (context); g_object_unref (source); g_object_unref (loader);
As you see – nothing more complex that adding those lines.
Update 20051124@1435: I’ve committed my development trunk to the new-dictionary
branch of gnome-utils. The src
directory doesn’t build yet, since there’s not much to build, but everything works in libgdict
, where all the fun is ATM. Now that we have most of the infrastructure in place, the UI should soon follow. I’ll make smaller check-ins, from now on.
Update 20051124@2126: I’ve coded in 10 minutes (while commuting from my university to home) and committed simple test suite for GdictSource
and GdictSourceLoader
(it works only if you install the dictionary source file – but it should give you an idea on how it works); I’ve also fixed a couple of dumb bugs (did I’ve already said that I’m a sloppy coder?) discovered when coding the test suite. While I’m waiting for Marta, I’ll begin porting GdictDefbox
.