Mercurial > pidgin.yaz
annotate plugins/ticker/ticker.c @ 6080:cb3719996a8e
[gaim-migrate @ 6539]
added docklet.dll
committer: Tailor Script <tailor@pidgin.im>
author | Herman Bloggs <hermanator12002@yahoo.com> |
---|---|
date | Thu, 10 Jul 2003 23:39:03 +0000 |
parents | 5239a3b4ab33 |
children | 914f2d5da21c |
rev | line source |
---|---|
3391 | 1 /* GTK - The GIMP Toolkit |
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald | |
3 * | |
4 * This library is free software; you can redistribute it and/or | |
5 * modify it under the terms of the GNU Library General Public | |
6 * License as published by the Free Software Foundation; either | |
7 * version 2 of the License, or (at your option) any later version. | |
8 * | |
9 * This library is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 * Library General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU Library General Public | |
15 * License along with this library; if not, write to the | |
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
17 * Boston, MA 02111-1307, USA. | |
18 */ | |
19 | |
20 /* | |
21 * ticker.c -- Syd Logan, Summer 2000 | |
22 * pluginized- Sean Egan, Summer 2002 | |
23 */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5607
diff
changeset
|
24 #include "internal.h" |
3391 | 25 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5607
diff
changeset
|
26 #include "blist.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5607
diff
changeset
|
27 #include "conversation.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5607
diff
changeset
|
28 #include "debug.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5607
diff
changeset
|
29 #include "prpl.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5607
diff
changeset
|
30 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5607
diff
changeset
|
31 #include "gtkblist.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5607
diff
changeset
|
32 #include "gtkplugin.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5607
diff
changeset
|
33 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5607
diff
changeset
|
34 #include "gtkticker.h" |
3391 | 35 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
36 #define TICKER_PLUGIN_ID "gtk-ticker" |
3867 | 37 |
3391 | 38 static GtkWidget *tickerwindow = NULL; |
39 static GtkWidget *ticker; | |
40 | |
41 typedef struct { | |
5170 | 42 struct buddy *buddy; |
3391 | 43 GtkWidget *ebox; |
44 GtkWidget *label; | |
5170 | 45 GtkWidget *icon; |
3391 | 46 } TickerData; |
47 | |
5170 | 48 GList *tickerbuds = NULL; |
3391 | 49 |
5172 | 50 static gboolean buddy_ticker_destroy_window(GtkWidget *window, |
51 GdkEventAny *event, gpointer data) { | |
52 if(window) | |
53 gtk_widget_hide(window); | |
54 | |
55 return TRUE; /* don't actually destroy the window */ | |
3391 | 56 } |
57 | |
5170 | 58 static void buddy_ticker_create_window() { |
59 if(tickerwindow) { | |
60 gtk_widget_show(tickerwindow); | |
61 return; | |
62 } | |
3391 | 63 |
5170 | 64 tickerwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
5286 | 65 gtk_window_set_default_size(GTK_WINDOW(tickerwindow), 500, -1); |
5172 | 66 g_signal_connect(G_OBJECT(tickerwindow), "delete_event", |
5170 | 67 G_CALLBACK (buddy_ticker_destroy_window), NULL); |
68 gtk_window_set_title (GTK_WINDOW(tickerwindow), _("Buddy Ticker")); | |
4850 | 69 gtk_window_set_role (GTK_WINDOW(tickerwindow), "ticker"); |
3391 | 70 |
4850 | 71 ticker = gtk_ticker_new(); |
5170 | 72 gtk_ticker_set_spacing(GTK_TICKER(ticker), 20); |
73 gtk_container_add(GTK_CONTAINER(tickerwindow), ticker); | |
74 gtk_ticker_set_interval(GTK_TICKER(ticker), 500); | |
75 gtk_ticker_set_scootch(GTK_TICKER(ticker), 10); | |
76 gtk_ticker_start_scroll(GTK_TICKER(ticker)); | |
5286 | 77 gtk_widget_set_size_request(ticker, 1, -1); |
3391 | 78 |
5170 | 79 gtk_widget_show_all(tickerwindow); |
3391 | 80 } |
81 | |
5170 | 82 static gboolean buddy_click_cb(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { |
83 struct buddy *b = user_data; | |
4850 | 84 |
5170 | 85 gaim_conversation_new(GAIM_CONV_IM, b->account, b->name); |
3391 | 86 return TRUE; |
87 } | |
88 | |
5170 | 89 static TickerData *buddy_ticker_find_buddy(struct buddy *b) { |
90 GList *tb; | |
91 for(tb = tickerbuds; tb; tb = tb->next) { | |
92 TickerData *td = tb->data; | |
93 if(td->buddy == b) | |
94 return td; | |
95 } | |
96 return NULL; | |
97 } | |
98 | |
99 static void buddy_ticker_set_pixmap(struct buddy *b) { | |
100 TickerData *td = buddy_ticker_find_buddy(b); | |
101 GdkPixbuf *pixbuf; | |
3391 | 102 |
5170 | 103 if(!td) |
3391 | 104 return; |
5170 | 105 |
106 if(!td->icon) | |
107 td->icon = gtk_image_new(); | |
3391 | 108 |
5234 | 109 pixbuf = gaim_gtk_blist_get_status_icon((GaimBlistNode*)b, |
110 GAIM_STATUS_ICON_SMALL); | |
5170 | 111 gtk_image_set_from_pixbuf(GTK_IMAGE(td->icon), pixbuf); |
112 g_object_unref(G_OBJECT(pixbuf)); | |
113 } | |
114 | |
115 static void buddy_ticker_add_buddy(struct buddy *b) { | |
116 GtkWidget *hbox; | |
117 TickerData *td; | |
118 | |
119 buddy_ticker_create_window(); | |
5172 | 120 |
3391 | 121 if (!ticker) |
122 return; | |
123 | |
5170 | 124 if(buddy_ticker_find_buddy(b)) |
3391 | 125 return; |
126 | |
5170 | 127 td = g_new0(TickerData, 1); |
128 td->buddy = b; | |
129 tickerbuds = g_list_append(tickerbuds, td); | |
3391 | 130 |
5170 | 131 td->ebox = gtk_event_box_new(); |
132 gtk_ticker_add(GTK_TICKER(ticker), td->ebox); | |
133 hbox = gtk_hbox_new(FALSE, 0); | |
134 gtk_container_add(GTK_CONTAINER(td->ebox), hbox); | |
135 buddy_ticker_set_pixmap(b); | |
136 gtk_box_pack_start(GTK_BOX(hbox), td->icon, FALSE, FALSE, 5); | |
3391 | 137 |
5170 | 138 g_signal_connect(G_OBJECT(td->ebox), "button-press-event", |
139 G_CALLBACK(buddy_click_cb), b); | |
3391 | 140 |
5170 | 141 td->label = gtk_label_new(gaim_get_buddy_alias(b)); |
142 gtk_box_pack_start(GTK_BOX(hbox), td->label, FALSE, FALSE, 5); | |
143 | |
144 gtk_widget_show_all(td->ebox); | |
145 gtk_widget_show(tickerwindow); | |
3391 | 146 } |
147 | |
5170 | 148 static void buddy_ticker_remove_buddy(struct buddy *b) { |
149 TickerData *td = buddy_ticker_find_buddy(b); | |
3391 | 150 |
5170 | 151 if (!td) |
152 return; | |
3391 | 153 |
5172 | 154 /* pop up the ticker window again */ |
155 buddy_ticker_create_window(); | |
156 | |
5170 | 157 gtk_ticker_remove(GTK_TICKER(ticker), td->ebox); |
158 tickerbuds = g_list_remove(tickerbuds, td); | |
159 g_free(td); | |
3391 | 160 } |
161 | |
5170 | 162 static void buddy_ticker_show() |
3391 | 163 { |
5170 | 164 struct gaim_buddy_list *list = gaim_get_blist(); |
165 GaimBlistNode *gnode, *bnode; | |
166 struct buddy *b; | |
3391 | 167 |
5170 | 168 if(!list) |
169 return; | |
3391 | 170 |
5170 | 171 for(gnode = list->root; gnode; gnode = gnode->next) { |
172 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
173 continue; | |
174 for(bnode = gnode->child; bnode; bnode = bnode->next) { | |
175 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
176 continue; | |
177 b = (struct buddy *)bnode; | |
178 if(GAIM_BUDDY_IS_ONLINE(b)) | |
179 buddy_ticker_add_buddy(b); | |
3391 | 180 } |
181 } | |
182 } | |
183 | |
5587
1c55b1540e18
[gaim-migrate @ 5991]
Christian Hammond <chipx86@chipx86.com>
parents:
5286
diff
changeset
|
184 void signon_cb(GaimConnection *gc, char *who) { |
4850 | 185 struct buddy *b = gaim_find_buddy(gc->account, who); |
5170 | 186 if(buddy_ticker_find_buddy(b)) |
187 buddy_ticker_set_pixmap(b); | |
188 else | |
189 buddy_ticker_add_buddy(b); | |
3391 | 190 } |
191 | |
5587
1c55b1540e18
[gaim-migrate @ 5991]
Christian Hammond <chipx86@chipx86.com>
parents:
5286
diff
changeset
|
192 void signoff_cb(GaimConnection *gc) { |
5607 | 193 if (!gaim_connections_get_all()) { |
5185 | 194 while(tickerbuds) { |
195 g_free(tickerbuds->data); | |
196 tickerbuds = g_list_delete_link(tickerbuds, tickerbuds); | |
197 } | |
3391 | 198 gtk_widget_destroy(tickerwindow); |
199 tickerwindow = NULL; | |
200 ticker = NULL; | |
5185 | 201 } else { |
202 GList *t = tickerbuds; | |
203 while(t) { | |
204 TickerData *td = t->data; | |
205 t = t->next; | |
206 if(td->buddy->account == gc->account) { | |
207 g_free(td); | |
208 tickerbuds = g_list_remove(tickerbuds, td); | |
209 } | |
210 } | |
3391 | 211 } |
212 } | |
213 | |
5587
1c55b1540e18
[gaim-migrate @ 5991]
Christian Hammond <chipx86@chipx86.com>
parents:
5286
diff
changeset
|
214 void buddy_signoff_cb(GaimConnection *gc, char *who) { |
5170 | 215 struct buddy *b = gaim_find_buddy(gc->account, who); |
216 | |
217 buddy_ticker_remove_buddy(b); | |
5185 | 218 if(!tickerbuds) |
219 gtk_widget_hide(tickerwindow); | |
3391 | 220 } |
221 | |
5587
1c55b1540e18
[gaim-migrate @ 5991]
Christian Hammond <chipx86@chipx86.com>
parents:
5286
diff
changeset
|
222 void away_cb(GaimConnection *gc, char *who) { |
4850 | 223 struct buddy *b = gaim_find_buddy(gc->account, who); |
5170 | 224 if(buddy_ticker_find_buddy(b)) |
225 buddy_ticker_set_pixmap(b); | |
226 else | |
227 buddy_ticker_add_buddy(b); | |
3391 | 228 } |
229 | |
3630 | 230 /* |
231 * EXPORTED FUNCTIONS | |
232 */ | |
233 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
234 static gboolean |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
235 plugin_load(GaimPlugin *plugin) |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
236 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
237 gaim_signal_connect(plugin, event_buddy_signon, signon_cb, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
238 gaim_signal_connect(plugin, event_signoff, signoff_cb, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
239 gaim_signal_connect(plugin, event_buddy_signoff, buddy_signoff_cb, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
240 gaim_signal_connect(plugin, event_buddy_away, away_cb, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
241 gaim_signal_connect(plugin, event_buddy_back, away_cb, NULL); |
3391 | 242 |
5607 | 243 if (gaim_connections_get_all()) |
5170 | 244 buddy_ticker_show(); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
245 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
246 return TRUE; |
3391 | 247 } |
248 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
249 static gboolean |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
250 plugin_unload(GaimPlugin *plugin) |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
251 { |
5185 | 252 while(tickerbuds) { |
253 g_free(tickerbuds->data); | |
5186 | 254 tickerbuds = g_list_delete_link(tickerbuds, tickerbuds); |
5185 | 255 } |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
256 |
5984
c55b32640690
[gaim-migrate @ 6432]
Christian Hammond <chipx86@chipx86.com>
parents:
5983
diff
changeset
|
257 if (tickerwindow != NULL) { |
5983
e0be64ced3d7
[gaim-migrate @ 6431]
Christian Hammond <chipx86@chipx86.com>
parents:
5920
diff
changeset
|
258 gtk_widget_destroy(tickerwindow); |
5984
c55b32640690
[gaim-migrate @ 6432]
Christian Hammond <chipx86@chipx86.com>
parents:
5983
diff
changeset
|
259 tickerwindow = NULL; |
c55b32640690
[gaim-migrate @ 6432]
Christian Hammond <chipx86@chipx86.com>
parents:
5983
diff
changeset
|
260 } |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
261 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
262 return TRUE; |
3391 | 263 } |
5170 | 264 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
265 static GaimGtkPluginUiInfo ui_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
266 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
267 NULL /**< get_config_frame */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
268 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
269 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
270 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
271 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
272 2, /**< api_version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
273 GAIM_PLUGIN_STANDARD, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
274 GAIM_GTK_PLUGIN_TYPE, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
275 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
276 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
277 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
278 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
279 TICKER_PLUGIN_ID, /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
280 N_("Buddy Ticker"), /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
281 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
282 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
283 N_("A horizontal scrolling version of the buddy list."), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
284 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
285 N_("A horizontal scrolling version of the buddy list."), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
286 "Syd Logan", /**< author */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
287 WEBSITE, /**< homepage */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
288 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
289 plugin_load, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
290 plugin_unload, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
291 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
292 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
293 &ui_info, /**< ui_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
294 NULL /**< extra_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
295 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
296 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
297 static void |
5920
7d385de2f9cd
[gaim-migrate @ 6360]
Christian Hammond <chipx86@chipx86.com>
parents:
5873
diff
changeset
|
298 init_plugin(GaimPlugin *plugin) |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
299 { |
3551 | 300 } |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
301 |
6063 | 302 GAIM_INIT_PLUGIN(ticker, init_plugin, info) |