Emacs: Implement a GObject’s virtual function

Gergely Polonkai
Jan 13, 2016 :: 13:31

I have recently started creating a GLib implementation of the Matrix.org API. For that, I have created a GObject interface, MatrixAPI, which has as many virtual functions as API calls (which is a lot, and expanding). This way I ended up with the following scenario.

In matrix-api.h I had a struct like this, with a lot more elements:

typedef struct {
    void (*initial_sync)(MatrixAPI *api,
                         MatrixAPICallback callback,
                         gpointer user_data,
                         GError **error);
    void (*sync)(MatrixAPI *api,
                 MatrixAPICallback callback,
                 gpointer user_data,
                 GError **error);
    …

And in matrix-http-api.c, which implements MatrixAPI, I have a function like this (again, with a lot more elements):

static void
matrix_http_api_matrix_api_init(GObjectInterface *iface)
{
    iface->initial_sync = i_initial_sync;
    iface->sync = i_sync;
    …
}

And every time I wanted to implement a new function from the vtable, I had to copy the prototype, and add an iface->foo_bar = i_foo_bar line and an actual function header for i_foo_bar with the same parameters. That’s a cumbersome job for more than 40 function headers. But emacs comes to the rescue!

Now all I have to do is to copy the whole vtable entry into matrix_http_api_matrix_api_init(), execute M-x implement-gobject-vfunc, then put the same vtable entry somewhere before the interface init function, and execute M-x implement-gobject-vfunc-prototype.

comments powered by Disqus

Gergely Polonkai is a systems engineer of a telco company, and also a freelancer self- and software developer.

He is learning about different IT subjects since the late 1990s. These include web development, application building, systems engineering, IT security and many others. He also dug his nose deeply into free software, dealing with different types of Linux and its applications, while also writing and contributing to some open source projects.

On this site he is writing posts about different stuff he faces during work (oh my, yet another IT solutions blog), hoping they can help others with their job, or just to get along with their brand new netbook that shipped with Linux.

“I believe one can only achieve success if they follow their own instincts and listen to, but not bend under others’ opinions. If you change your course just because someone says so, you are following their instincts, not yours.”