Archive for the ‘Knacks’ Category

A nice dark color theme for QtCreator

Staring at long lines of code can get frustrating. Even more so if the said lines have ugly eye-hurting colors. I have been using the beautiful MacVim theme in Vim for some time now and it is quite awesome. However QtCreator, which I use for OpenViBE development, lacks such a theme. This problem was easily fixed though.

Here is a screenshot of a theme I have created and, because of the lack of creativity, named Gulf:

Gulf Qt Creator Theme

Gulf Qt Creator Theme

And here is the link for download:

Get ID3 tags right on your Cowon S9 with Linux

Those ID3 tags on Cowon can be pesky. Sometimes you do not see the embedded images, sometimes you see things like [11] instead of genres and if you are really unlucky you will not see any tags at all.

So, as a quick hint on how to get all of this right:

  1. Use EasyTAG (can be downloaded using your package manager in most distributions)
  2. In Settings → Preferences go to the ID3Tag settings and do the following
    • Check Automatically convert old ID3v2 tag versions
    • Check Write ID3v2 tag → Version 2.3
    • Uncheck Write ID3v1.x tag
  3. Edit tags of your files, be sure to re-save all files which appear in red in EasyTAG as they have probably different versions of ID3 tags
EasyTAG Cowon settings

A screenshot of the EasyTAG settings window

If you want to use images from the tags instead of the per-folder cover.jpg files you can use EasyTAG to include them in the tags as well. Bear in mind though that only jpeg files will be taken into account and only in mp3 files (no love for ogg users). Also for best effects use images of 272  x 272 pixels large.

Gtk, Glade and signal handlers in C++

Much was written about connecting signal handlers to interfaces made with Glade and imported with GtkBuilder. The problem is that everybody uses a different system and/or language. So here is a guide which explains all the magic:

Glade Interface

First of all create your widget in Glade and assign it a signal handler. We are going to create a very simple application which has a single button which exits it.

The Glade interface should look something like this. It is basically a Main Window (main_window) widget with a Button (exit_button) inside. We define a handler for the signal “clicked” for the button and call it exit_button_handler.

The UI inside Glade

The UI inside Glade

C++ code

Now let’s create the source file, it looks like this. As you can see our signal handler is just a basic void returning function.

#include

extern "C" G_MODULE_EXPORT void exit_button_handler(GtkObject* caller, gpointer data)
{
 gtk_main_quit();
}

int main(int argc, char ** argv)
{
 gtk_init(&argc, &argv);
 GtkBuilder* l_BuilderInterface = gtk_builder_new();

 gtk_builder_add_from_file(l_BuilderInterface, "ui.glade", NULL);
 gtk_builder_connect_signals(l_BuilderInterface, NULL);

 gtk_widget_show(GTK_WIDGET(gtk_builder_get_object(l_BuilderInterface, "main_window")));

 gtk_main();

 return 0;
}

The important thing to notice is that the declaration of the callback function is preceded by extern "C" G_MODULE_EXPORT. These two bits of code ensure that the produced object will have a C-compatible table-entry for this function even though we are using a C++ compiler and that it will be accessible under Windows as well. Indeed, the G_MODULE_EXPORT macro expands to nothing under Linux.

Compilation

Now, we need to compile the whole thing. Let’s say we have called the file above main.cpp. The line to call on Linux would be :

g++ `pkg-config --cflags --libs gtk+-2.0 gmodule-2.0` main.cpp -o test

Let’s look at the output of the pkg-config file for a while :
-pthread -I/usr/include/atk-1.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pixman-1  -pthread -Wl,--export-dynamic -L/usr/lib/x86_64-linux-gnu -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lm -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgthread-2.0 -lgmodule-2.0 -lrt -lglib-2.0

That’s a lot of stuff! Depending on the system your mileage can vary, but the important bit is : -Wl,--export-dynamic. This piece of code ensures that you will be actually able to find the symbol once it is needed. On Windows, there is no need for the –export-dynamic flag, just be sure to load the gtk library as well as the gmodule.

And that’s it, done and done!