Mercurial > pidgin
annotate plugins/ticker/ticker.c @ 5286:f82c251c8300
[gaim-migrate @ 5658]
David Brigada (jsi) writes:
" I juggled a little code around. This means that you
can now set the buddy ticker to be as small as 1px
wide. The default is still 500px. Also included is
the related patch to the .todo file."
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Fri, 02 May 2003 21:25:49 +0000 |
parents | 890b29f00b68 |
children | 1c55b1540e18 |
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 */ | |
24 | |
25 | |
26 #include <gtk/gtk.h> | |
27 #include "gtkticker.h" | |
28 #include <string.h> | |
29 #include <stdlib.h> | |
30 #include "gaim.h" | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
31 #include "prpl.h" |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
32 #include "gtkplugin.h" |
5234 | 33 #include "blist.h" |
34 #include "gtkblist.h" | |
3630 | 35 #ifdef _WIN32 |
36 #include "win32dep.h" | |
37 #endif | |
3391 | 38 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
39 #define TICKER_PLUGIN_ID "gtk-ticker" |
3867 | 40 |
3391 | 41 static GtkWidget *tickerwindow = NULL; |
42 static GtkWidget *ticker; | |
43 | |
44 typedef struct { | |
5170 | 45 struct buddy *buddy; |
3391 | 46 GtkWidget *ebox; |
47 GtkWidget *label; | |
5170 | 48 GtkWidget *icon; |
3391 | 49 } TickerData; |
50 | |
5170 | 51 GList *tickerbuds = NULL; |
3391 | 52 |
3630 | 53 /* for win32 compatability */ |
54 G_MODULE_IMPORT GSList *connections; | |
55 | |
5172 | 56 static gboolean buddy_ticker_destroy_window(GtkWidget *window, |
57 GdkEventAny *event, gpointer data) { | |
58 if(window) | |
59 gtk_widget_hide(window); | |
60 | |
61 return TRUE; /* don't actually destroy the window */ | |
3391 | 62 } |
63 | |
5170 | 64 static void buddy_ticker_create_window() { |
65 if(tickerwindow) { | |
66 gtk_widget_show(tickerwindow); | |
67 return; | |
68 } | |
3391 | 69 |
5170 | 70 tickerwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
5286 | 71 gtk_window_set_default_size(GTK_WINDOW(tickerwindow), 500, -1); |
5172 | 72 g_signal_connect(G_OBJECT(tickerwindow), "delete_event", |
5170 | 73 G_CALLBACK (buddy_ticker_destroy_window), NULL); |
74 gtk_window_set_title (GTK_WINDOW(tickerwindow), _("Buddy Ticker")); | |
4850 | 75 gtk_window_set_role (GTK_WINDOW(tickerwindow), "ticker"); |
3391 | 76 |
4850 | 77 ticker = gtk_ticker_new(); |
5170 | 78 gtk_ticker_set_spacing(GTK_TICKER(ticker), 20); |
79 gtk_container_add(GTK_CONTAINER(tickerwindow), ticker); | |
80 gtk_ticker_set_interval(GTK_TICKER(ticker), 500); | |
81 gtk_ticker_set_scootch(GTK_TICKER(ticker), 10); | |
82 gtk_ticker_start_scroll(GTK_TICKER(ticker)); | |
5286 | 83 gtk_widget_set_size_request(ticker, 1, -1); |
3391 | 84 |
5170 | 85 gtk_widget_show_all(tickerwindow); |
3391 | 86 } |
87 | |
5170 | 88 static gboolean buddy_click_cb(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { |
89 struct buddy *b = user_data; | |
4850 | 90 |
5170 | 91 gaim_conversation_new(GAIM_CONV_IM, b->account, b->name); |
3391 | 92 return TRUE; |
93 } | |
94 | |
5170 | 95 static TickerData *buddy_ticker_find_buddy(struct buddy *b) { |
96 GList *tb; | |
97 for(tb = tickerbuds; tb; tb = tb->next) { | |
98 TickerData *td = tb->data; | |
99 if(td->buddy == b) | |
100 return td; | |
101 } | |
102 return NULL; | |
103 } | |
104 | |
105 static void buddy_ticker_set_pixmap(struct buddy *b) { | |
106 TickerData *td = buddy_ticker_find_buddy(b); | |
107 GdkPixbuf *pixbuf; | |
3391 | 108 |
5170 | 109 if(!td) |
3391 | 110 return; |
5170 | 111 |
112 if(!td->icon) | |
113 td->icon = gtk_image_new(); | |
3391 | 114 |
5234 | 115 pixbuf = gaim_gtk_blist_get_status_icon((GaimBlistNode*)b, |
116 GAIM_STATUS_ICON_SMALL); | |
5170 | 117 gtk_image_set_from_pixbuf(GTK_IMAGE(td->icon), pixbuf); |
118 g_object_unref(G_OBJECT(pixbuf)); | |
119 } | |
120 | |
121 static void buddy_ticker_add_buddy(struct buddy *b) { | |
122 GtkWidget *hbox; | |
123 TickerData *td; | |
124 | |
125 buddy_ticker_create_window(); | |
5172 | 126 |
3391 | 127 if (!ticker) |
128 return; | |
129 | |
5170 | 130 if(buddy_ticker_find_buddy(b)) |
3391 | 131 return; |
132 | |
5170 | 133 td = g_new0(TickerData, 1); |
134 td->buddy = b; | |
135 tickerbuds = g_list_append(tickerbuds, td); | |
3391 | 136 |
5170 | 137 td->ebox = gtk_event_box_new(); |
138 gtk_ticker_add(GTK_TICKER(ticker), td->ebox); | |
139 hbox = gtk_hbox_new(FALSE, 0); | |
140 gtk_container_add(GTK_CONTAINER(td->ebox), hbox); | |
141 buddy_ticker_set_pixmap(b); | |
142 gtk_box_pack_start(GTK_BOX(hbox), td->icon, FALSE, FALSE, 5); | |
3391 | 143 |
5170 | 144 g_signal_connect(G_OBJECT(td->ebox), "button-press-event", |
145 G_CALLBACK(buddy_click_cb), b); | |
3391 | 146 |
5170 | 147 td->label = gtk_label_new(gaim_get_buddy_alias(b)); |
148 gtk_box_pack_start(GTK_BOX(hbox), td->label, FALSE, FALSE, 5); | |
149 | |
150 gtk_widget_show_all(td->ebox); | |
151 gtk_widget_show(tickerwindow); | |
3391 | 152 } |
153 | |
5170 | 154 static void buddy_ticker_remove_buddy(struct buddy *b) { |
155 TickerData *td = buddy_ticker_find_buddy(b); | |
3391 | 156 |
5170 | 157 if (!td) |
158 return; | |
3391 | 159 |
5172 | 160 /* pop up the ticker window again */ |
161 buddy_ticker_create_window(); | |
162 | |
5170 | 163 gtk_ticker_remove(GTK_TICKER(ticker), td->ebox); |
164 tickerbuds = g_list_remove(tickerbuds, td); | |
165 g_free(td); | |
3391 | 166 } |
167 | |
5170 | 168 static void buddy_ticker_show() |
3391 | 169 { |
5170 | 170 struct gaim_buddy_list *list = gaim_get_blist(); |
171 GaimBlistNode *gnode, *bnode; | |
172 struct buddy *b; | |
3391 | 173 |
5170 | 174 if(!list) |
175 return; | |
3391 | 176 |
5170 | 177 for(gnode = list->root; gnode; gnode = gnode->next) { |
178 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
179 continue; | |
180 for(bnode = gnode->child; bnode; bnode = bnode->next) { | |
181 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
182 continue; | |
183 b = (struct buddy *)bnode; | |
184 if(GAIM_BUDDY_IS_ONLINE(b)) | |
185 buddy_ticker_add_buddy(b); | |
3391 | 186 } |
187 } | |
188 } | |
189 | |
190 void signon_cb(struct gaim_connection *gc, char *who) { | |
4850 | 191 struct buddy *b = gaim_find_buddy(gc->account, who); |
5170 | 192 if(buddy_ticker_find_buddy(b)) |
193 buddy_ticker_set_pixmap(b); | |
194 else | |
195 buddy_ticker_add_buddy(b); | |
3391 | 196 } |
197 | |
198 void signoff_cb(struct gaim_connection *gc) { | |
5170 | 199 if (!connections) { |
5185 | 200 while(tickerbuds) { |
201 g_free(tickerbuds->data); | |
202 tickerbuds = g_list_delete_link(tickerbuds, tickerbuds); | |
203 } | |
3391 | 204 gtk_widget_destroy(tickerwindow); |
205 tickerwindow = NULL; | |
206 ticker = NULL; | |
5185 | 207 } else { |
208 GList *t = tickerbuds; | |
209 while(t) { | |
210 TickerData *td = t->data; | |
211 t = t->next; | |
212 if(td->buddy->account == gc->account) { | |
213 g_free(td); | |
214 tickerbuds = g_list_remove(tickerbuds, td); | |
215 } | |
216 } | |
3391 | 217 } |
218 } | |
219 | |
220 void buddy_signoff_cb(struct gaim_connection *gc, char *who) { | |
5170 | 221 struct buddy *b = gaim_find_buddy(gc->account, who); |
222 | |
223 buddy_ticker_remove_buddy(b); | |
5185 | 224 if(!tickerbuds) |
225 gtk_widget_hide(tickerwindow); | |
3391 | 226 } |
227 | |
228 void away_cb(struct gaim_connection *gc, char *who) { | |
4850 | 229 struct buddy *b = gaim_find_buddy(gc->account, who); |
5170 | 230 if(buddy_ticker_find_buddy(b)) |
231 buddy_ticker_set_pixmap(b); | |
232 else | |
233 buddy_ticker_add_buddy(b); | |
3391 | 234 } |
235 | |
3630 | 236 /* |
237 * EXPORTED FUNCTIONS | |
238 */ | |
239 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
240 static gboolean |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
241 plugin_load(GaimPlugin *plugin) |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
242 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
243 gaim_signal_connect(plugin, event_buddy_signon, signon_cb, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
244 gaim_signal_connect(plugin, event_signoff, signoff_cb, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
245 gaim_signal_connect(plugin, event_buddy_signoff, buddy_signoff_cb, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
246 gaim_signal_connect(plugin, event_buddy_away, away_cb, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
247 gaim_signal_connect(plugin, event_buddy_back, away_cb, NULL); |
3391 | 248 |
249 if (connections) | |
5170 | 250 buddy_ticker_show(); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
251 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
252 return TRUE; |
3391 | 253 } |
254 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
255 static gboolean |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
256 plugin_unload(GaimPlugin *plugin) |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
257 { |
5185 | 258 while(tickerbuds) { |
259 g_free(tickerbuds->data); | |
5186 | 260 tickerbuds = g_list_delete_link(tickerbuds, tickerbuds); |
5185 | 261 } |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
262 |
5181 | 263 gtk_widget_destroy(tickerwindow); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
264 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
265 return TRUE; |
3391 | 266 } |
5170 | 267 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
268 static GaimGtkPluginUiInfo ui_info = |
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 NULL /**< get_config_frame */ |
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 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
273 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
274 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
275 2, /**< api_version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
276 GAIM_PLUGIN_STANDARD, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
277 GAIM_GTK_PLUGIN_TYPE, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
278 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
279 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
280 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
281 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
282 TICKER_PLUGIN_ID, /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
283 N_("Buddy Ticker"), /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
284 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
285 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
286 N_("A horizontal scrolling version of the buddy list."), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
287 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
288 N_("A horizontal scrolling version of the buddy list."), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
289 "Syd Logan", /**< author */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
290 WEBSITE, /**< homepage */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
291 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
292 plugin_load, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
293 plugin_unload, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
294 NULL, /**< destroy */ |
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 &ui_info, /**< ui_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
297 NULL /**< extra_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
298 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
299 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
300 static void |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
301 __init_plugin(GaimPlugin *plugin) |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
302 { |
3551 | 303 } |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
304 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5186
diff
changeset
|
305 GAIM_INIT_PLUGIN(ticker, __init_plugin, info); |