Greetings from the free side / T'as le bonjour du libre !

Aller au contenu | Aller au menu | Aller à la recherche

jeudi 21 février 2008

Lazyweb: of the good usage of GSource...

I'm currently writing an application that has two backends.

  • In live mode, I acquire images from several cameras.
  • In replay mode, I read pre-recorded images from the hard drive.

As I want to switch between these 2 backends transparently, I thought of using two implementations of a custom GSource. It seemed to be what I need: a way to send and react to asynchonous events. In my case, I want to notify the application that the images are in the memory, and ready to be processed.

However I'm a still a bit puzzled about how GSource works, and I found the documentation a bit obscure to people unfamiliar with the arcanes of the glib main loop. The timeout and idle sources don't give me enough information. The other examples use polling of file descriptors, but I have nothing to poll here. I've even checked out The Official GNOME 2 Developper's Guide, but no GSource there. I had not much result in the gtk-apps-devel mailing list, nor the french GTK forums.

I'm at the point where I'm not even sure that GSource meets my needs, but I wanted to avoid as much as possible exposing the acquisition backend. There will be multi-threaded stuff for live acquisition (the cameras I'm using only provide a blocking API, sigh..), but they're not required for the replay mode.

Do you think a custom GSource is the way to go ? It seems it's the only way I can connect to glib's main loop to receive asynchronous events (excepted from timeout and idle sources). Could someone please explain me a bit in which case(s) using GSource is recommended ? Thanks for reading.

samedi 19 janvier 2008

Long time no blog...

...comme disent nos amis anglo-saxons. Alors tout d'abord, laissez moi vous souhaiter une excellente année 2008 !

J'ai de mon côté commencé les bonnes résolutions, comme par exemple mettre en application le principe de récompense. En gros, ceux qui font du bon boulot méritent une compensation. C'est le cas pour Jamendo, où je viens de faire mes premiers dons. Alors toi aussi cher lecteur, réfléchis bien à ces heures de musique dont tu as pu profiter gratuitement en 2007. Ne serait-ce pas le moment de mettre la main à la poche pour récompenser ceux que tu souhaites encourager ? Non, pas en envoyant un SMS surtaxé pour voter à la Star'Ac, mais en faisant un don à tes artistes préférés.

Quoi, tu n'as pas écouté de musique (pseudo) libre ? Dans ce cas, tu peux tout de même payer une bière à tes développeurs de logiciel libre préférés, ou bien aider à diffuser leur travail.

mardi 11 décembre 2007

Process wakeups on GNOME 2.18

Learning from the past

Yesterday an old (1.5 year) blog entry of Ryan Lortie on cpu and battery consumption came to my mind. He tested some GNOME applications and saw that some of them caused way too many kernel wakeups, which prevents the CPU from entering in low consumption states. So, as just by curiosity (ang ecological concerns), I wanted to see if there's some improvements on this area on the GNOME desktop.

As Ryan talks about Ubuntu Dapper Drake in his post, I suppose he was testing ye old GNOME 2.14. As a comparison, I ran my tests on GNOME 2.18 under Mandriva 2007.1. I then will be able to compare the figures to GNOME 2.20 when I'll install Mandriva 2008.0 (I'm lacking some time for this at the moment).

Some stuff he pointed out:

gnome-power-manager wakes up twice per second to do something
battery applet wakes up once per second to do something
clock-applet wakes up once per second to update the time even when seconds aren’t shown
gajim wakes up 10+ times per second for some unknown reason
at-spi-registryd wakes up more like 20+ times a second (?!?)
gss seems to talk to x11 once per second (presumably to ask if anything has happened). i don’t understand why it has to do this so often.

I don't use some of the stuff he tested. So I tested gnome-power-manager, the clock applet and gnome-screensaver (gss) as he did.

The test method

A test that doesn't explain the test method is irrelevant. What I did is that I used strace for 10 seconds like Ryan did, but using an interesting option of strace (-c) to have a nice summary of the system calls that were used during the observation period. For example the gnome-screensaver process was spied using:

strace -c -p $(pidof gnome-screensaver) & sleep 10; killall strace

Strace is attached to the spied process in the background. We then wait for 10 seconds and stop strace so that it can give us the amount of systems calls performed during this timeframe. The application were not being actively used while the test was performed, and I stopped mouse/keyboard input during the test, just waiting until it ended.


% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
   nan    0.000000           0         1           ioctl
   nan    0.000000           0         2           gettimeofday
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                     3           total

We immediately can see that poll is still called once per second, so either this is a bug that has not been corrected, or this can't really be worked around.

Update: The previous numbers were wrong it seems (weird, I had tested it twice, but the numbers I get now are completely different). The problems reported by Ryan have already been corrected.


With the seconds in the clock applet not displayed:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
   nan    0.000000           0         1           ioctl
   nan    0.000000           0         2           gettimeofday
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                     3           total

With the seconds in the clock applet displayed:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
   nan    0.000000           0        30           read
   nan    0.000000           0        20           write
   nan    0.000000           0        20           time
   nan    0.000000           0        31           ioctl
   nan    0.000000           0        62           gettimeofday
   nan    0.000000           0        30           poll
   nan    0.000000           0        10           stat64
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                   203           total

