Phillip Pearson - web + electronics notes

tech notes and web hackery from a new zealander who was vaguely useful on the web back in 2002 (see: python community server, the blogging ecosystem, the new zealand coffee review, the internet topic exchange).

2008-6-4

Hacking Pidgin to only flash the tray icon when your nick is mentioned in a chat

Pidgin is awesome - it's a cross-platform IM client (I'm running it on Windows) for pretty much every IM network except Skype. One thing I've wanted to change for a while is the 'blink window on received message' function; many of my coworkers are using Adium or iChat or some other OS X app that only tries to grab your attention if (a) you receive a personal IM, or (b) your username is mentioned in a chat.

Here are some notes about the process, to refresh my memory if I come back to this in a few months' time, or maybe to help others get into the Pidgin code, if anyone is working in a similar area...

It's surprisingly easy (for a project with so many dependencies) to get up and running with a build environment on Windows. Once you've got Cygwin installed, there's a script that will fetch all the build deps and the latest source for you, then you're ready to go with make -f Makefile.mingw install.

There are two hooks that result in the window being flashed; the prefs (see prefs.xml in your .purple directory) are called /pidgin/win32/blink_im (which, if set, blinks the window when you get a private message) and /plugins/gtk/purplerc/win32/winprefs/chat_blink (which, if set, blinks the window when you get a message in a chat). Not sure why one is a main Pidgin setting and one is inside the gtk plugin, but there you go.

The Tools | Preferences | Conversations | Flash window when IMs are received option is set in pidgin/gtkprefs.c.

The Tools | Plugins | Windows Pidgin Options | Flash window when chat messages are received option is set in pidgin/plugins/win32/winprefs/winprefs.c. I wonder if this could be moved into the Conversations config pane?

Another interesting option is Tools | Preferences | Sounds | Someone says your username in chat (set in finch/gntsound.c and pidgin/gtksound.c), which plays a sound when someone says your name. I normally work with sounds turned off, though.

Here's my patch to add an option to the Windows plugin to flash the window when your username is mentioned. I also get it to flash the window if someone says phil, myelin or pearsonp; you'll probably want to remove that bit from the patch.

diff -r pidgin-2.4.2/pidgin/plugins/win32/winprefs/winprefs.c ../pidgin-2.4.2/pidgin/plugins/win32/winprefs/winprefs.c
58a59
> static const char *PREF_CHAT_BLINK_NAME = "/plugins/gtk/win32/winprefs/chat_blink_name";
236c237,249
< if(purple_prefs_get_bool(PREF_CHAT_BLINK))
---
> if(purple_prefs_get_bool(PREF_CHAT_BLINK_NAME)) {
> PurpleConvChat *chat = purple_conversation_get_chat_data(conv);
> purple_debug_info("winprefs", "Received a message from %s (I am %s, nick %s): %s\n", who, account->username, chat->nick, *message);
>
> if((account->username != NULL && purple_utf8_has_word(*message, account->username))
> || (chat != NULL && chat->nick != NULL && purple_utf8_has_word(*message, chat->nick))
> || purple_utf8_has_word(*message, "phil")
> || purple_utf8_has_word(*message, "myelin")
> || purple_utf8_has_word(*message, "pearsonp")) {
> purple_debug_info("winprefs", "Chat message contains a string we're looking for: blinking window.\n");
> winpidgin_conv_blink(conv, flags);
> }
> } else if(purple_prefs_get_bool(PREF_CHAT_BLINK))
342a356,357
> pidgin_prefs_checkbox(_("_Flash window when your username is mentioned in a chat message"),
> PREF_CHAT_BLINK_NAME, vbox);

... more like this: []