Mercurial > pidgin
annotate plugins/statenotify.c @ 12468:6faefbebcd24
[gaim-migrate @ 14778]
SF Patch #1372898 from charkins
"This patch updates the unseen conversation api in
gtkconv to ensure consistancy and avoid code
duplication. The ...first_unseen() function is renamed
and expanded to return a list of conversations that
match the specified criteria. A max_count parameter is
used to allow this to short circuit early (using 1
gives old behavior). An additional flag was added to
allow this function to only consider hidden
conversations (used by the buddy list). The blist is
currently inconsistant in which conversations it loops
over for showing the menu tray icon, creating the
tooltip and the unseen menu. This patch fixes that.
The ...find_unseen_list() now handles contact-aware
conversations correctly as well (based on sadrul's
patches in #1362579 which are obsoleted by this patch).
I also included the fix from #1362579 which increments
unseen_count only when state>=UNSEEN_TEXT."
committer: Tailor Script <tailor@pidgin.im>
| author | Richard Laager <rlaager@wiktel.com> |
|---|---|
| date | Mon, 12 Dec 2005 18:59:29 +0000 |
| parents | cb73483c9f63 |
| children | e856f985a0b9 |
| rev | line source |
|---|---|
|
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
1 #include "internal.h" |
|
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
2 |
|
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
3 #include "blist.h" |
|
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
4 #include "conversation.h" |
|
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
5 #include "debug.h" |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6441
diff
changeset
|
6 #include "signals.h" |
| 9943 | 7 #include "version.h" |
|
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
8 |
| 9583 | 9 #include "plugin.h" |
| 10 #include "pluginpref.h" | |
| 11 #include "prefs.h" | |
| 12 | |
| 13 #define STATENOTIFY_PLUGIN_ID "core-statenotify" | |
| 14 | |
| 5267 | 15 static void |
| 6695 | 16 write_status(GaimBuddy *buddy, const char *message) |
| 5267 | 17 { |
|
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5587
diff
changeset
|
18 GaimConversation *conv; |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6441
diff
changeset
|
19 const char *who; |
| 5267 | 20 char buf[256]; |
| 10167 | 21 char *escaped; |
| 5267 | 22 |
| 11338 | 23 conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, |
| 10246 | 24 buddy->name, buddy->account); |
| 5267 | 25 |
| 26 if (conv == NULL) | |
| 27 return; | |
| 28 | |
| 9620 | 29 who = gaim_buddy_get_alias(buddy); |
| 10167 | 30 escaped = g_markup_escape_text(who, -1); |
| 5267 | 31 |
| 10167 | 32 g_snprintf(buf, sizeof(buf), message, escaped); |
| 33 g_free(escaped); | |
| 5267 | 34 |
| 6982 | 35 gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL)); |
| 5267 | 36 } |
| 37 | |
| 38 static void | |
|
11935
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
39 buddy_status_changed_cb(GaimBuddy *buddy, GaimStatus *old_status, |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
40 GaimStatus *status, void *data) |
| 5267 | 41 { |
|
11935
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
42 gboolean available, old_available; |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
43 |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
44 available = gaim_status_is_available(status); |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
45 old_available = gaim_status_is_available(old_status); |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
46 |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
47 if (gaim_prefs_get_bool("/plugins/core/statenotify/notify_away")) { |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
48 if (available && !old_available) |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
49 write_status(buddy, _("%s is no longer away.")); |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
50 else if (!available && old_available) |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
51 write_status(buddy, _("%s has gone away.")); |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
52 } |
| 5267 | 53 } |
| 54 | |
| 55 static void | |
|
11935
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
56 buddy_idle_changed_cb(GaimBuddy *buddy, gboolean old_idle, gboolean idle, |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
57 void *data) |
| 5267 | 58 { |
|
11935
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
59 if (gaim_prefs_get_bool("/plugins/core/statenotify/notify_idle")) { |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
60 if (idle) { |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
61 write_status(buddy, _("%s has become idle.")); |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
62 } else { |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
63 write_status(buddy, _("%s is no longer idle.")); |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
64 } |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
65 } |
| 9583 | 66 } |
| 67 | |
| 11901 | 68 static void |
| 69 buddy_signon_cb(GaimBuddy *buddy, void *data) | |
| 70 { | |
| 71 if (gaim_prefs_get_bool("/plugins/core/statenotify/notify_signon")) | |
| 72 write_status(buddy, _("%s has signed on.")); | |
| 73 } | |
| 74 | |
| 75 static void | |
| 76 buddy_signoff_cb(GaimBuddy *buddy, void *data) | |
| 77 { | |
| 78 if (gaim_prefs_get_bool("/plugins/core/statenotify/notify_signon")) | |
| 79 write_status(buddy, _("%s has signed off.")); | |
| 80 } | |
| 81 | |
| 9583 | 82 static GaimPluginPrefFrame * |
| 83 get_plugin_pref_frame(GaimPlugin *plugin) | |
| 84 { | |
| 85 GaimPluginPrefFrame *frame; | |
| 86 GaimPluginPref *ppref; | |
| 87 | |
| 88 frame = gaim_plugin_pref_frame_new(); | |
| 89 | |
| 9648 | 90 ppref = gaim_plugin_pref_new_with_label(_("Notify When")); |
| 9583 | 91 gaim_plugin_pref_frame_add(frame, ppref); |
| 92 | |
| 9648 | 93 ppref = gaim_plugin_pref_new_with_name_and_label("/plugins/core/statenotify/notify_away", _("Buddy Goes _Away")); |
| 9583 | 94 gaim_plugin_pref_frame_add(frame, ppref); |
| 10246 | 95 |
| 9648 | 96 ppref = gaim_plugin_pref_new_with_name_and_label("/plugins/core/statenotify/notify_idle", _("Buddy Goes _Idle")); |
| 9583 | 97 gaim_plugin_pref_frame_add(frame, ppref); |
| 10246 | 98 |
| 11901 | 99 ppref = gaim_plugin_pref_new_with_name_and_label("/plugins/core/statenotify/notify_signon", _("Buddy _Signs On/Off")); |
| 100 gaim_plugin_pref_frame_add(frame, ppref); | |
| 101 | |
| 9583 | 102 return frame; |
| 5267 | 103 } |
| 104 | |
| 105 static gboolean | |
| 106 plugin_load(GaimPlugin *plugin) | |
| 107 { | |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6441
diff
changeset
|
108 void *blist_handle = gaim_blist_get_handle(); |
|
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6441
diff
changeset
|
109 |
|
11935
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
110 gaim_signal_connect(blist_handle, "buddy-status-changed", plugin, |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
111 GAIM_CALLBACK(buddy_status_changed_cb), NULL); |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
112 gaim_signal_connect(blist_handle, "buddy-idle-changed", plugin, |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
113 GAIM_CALLBACK(buddy_idle_changed_cb), NULL); |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
114 gaim_signal_connect(blist_handle, "buddy-signed-on", plugin, |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
115 GAIM_CALLBACK(buddy_signon_cb), NULL); |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
116 gaim_signal_connect(blist_handle, "buddy-signed-off", plugin, |
|
cb73483c9f63
[gaim-migrate @ 14226]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11901
diff
changeset
|
117 GAIM_CALLBACK(buddy_signoff_cb), NULL); |
| 5267 | 118 |
| 119 return TRUE; | |
| 120 } | |
| 121 | |
| 9583 | 122 static GaimPluginUiInfo prefs_info = |
| 123 { | |
| 124 get_plugin_pref_frame | |
| 125 }; | |
| 126 | |
| 5267 | 127 static GaimPluginInfo info = |
| 128 { | |
| 9943 | 129 GAIM_PLUGIN_MAGIC, |
| 130 GAIM_MAJOR_VERSION, | |
| 131 GAIM_MINOR_VERSION, | |
| 5267 | 132 GAIM_PLUGIN_STANDARD, /**< type */ |
| 133 NULL, /**< ui_requirement */ | |
| 134 0, /**< flags */ | |
| 135 NULL, /**< dependencies */ | |
| 136 GAIM_PRIORITY_DEFAULT, /**< priority */ | |
| 137 | |
| 9583 | 138 STATENOTIFY_PLUGIN_ID, /**< id */ |
| 5267 | 139 N_("Buddy State Notification"), /**< name */ |
| 140 VERSION, /**< version */ | |
| 141 /** summary */ | |
| 142 N_("Notifies in a conversation window when a buddy goes or returns from " | |
| 143 "away or idle."), | |
| 144 /** description */ | |
| 145 N_("Notifies in a conversation window when a buddy goes or returns from " | |
| 146 "away or idle."), | |
| 147 "Christian Hammond <chipx86@gnupdate.org>", /**< author */ | |
|
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6441
diff
changeset
|
148 GAIM_WEBSITE, /**< homepage */ |
| 5267 | 149 |
| 150 plugin_load, /**< load */ | |
| 151 NULL, /**< unload */ | |
| 152 NULL, /**< destroy */ | |
| 153 | |
| 154 NULL, /**< ui_info */ | |
| 8993 | 155 NULL, /**< extra_info */ |
| 9583 | 156 &prefs_info, /**< prefs_info */ |
| 8993 | 157 NULL |
| 5267 | 158 }; |
| 159 | |
| 160 static void | |
|
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5873
diff
changeset
|
161 init_plugin(GaimPlugin *plugin) |
| 5267 | 162 { |
| 9583 | 163 gaim_prefs_add_none("/plugins/core/statenotify"); |
| 164 gaim_prefs_add_bool("/plugins/core/statenotify/notify_away", TRUE); | |
| 165 gaim_prefs_add_bool("/plugins/core/statenotify/notify_idle", TRUE); | |
| 11901 | 166 gaim_prefs_add_bool("/plugins/core/statenotify/notify_signon", TRUE); |
| 5267 | 167 } |
| 168 | |
| 6063 | 169 GAIM_INIT_PLUGIN(statenotify, init_plugin, info) |