It's easy to see that enabling the seconds on the applet causes an explosion of the number of calls. That's 3 poll calls per second ! Sound quite abnormal to me, especially the amount of other calls this option generated...


Looks fine.

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
   nan    0.000000           0         1           ioctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                     1           total


It was in the background, but there's still too many calls for an application that was not being used.

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
   nan    0.000000           0        11           read
   nan    0.000000           0         1           write
   nan    0.000000           0        32           ioctl
   nan    0.000000           0         6           gettimeofday
   nan    0.000000           0        11           poll
   nan    0.000000           0         1           futex
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                    62           total


Waaaay too many calls. We here have 4 poll calls/second. The blinking cursor may be a cause (I'm aware a patch for this was made for OLPC). I also know Behdad once committed a patch adding a timer to prevent gnome-terminal from trying to refresh too many times the screen. The goal was to accelerate the display of information. Don't know if the extra calls are related to this, however.

Update: ok, I must have been drinking, everything is normal.
I tested the gnome-terminal that was running strace, so I was getting the calls for executing strace... The good way is for example to test it from an xterm. Another one like this and I jump out of the window.

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
   nan    0.000000           0         1           ioctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                     1           total


The mixer applet is one of the worst offenders! This is a known bug which is being worked on. Hope to see this included in GNOME 2.22.

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
   nan    0.000000           0        99        99 read
   nan    0.000000           0       169           ioctl
   nan    0.000000           0       296           gettimeofday
   nan    0.000000           0       169           poll
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                   733        99 total


Even when not used, this applet does way too many calls... There's room for improvement here.
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
   nan    0.000000           0        34           ioctl
   nan    0.000000           0        67           gettimeofday
   nan    0.000000           0        34           poll
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                   135           total


Looks fine.

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
   nan    0.000000           0         1           ioctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                     1           total


Mandriva's memory-hungry updates surveillance applet seems to be CPU friendly...

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
   nan    0.000000           0         2           ioctl
   nan    0.000000           0         4           gettimeofday
   nan    0.000000           0         1           poll
   nan    0.000000           0         1         1 stat64
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                     8         1 total


Ryan saw gnome-power-manager wake up twice per second in GNOME 2.14. It seems things got worse, as I had it wake up thrice per second, on AC power.

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
    nan    0.000000           0        40           read
    nan    0.000000           0        40           write
    nan    0.000000           0         2           time
    nan    0.000000           0        29           ioctl
    nan    0.000000           0        53           gettimeofday
    nan    0.000000           0        29           poll
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                   193           total


Well, there's quite nothing to conclude. These numbers are just here so that people can easily test and compare with their GNOME version, and eventually find more culprits. I think I'll update them on each GNOME Release, so we can see if the plan to conquer the world with power-friendly software works out. Just as a remark, developers who use timers at the second scale should consider using the g_timeout_add_seconds call that was added in glib 2.14, as it allows to group processing of wakeup requests. So if your application can depend on glib 2.14, go for it.

lundi 26 novembre 2007

Tacle en règle (?)

Si vous ne l'avez pas encore lu, lisez le dernier billet de Murray Cumming. J'attends. Bon, il semble qu'il y a réellement un problème entre ces deux là, et le fait que Jeff soit candidat au Foundation Board justifie un peu ce message, bien que la forme est assez "extrême". Ce qui est moins justifié c'est que Murray dit "des gens", sans qu'on sache combien ils sont à trouver que Jeff fait du mauvais boulot, et surtout, que les commentaires soient fermés (ce qui j'imagine va créer un droit de réponse par blog interposé).

Ma question : certains d'entre vous connaissent bien l'un ou l'autre (voire les deux) d'entre ces messieurs (Dodji, Vincent, les autres ?), avez vous un point de vue sur la question, un éclairage particulier ? N'étant pas membre, je n'ai pas le droit de vote à cette élection, donc sur ce plan là je suis neutre. Mais j'aimerais savoir comment l'abcès a pu grossir à ce point avant qu'il ne crève. Le logiciel libre ce n'est pas le monde des bisounours, certes, mais comment peut on en arriver là ? Que les propos de Murray soient justifiés ou pas, je suis choqué...

mercredi 30 mai 2007

Quoi de neuf docteur ?

Pfff...  Ça fait un moment que je n'ai pas des masses avancé sur GNOME...  J'ai bien essayé de relancer les GNOME Goals, mais c'est un peu dur de créer une synergie, et j'ai eu pas mal de pépins au moment où je l'ai fait. Par ailleurs, ce bug m'empêche d'ouvrir un nouveau GNOME Goal. Alors la situation est pour ainsi dire bloquée, et dans la liste des prétendants, il n'y en a pas vraiment qui soient aussi plaisant ni aboutis (ni simples, d'ailleurs).

Ensuite, toujours mes problèmes de redirection mail, dûs à, ce qui fait que je n'ai reçu aucune des réponses à mes questions... Je n'ai reçu aucun des mails envoyé sur cette adresse pendant 12 jours ! Bon, je suis allé voir les archives mail en ligne, mais c'est un peu lourd (impossible de répondre à un commentaire précis).

Ma copine s'est aussi installée à la maison, alors ça bouffe pas mal de temps (mais je ne m'en plains pas ;-) ).

Enfin, pas mal de boulot en ce moment. Mais comme c'est intéressant, je ne me plains pas. C'est d'ailleurs l'objet de mon prochain billet.

jeudi 24 mai 2007

Transmission, le client bittorrent pour GNOME

Le mois dernier, Adam avait brêvement parlé de Transmission, un client bittorrent basé sur GTK. Commençant à être passablement échauffé par les nombreuses imperfections de l'interface du client bittorrent officiel, je me suis laissé tenter. Grand bien m'en a pris ! J'en suis presque à me demander pourquoi il ne fait pas partie du bureau GNOME. D'ailleurs serait-ce possible, ou le spectre de l'illégalité dans certains pays poserait-t-il problèmes. Bref.

Si vous cherchez un client bittorrent sous GNOME, n'allez pas plus loin, Transmission est celui qu'il vous faut !

Je vous rappelle donc comme il l'a précédemment annoncé que Transmission pour Mandriva 2007.1 est disponible dans la source contrib/backports.

mardi 24 avril 2007

GNOME Goal: Install theme-friendly icons

The "Install theme-friendly icons" GNOME goal is currently going on. This one had previously been announced, and partially completed, but the guidelines were buggy. So if you are a brave hacker-wanabe, and you are interested in helping the GNOME Desktop to improve its consistency, then here's a task for you !

Spread the word about this goal !

Hopefully, Brian Pepple has started to squash these dirty bugs, but he definitely needs your help ! On the best case, a simple 3 lines patch will be enough, so you can learn how to submit your first patch. On the (other) best case, the whole task needs to be completed, and you can then learn how to make an application behave nice with icon themes, so that a theme can override the application's icon.

So thank you Brian, and if you, reader, have some spare time, help Brian to improve consistency in the GNOME Desktop !

lundi 16 avril 2007

Re: a way to get more GNOME hackers

Alberto, here are some hints if you want to improve this part of GNOME (ie, reduce the technical level needed by newcommers to just become jhbuild users).

- Create a standard .jhbuildrc for newbies.
Look at
But a jhbuildrc is a bit distro dependant... For example, I maintain the Mandriva subsection:

- Create a metapackage gnome-jhbuild-essentials:
This may not work, as dependencies vary from each GNOME version to build. You'll need a gnome-2.16-jhbuild-essentials and a gnome-2.18-jhbuild-essentials.

- Create a page on the wiki for newcomers, explaining howto setup the enviroment, play with module sets, and create a patch.
I was working on a new jhbuild guide this some time ago, but didn't finish it, so you can modify it if you want.
For patches, a patch submission guide exists, but needs some update for the cvs->svn migration:
Relevant content of Elijah's guidelines need also to be imported, as this kind of info should now be centralized in the wiki (Elijah was ok with this, I talked to him about that at last GUADEC).

Check also:

Enjoy ;-)

samedi 7 avril 2007

Number of the day: 185 !

This is the number of lines in the code shipped with GNOME 2.18 that use a deprecated symbol in GLib. The winner, by far, is g_strcasecmp.

at-spi/test/test-simple.c:766:        if (!g_strcasecmp (argv [i], "--poke"))
evolution-data-server/calendar/libecal/e-cal-time-util.c:425: * This is analogous to g_date_set_time() but takes the timezone into account.
evolution-data-server/libedataserver/e-memory.c:1219:    GMemChunk *gmc;
evolution-data-server/libedataserver/e-memory.c:1273:    gmc = g_mem_chunk_new("memchunk", CHUNK_SIZE, CHUNK_SIZE*CHUNK_COUNT, G_ALLOC_AND_FREE);
evolution-data-server/libedataserver/e-memory.c:1275:        mem = g_mem_chunk_alloc(gmc);
evolution-data-server/libedataserver/e-memory.c:1277:            g_mem_chunk_free(gmc, mem);
evolution-data-server/libedataserver/e-memory.c:1280:    g_mem_chunk_destroy(gmc);
evolution-data-server/libedataserver/e-memory.c:1293:    gmc = g_mem_chunk_new("memchunk", CHUNK_SIZE, CHUNK_COUNT*CHUNK_SIZE, G_ALLOC_ONLY);
evolution-data-server/libedataserver/e-memory.c:1295:        mem = g_mem_chunk_alloc(gmc);
evolution-data-server/libedataserver/e-memory.c:1298:    g_mem_chunk_destroy(gmc);
gail/tests/testlib.c:116:      if (g_strcasecmp(name, gtk_widget_get_name(GTK_WIDGET (widget))) == 0)
gail/tests/testlib.c:139:          if (g_strcasecmp(name, gtk_widget_get_name(GTK_WIDGET (widget))) == 0)
gail/tests/testlib.c:185:  if (accessible_name && (g_strcasecmp(name, accessible_name) == 0))
gail/tests/testlib.c:205:      if (accessible_name && (g_strcasecmp(name, accessible_name) == 0))
gail/tests/testtable.c:264:    g_string_sprintf(out_desc, "new column description %d", i);
gail/tests/testtable.c:295:    g_string_sprintf(out_desc, "new row description %d", i);
gail/tests/testtextlib.c:543:      if (g_strcasecmp(param_string2, "ATK_XY_SCREEN") == 0)
gail/tests/testtextlib.c:551:      else if (g_strcasecmp(param_string2, "ATK_XY_WINDOW") == 0)
gail/tests/testtextlib.c:573:      if (g_strcasecmp(param_string3, "ATK_XY_SCREEN") == 0)
gail/tests/testtextlib.c:582:      else if (g_strcasecmp(param_string3, "ATK_XY_WINDOW") == 0)
gail/gail/gailtextview.c:1075:      if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_LEFT_MARGIN)))
gail/gail/gailtextview.c:1078:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_RIGHT_MARGIN)))
gail/gail/gailtextview.c:1081:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_INDENT)))
gail/gail/gailtextview.c:1084:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_PIXELS_ABOVE_LINES)))
gail/gail/gailtextview.c:1087:      else if (!g_strcasecmp(name, atk_text_attribute_get_name (ATK_TEXT_ATTR_PIXELS_BELOW_LINES)))
gail/gail/gailtextview.c:1090:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP)))
gail/gail/gailtextview.c:1093:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_SIZE)))
gail/gail/gailtextview.c:1096:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_RISE)))
gail/gail/gailtextview.c:1099:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_WEIGHT)))
gail/gail/gailtextview.c:1102:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_BG_FULL_HEIGHT)))
gail/gail/gailtextview.c:1105:                   (g_strcasecmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_BG_FULL_HEIGHT, 0))),
gail/gail/gailtextview.c:1109:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_LANGUAGE)))
gail/gail/gailtextview.c:1112:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_FAMILY_NAME)))
gail/gail/gailtextview.c:1115:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_EDITABLE)))
gail/gail/gailtextview.c:1118:                   (g_strcasecmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_EDITABLE, 0))),
gail/gail/gailtextview.c:1122:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_INVISIBLE)))
gail/gail/gailtextview.c:1125:                   (g_strcasecmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_EDITABLE, 0))),
gail/gail/gailtextview.c:1129:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_UNDERLINE)))
gail/gail/gailtextview.c:1133:              if (!g_strcasecmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_UNDERLINE, j)))
gail/gail/gailtextview.c:1141:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_STRIKETHROUGH)))
gail/gail/gailtextview.c:1144:                   (g_strcasecmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_STRIKETHROUGH, 0))),
gail/gail/gailtextview.c:1148:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_BG_COLOR)))
gail/gail/gailtextview.c:1158:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_FG_COLOR)))
gail/gail/gailtextview.c:1168:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_STRETCH)))
gail/gail/gailtextview.c:1172:              if (!g_strcasecmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_STRETCH, j)))
gail/gail/gailtextview.c:1180:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_JUSTIFICATION)))
gail/gail/gailtextview.c:1184:              if (!g_strcasecmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_JUSTIFICATION, j)))
gail/gail/gailtextview.c:1192:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_DIRECTION)))
gail/gail/gailtextview.c:1196:              if (!g_strcasecmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_DIRECTION, j)))
gail/gail/gailtextview.c:1204:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_VARIANT)))
gail/gail/gailtextview.c:1208:              if (!g_strcasecmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_VARIANT, j)))
gail/gail/gailtextview.c:1216:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_WRAP_MODE)))
gail/gail/gailtextview.c:1220:              if (!g_strcasecmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_WRAP_MODE, j)))
gail/gail/gailtextview.c:1228:      else if (!g_strcasecmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_STYLE)))
gail/gail/gailtextview.c:1232:              if (!g_strcasecmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_STYLE, j)))
gail/gail/gailtextcell.c:261:          g_strcasecmp (text_cell->cell_text, new_cache))
gail/gail/gailcell.c:400:      if (!g_strcasecmp (((ActionInfo *)(list_node->data))->name, action_name))
gconf/gconf/testclient.c:93:  loop = g_main_new(TRUE);
gconf/gconf/testclient.c:97:  g_main_run(loop);
gconf/gconf/testclient.c:101:  g_main_destroy(loop);
gnome-applets/gswitchit/gswitchit-applet.c:530:                      g_strcasecmp ("XKB",
gnome-control-center/archiver/archive.c:380:    g_tree_traverse (archive->locations,
gnome-control-center/archiver/archive.c:720:    g_tree_traverse (archive->locations,
gnome-control-center/capplets/url-properties/url-properties.c:192:      if (!g_strcasecmp(key, "default"))
gnome-control-center/capplets/url-properties/url-properties.c:244:    if (!g_strcasecmp(prot, col1)) {
gnome-control-center/capplets/url-properties/url-properties.c:265:    if (!g_strcasecmp(prot, col1)) {
gnome-control-center/capplets/background/gnome-wp-xml.c:33:    if (!g_strcasecmp ((gchar *)prop, "true") || !g_strcasecmp ((gchar *)prop, "1")) {
gnome-control-center/libslab/document-tile.c:149:    g_date_set_time (time_stamp, modified);
gnome-media/cddb-slave2/iochannel.c:62:      if ((error = g_io_channel_write(channel, ptr, nleft, &nwritten))
gnome-media/cddb-slave2/iochannel.c:119:      if ((error = g_io_channel_read(channel, ptr, nleft, &nread))
gnome-menus/libmenu/canonicalize.c:238:  if (allow_missing_basename && retval == NULL)
gnome-netstatus/src/netstatus-sysdeps.c:547:  if (g_strncasecmp (iface, "an",   2) &&
gnome-netstatus/src/netstatus-sysdeps.c:548:      g_strncasecmp (iface, "wi",   2) &&
gnome-netstatus/src/netstatus-sysdeps.c:549:      g_strncasecmp (iface, "ath",  3) &&
gnome-netstatus/src/netstatus-sysdeps.c:550:      g_strncasecmp (iface, "ndis", 4) &&
gnome-netstatus/src/netstatus-sysdeps.c:551:      g_strncasecmp (iface, "ipw",  3) &&
gnome-netstatus/src/netstatus-sysdeps.c:552:      g_strncasecmp (iface, "iwi",  3) &&
gnome-netstatus/src/netstatus-sysdeps.c:553:      g_strncasecmp (iface, "acx",  3))
gnome-netstatus/src/netstatus-sysdeps.c:556:  if (g_strncasecmp (iface, "an", 2) == 0)
gnome-nettool/src/callbacks.c:236:        if (g_strcasecmp (text, "") != 0)
gnome-nettool/src/callbacks.c:246:        if (g_strcasecmp (text, "") != 0)
gnome-session/gnome-session/startup-programs.c:137:            if (g_strcasecmp (only_show_in_list[i], "GNOME") == 0)
gnome-session/gnome-session/startup-programs.c:160:            if (g_strcasecmp (not_show_in_list[i], "GNOME") == 0)
gnome-session/gnome-session/save.c:427:                    if (g_strcasecmp (only_show_in_list[i], "GNOME") == 0)
gnome-session/gnome-session/save.c:451:                    if (g_strcasecmp (not_show_in_list[i], "GNOME") == 0)
gnome-session/gnome-session/gsm-gsd.c:88:  if (!g_strcasecmp (name, "org.gnome.SettingsDaemon"))
gnome-session/gnome-session/gsm-gsd.c:91:      if (!g_strcasecmp ("", new_owner))
gnome-speech/gnome-speech/speaker.c:107:        if (!g_strcasecmp (name, p->name))
gnome-speech/drivers/eloquence/eloquencespeaker.c:387:        if (!g_strcasecmp (voice_spec->name, name))
gnome-utils/logview/logview.c:250:    if (selected!=NULL && g_strncasecmp (log->name, selected, -1)==0)
gok/gok/create-branching-keyboard.c:96:    g_io_channel_close (kbd->io);
gok/gok/main.c:527:    returncode = g_strcasecmp(a_file, b_file);
gok/gok/main.c:1662:            if (g_strcasecmp (pKB->Name, NameKeyboard) == 0)
gok/gok/gok-scanner.c:1769:        if (g_strcasecmp (pAccessMethod->Name, NameAccessMethod) == 0)
gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c:302:  if (g_strcasecmp (delivery_method, "inline")) {
gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c:304:  } else if (g_strcasecmp (delivery_method, "in_band")) {
gst-plugins-good/gst/rtp/gstrtpilbcpay.c:133:  if (g_strcasecmp ("audio/x-iLBC", payload_name) == 0) {
gst-plugins-good/gst/rtp/gstrtptheoradepay.c:302:  if (g_strcasecmp (delivery_method, "inline")) {
gst-plugins-good/gst/rtp/gstrtptheoradepay.c:304:  } else if (g_strcasecmp (delivery_method, "in_band")) {
gstreamer/tests/old/testsuite/caps/intersection.c:60:     g_mem_chunk_info ();
gstreamer/tests/old/testsuite/caps/intersection.c:65:     g_mem_chunk_info ();
gstreamer/tests/old/testsuite/plugin/loading.c:15:  g_mem_chunk_info ();
gstreamer/tests/old/testsuite/plugin/loading.c:33:  g_mem_chunk_info ();
gstreamer/tests/old/testsuite/plugin/loading.c:52:  g_mem_chunk_info ();
gtk+/gtk/gtkfilechoosersettings.c:57:get_config_dirname (void)
gtk+/gtk/gtkfilechoosersettings.c:566:      dirname = get_config_dirname ();
libbonoboui/tools/browser/oaf-helper.c:41:                if (!g_strcasecmp (property_name, property->property_name) &&
libbonoboui/tools/browser/oaf-helper.c:346:        if (g_strcasecmp (prop->property_name, "repo_ids") == 0) {
libglade/test/domp.c:50:    g_hash_table_freeze(tree->hash);
libglade/test/domp.c:55:    g_hash_table_thaw(tree->hash);
libglade/test/saxp.c:398:        g_string_sprintfa(state->style_data, "  font = "%s"n",
libglade/test/saxp.c:403:        g_string_sprintfa(state->style_data,
libglade/test/saxp.c:412:        g_string_sprintfa(state->style_data,
libglade/test/saxp.c:421:        g_string_sprintfa(state->style_data,
libglade/test/saxp.c:430:        g_string_sprintfa(state->style_data,
libglade/test/saxp.c:437:        g_string_sprintfa(state->style_data, "  bg_pixmap[%s] = "%s"n",
libgnomeprint/libgnomeprint/gnome-font-face.c:611:        if (!g_strcasecmp (family, entry->familyname)) {
libgnomeprint/libgnomeprint/gnome-fontmap.c:576:    return g_strcasecmp (((GPFontEntry *) a)->name, ((GPFontEntry *) b)->name);
libgnomeprint/libgnomeprint/gnome-fontmap.c:587:    return g_strcasecmp (((GPFontEntry *) a)->speciesname, ((GPFontEntry *) b)->speciesname);
libgnomeprint/libgnomeprint/gnome-fontmap.c:593:    return g_strcasecmp (((GPFamilyEntry *) a)->name, ((GPFamilyEntry *) b)->name);
librsvg/rsvg-styles.c:1371:    data = g_chunk_new (RsvgState, ctx->state_allocator);
librsvg/rsvg-styles.c:1393:    g_mem_chunk_free (ctx->state_allocator, dead_state);
librsvg/rsvg-base.c:1033:    g_mem_chunk_free (ctx->state_allocator, data);
librsvg/rsvg-base.c:1047:    g_mem_chunk_destroy (handle->state_allocator);
librsvg/rsvg-base.c:1227:    ctx->state_allocator = g_mem_chunk_create (RsvgState, 256, G_ALLOC_AND_FREE);
librsvg/test-display.c:42:_rsvg_basename (const char *file)
librsvg/test-display.c:300:    base_name = _rsvg_basename (info->base_uri);
librsvg/test-display.c:351:    base_name = _rsvg_basename (info->base_uri);
librsvg/gtk-engine/svg-rc-style.c:727:      g_scanner_freeze_symbol_table(scanner);
librsvg/gtk-engine/svg-rc-style.c:732:      g_scanner_thaw_symbol_table(scanner);
librsvg/rsvg-cairo-render.c:96:    draw->state_allocator = g_mem_chunk_create (RsvgState, 256, G_ALLOC_AND_FREE);
libsoup/tests/dict.c:84:    g_main_quit (loop);
libsoup/tests/dict.c:160:    g_main_run (loop);
libsoup/tests/dns.c:59:    g_main_run (loop);
libsoup/tests/get.c:175:        g_main_quit (loop);
libsoup/tests/get.c:303:    g_main_run (loop);
libsoup/tests/getbug.c:63:    g_main_quit (loop);
libsoup/tests/getbug.c:133:    g_main_run (loop);
libsoup/libsoup/soup-session-async.c:218:        g_main_iteration (TRUE);
libsoup/libsoup/soup-server-auth.c:434:            g_string_sprintfa (str,
libsoup/libsoup/soup-server-auth.c:438:        g_string_sprintfa (str,
libsoup/libsoup/soup-server-auth.c:444:            g_string_sprintfa (str, "qop="auth-int", ");
libsoup/libsoup/soup-server-auth.c:446:            g_string_sprintfa (str, "qop="auth,auth-int", ");
libsoup/libsoup/soup-server-auth.c:449:            g_string_sprintfa (str, "algorithm="MD5-sess"");
libsoup/libsoup/soup-server-auth.c:451:            g_string_sprintfa (str, "algorithm="MD5"");
libsoup/libsoup/soup-uri.c:292:        g_string_sprintfa (str, "%s:", soup_protocol_name (uri->protocol));
metacity/src/delete.c:505:              g_strcasecmp (w->res_class, "metacity-dialog") == 0)
nautilus/libnautilus-private/nautilus-file.c:3045:    g_date_set_time (today, time (NULL));
ORBit2/test/echo-local.c:129:    g_blow_chunks();
ORBit2/test/everything/client.c:1960:        g_main_iteration (TRUE);
pango/pango-view/viewer-win32.c:499:      if (0 == g_strcasecmp(pango_font_family_get_name(families[i]), family_name))
pkg-config-0.20/parse.c:1082:      pkg->pcfiledir = g_dirname (path);
seahorse/agent/seahorse-agent-cache.c:85:static GMemChunk *g_memory = NULL;      /* Memory for sa_cache_t's */
seahorse/agent/seahorse-agent-cache.c:217:        g_chunk_free (it, g_memory);
seahorse/agent/seahorse-agent-cache.c:247:    g_memory = g_mem_chunk_create (SeahorseAgentPassReq, 128, G_ALLOC_AND_FREE);
seahorse/agent/seahorse-agent-cache.c:268:        g_mem_chunk_destroy (g_memory);
seahorse/agent/seahorse-agent-cache.c:405:        it = g_chunk_new (sa_cache_t, g_memory);
seahorse/agent/seahorse-agent-actions.c:39:static GMemChunk *g_memory = NULL;      /* Allocator for SeahorseAgentPassReq items */
seahorse/agent/seahorse-agent-actions.c:79:    g_memory = g_mem_chunk_create (SeahorseAgentPassReq, 128, G_ALLOC_AND_FREE);
seahorse/agent/seahorse-agent-actions.c:94:        g_mem_chunk_destroy (g_memory);
seahorse/agent/seahorse-agent-actions.c:129:    pr = g_chunk_new (SeahorseAgentPassReq, g_memory);
seahorse/agent/seahorse-agent-actions.c:158:    g_chunk_free (pr, g_memory);
seahorse/agent/seahorse-agent-io.c:70:static GMemChunk *g_memory = NULL;      /* Memory for connections */
seahorse/agent/seahorse-agent-io.c:204:    g_chunk_free (cn, g_memory);
seahorse/agent/seahorse-agent-io.c:643:    cn = g_chunk_new0 (SeahorseAgentConn, g_memory);
seahorse/agent/seahorse-agent-io.c:683:    g_memory = g_mem_chunk_create (SeahorseAgentConn, 8, G_ALLOC_AND_FREE);
seahorse/agent/seahorse-agent-io.c:706:        g_mem_chunk_destroy (g_memory);
seahorse/daemon/seahorse-hkp-server.c:322:    if (t && g_strcasecmp(t, "on") == 0)
seahorse/daemon/seahorse-hkp-server.c:443:    else if(g_strcasecmp(t, "index") == 0)
seahorse/daemon/seahorse-hkp-server.c:446:    else if(g_strcasecmp(t, "vindex") == 0)
seahorse/daemon/seahorse-hkp-server.c:449:    else if(g_strcasecmp(t, "get") == 0)
seahorse/src/seahorse-gkeyring-item.c:70:        if (g_strcasecmp (name, attr->name) == 0 &&
seahorse/src/seahorse-gkeyring-item.c:90:    return protocol && g_strncasecmp (protocol, match, strlen (match)) == 0;
seahorse/src/seahorse-gkeyring-item.c:534:        if (g_strcasecmp (name, attr->name) == 0 &&
seahorse/plugins/nautilus/seahorse-tool-progress.c:81:    else if (g_strcasecmp (args[0], CMD_BLOCK) == 0)
seahorse/plugins/nautilus/seahorse-tool-progress.c:84:    else if (g_strcasecmp (args[0], CMD_UNBLOCK) == 0) {
seahorse/plugins/nautilus/seahorse-tool-progress.c:89:    else if (g_strcasecmp (args[0], CMD_PROGRESS) == 0) {
seahorse/libseahorse/seahorse-util.c:187:    g_date_set_time (created_date, time);
seahorse/libseahorse/seahorse-dns-sd.c:121:        if (g_strcasecmp (HKP_SERVICE_TYPE, type) != 0)
seahorse/libseahorse/seahorse-dns-sd.c:168:    if (g_strcasecmp (HKP_SERVICE_TYPE, type) != 0)
totem/src/backend/bacon-video-widget-gst-0.10.c:4864:      g_date_set_time (&d, time (NULL));
yelp/src/info2html/html.c:149:      if (g_strcasecmp(ref, "(dir)")) {
zenity/src/tree.c:153:        if (strcmp (g_strdown (zenity_util_strip_newline (string->str)), "true") == 0)
zenity/src/tree.c:231:        if (strcmp (g_strdown ((gchar *) args[i+j]), "true") == 0)
zenity/src/tree.c:305:    if (strcmp (g_strdown (tree_data->print_column), "all") == 0)

mercredi 28 mars 2007

Sysprof sous Mandriva 2007.0

Sysprof est un logiciel de profiling: il permet de voir les fonctions qui utilisent le plus de temps CPU dans un programme. C'est le logiciel recommandé par GNOME pour vérifier les performances d'une application. Malheureusement, il semble que le logiciel ne peut être installé sous Mandriva 2007.0, à causes de problèmes de dépendances.

Pour ceux que cela intéresse, j'ai recompilé sysprof 1.0.8 à partir du RPM source de la Mandriva 2007.1, pour qu'il soit utilisable sous Mandriva 2007.0. N'oubliez pas aussi d'installer dkms, et les sources de votre version du kernel (kernel-source ou kernel-source-stripped). Un petit modprobe sysprof-module en root sera sans doute aussi nécessaire...

Vous trouverez là sysprof 1.0.8 (i586) pour Mandriva 2007.0.

mardi 27 mars 2007

Oisiweb: Comment afficher une chaine de caractères avec des accents ?

Cher oisiweb (oisif+web, traduction libre de lazyweb),
je me sens actuellement désoeuvré devant ce problème qui semble pourtant simple: afficher des caractères accentués dans mon programme en mode texte.

C'est un programme d'une extrême complexité, je te laisse juger:

#include <glib.h>
int main (void)
return 0;
Pourtant, que le fichier soit enregistré en iso-8859-1 ou en utf8, pas d'accents. J'ai essayé aussi les entêtes spéciaux (coding cookie):
/* -*-coding: utf-8; -*- */
J'ai aussi essayé l'option -finput-charset de gcc, mais non, je n'obtiens aucun résultat concluant. Alors cher oisiweb, aurais tu la solution à ce problème ?

Update 1:
D'après les exemples du guide officiel du développeur GNOME, j'ai vu un cas qui fonctionnait.
Fichier en UTF8, coding cookie en entête, et c'est magique, ça marche. Quelle est la différence entre mon exemple et les siens ? Le coding cookie ? Non, en l'enlevant, on obtient le même résultat, c'était sans doute nécessaire en 2003-2004 pour aider gcc à trouver l'encodage du fichier, mais apparemment plus maintenant.

Non en fait, la différence c'est qu'il appelle gtk_init dans son exemple. Mais pourquoi diable doit-on se lier à GTK pour une appli non graphique, juste pour avoir des traces en français (besoin de mon employeur) ? Si quelqu'un a une réponse, ou un autre moyen, je suis preneur...

Update 2:

Effectivement, comme l'indique Pascal dans les commentaires, il semble que ce soit un appel à setlocale qui soit a cause de mes soucis. Comme l'indique la documentation de gtk_set_locale, gtk_init appelle gtk_set_locale qui appelle setlocale(LC_ALL, "").
C'est cette dernière fonction qui va vérifier la locale utilisée, et ainsi affecter toutes les fonctions d'affichage.

La version corrigée de mon programme de test est donc:
#include <glib.h>
#include <locale.h>
int main (void)
setlocale(LC_ALL, "");
return 0;

GNOME lack of documentation

GNOME lacks documentation. Everyone knows it. Sure. But we are in 2007 and there are still people starting to learn GNOME by starting with CORBA.

Moreover, the book about GNOME the most pointed out to learn GNOME is "The Official GNOME 2 Developer's guide". I've just learned today that this book uses a (mostly) free licence: it uses the Creative Commons NonCommercial-ShareAlike 1.0 licence. However, it seems there is no online version of this book (p2p excepted, I heard). This means no one can correct the book that is beginning to become a bit outdated, thanks to project Ridley and other things. Also, I've bought this book, but I don't have any electronic version to search information in it, which is also quite a bit annoying.

I just hope that the upcoming project, and that the revamp that Quim Gil is leading will help newbies with that, so that they can easily know where to start, what is up to date, and what is updated....

mardi 20 mars 2007

GNOME 2.18 on Mandriva 2007.0 with jhbuild

GNOME 2.18 has been released a few days ago. However, I still haven't seen it running.... I'm too lazy to download Foresight Linux, and it seems that the Mandriva One with GNOME 2.18 is only available for x86_64 users... Too bad for my Athlon XP 3000+.

Anyway, I just achieved to compile almost the whole GNOME desktop from jhbuild tonight. Only a few modules are missing, some because they are hard to compile with 2007.0 (NetworkManager, network-manager-applet), others just because I just don't care about them (mozilla, evolution-exchange, libexchange). Mozilla in particular is so huge that I just always skip it.

For the braves that will dare to compile the GNOME desktop on their Mandriva 2007.0, I have just updated my guidelines about the jhbuild dependencies for GNOME on Mandriva Linux.


vendredi 2 mars 2007

Un nouveau spammeur sur planète GNOME-FR !

Bonjour à tous les lecteurs de planète GNOME-FR !

Vincent m'a permis de vous rejoindre pour votre plus grand bonheur, ce qui a provoqué une quantité non négligeable de spam sur la planète... Je m'en excuse, n'ayant pas trop de contrôle sur ce point. J'en ai même profité pour introduire par la même occasion mon premier troll politique, bien involontairement également (ce post là n'était pas censé se retrouver ici !).

Pour ce qui ne me connaissent pas (et il doit y en avoir un paquet), je vous renvois à mon billet d'introduction. Autrement, je traine en ce moment mes guêtres du côté d'Ekiga, au niveau de la migration à GTK+ 2.10. Et puis j'ai un petit projet qui arrivera peut être après ça, si j'ai un peu plus avancé côté professionnel (c'est à dire si je suis moins à la bourre sur mon projet). Mais chut, ne le dites à personne.

jeudi 15 février 2007

Plein de choses à dire...

Et pas assez de temps... Du sommeil en retard... Du boulot... et puis un (petit) patch pour GNOME. Il m'aura quand même fallu 3 mois pour me décider à me replonger dedans. Oui je sais. Mais bon, comme le FOSDEM approche, j'avais peur d'avoir mauvaise conscience :-) en voyant Damien.

mercredi 24 janvier 2007

GNOME tip of the day

Avoiding turning your screen on to raise/lower sound on your computer.

I have a CRT screen at home. When I listen to some music without being in front of the computer, I turn the screen off, to avoid useless power consumption. However, I don't like using my speakers' buttons to regulate the sound level. I prefer to do it by software, but i'd need to turn the screen on again to do that.

So here is my GNOME tip of the day:

Step 1: move your mixer applet to one corner
So I moved the mixer applet at the top right corner of my desktop (works for every corner). For that, you need to unlock the mixer applet and every applet that would prevent it from going on the destop corner. To move the applet, use the traditionnal middle mouse drag-and-drop.

Step 2: turn your screen off

Step 3: move you mouse trying to go to the corner were you put the mixer applet

Step 4: roll your mouse wheel up or down to raise/lower the sound.

page 2 de 2 -