Mercurial > pidgin.yaz
annotate src/gtkconn.c @ 8190:0a0501566843
[gaim-migrate @ 8911]
Daniel Atallah noticed a problem with my changes to the disconnect
account dialog and submitted a patch. I did this instead because
I think it's cleaner, but it might be an iota or three slower. But
really, if you think about it, what's just one little iota when you
sleep for BILLIONS of iotas a DAY?
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sat, 31 Jan 2004 02:02:46 +0000 |
parents | 4c34db6996d1 |
children | 10a41e67a800 |
rev | line source |
---|---|
5717 | 1 /* |
2 * gaim | |
3 * | |
8046 | 4 * Gaim is the legal property of its developers, whose names are too numerous |
5 * to list here. Please refer to the COPYRIGHT file distributed with this | |
6 * source distribution. | |
5717 | 7 * |
8 * This program is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 */ | |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6216
diff
changeset
|
22 #include "gtkinternal.h" |
5717 | 23 |
24 #include "account.h" | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
25 #include "debug.h" |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
26 #include "notify.h" |
6216 | 27 #include "prefs.h" |
7399 | 28 #include "stock.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
29 #include "util.h" |
5717 | 30 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
31 #include "gtkblist.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
32 #include "gtkutils.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
33 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
34 #include "ui.h" |
5717 | 35 |
7912 | 36 /* |
37 * The next couple of functions deal with the connection dialog | |
38 */ | |
5717 | 39 struct signon_meter { |
40 GaimAccount *account; | |
41 GtkWidget *button; | |
42 GtkWidget *progress; | |
43 GtkWidget *status; | |
44 }; | |
45 | |
46 struct meter_window { | |
47 GtkWidget *window; | |
48 GtkWidget *table; | |
49 gint rows; | |
50 gint active_count; | |
51 GSList *meters; | |
7912 | 52 }; |
53 struct meter_window *meter_win = NULL; | |
5717 | 54 |
7912 | 55 static void kill_meter(struct signon_meter *meter, const char *text) |
56 { | |
8014 | 57 if(!meter->progress) |
58 return; | |
59 | |
7912 | 60 gtk_widget_set_sensitive(meter->button, FALSE); |
61 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(meter->progress), 1); | |
62 gtk_label_set_text(GTK_LABEL(meter->status), text); | |
63 meter_win->active_count--; | |
8014 | 64 meter->progress = NULL; |
7912 | 65 |
66 if (meter_win->active_count == 0) { | |
67 gtk_widget_destroy(meter_win->window); | |
68 g_free(meter_win); | |
69 meter_win = NULL; | |
70 } | |
71 } | |
5991
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
72 |
5717 | 73 static void cancel_signon(GtkWidget *button, struct signon_meter *meter) |
74 { | |
5991
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
75 if (meter->account->gc != NULL) { |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
76 meter->account->gc->wants_to_die = TRUE; |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
77 gaim_connection_destroy(meter->account->gc); |
7912 | 78 } else { |
5991
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
79 kill_meter(meter, _("Done.")); |
5987
6e19ad2ef712
[gaim-migrate @ 6435]
Christian Hammond <chipx86@chipx86.com>
parents:
5936
diff
changeset
|
80 |
5991
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
81 if (gaim_connections_get_all() == NULL) { |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
82 destroy_all_dialogs(); |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
83 |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
84 gaim_blist_destroy(); |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
85 |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
86 show_login(); |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
87 } |
5d5bad909bc4
[gaim-migrate @ 6439]
Christian Hammond <chipx86@chipx86.com>
parents:
5989
diff
changeset
|
88 } |
5717 | 89 } |
90 | |
7912 | 91 static void cancel_all () |
92 { | |
5717 | 93 GSList *m = meter_win ? meter_win->meters : NULL; |
6114 | 94 struct signon_meter *meter; |
5717 | 95 |
96 while (m) { | |
6114 | 97 meter = m->data; |
7890 | 98 if (gaim_connection_get_state(meter->account->gc) != GAIM_CONNECTED) |
99 cancel_signon(NULL, meter); | |
6114 | 100 m = m->next; |
5717 | 101 } |
102 } | |
103 | |
104 static gint meter_destroy(GtkWidget *window, GdkEvent *evt, struct signon_meter *meter) | |
105 { | |
106 return TRUE; | |
107 } | |
108 | |
109 static struct signon_meter *find_signon_meter(GaimConnection *gc) | |
110 { | |
111 GSList *m = meter_win ? meter_win->meters : NULL; | |
6114 | 112 struct signon_meter *meter; |
5717 | 113 |
114 while (m) { | |
6114 | 115 meter = m->data; |
116 if (meter->account == gaim_connection_get_account(gc)) | |
5717 | 117 return m->data; |
118 m = m->next; | |
119 } | |
120 | |
121 return NULL; | |
122 } | |
123 | |
124 static GtkWidget* create_meter_pixmap (GaimConnection *gc) | |
125 { | |
126 GdkPixbuf *pb = create_prpl_icon(gc->account); | |
127 GdkPixbuf *scale = gdk_pixbuf_scale_simple(pb, 30,30,GDK_INTERP_BILINEAR); | |
128 GtkWidget *image = | |
129 gtk_image_new_from_pixbuf(scale); | |
130 g_object_unref(G_OBJECT(pb)); | |
131 g_object_unref(G_OBJECT(scale)); | |
132 return image; | |
133 } | |
134 | |
135 static struct signon_meter * | |
136 new_meter(GaimConnection *gc, GtkWidget *widget, | |
137 GtkWidget *table, gint *rows) | |
138 { | |
139 GtkWidget *graphic; | |
140 GtkWidget *label; | |
141 GtkWidget *nest_vbox; | |
142 GString *name_to_print; | |
143 struct signon_meter *meter; | |
144 | |
145 | |
146 meter = g_new0(struct signon_meter, 1); | |
147 | |
148 meter->account = gaim_connection_get_account(gc); | |
149 name_to_print = g_string_new(gaim_account_get_username(meter->account)); | |
150 | |
151 (*rows)++; | |
152 gtk_table_resize (GTK_TABLE(table), *rows, 4); | |
153 | |
154 graphic = create_meter_pixmap(gc); | |
155 | |
156 nest_vbox = gtk_vbox_new (FALSE, 0); | |
157 | |
158 g_string_prepend(name_to_print, _("Signon: ")); | |
159 label = gtk_label_new (name_to_print->str); | |
160 g_string_free(name_to_print, TRUE); | |
161 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); | |
162 | |
163 meter->status = gtk_label_new(""); | |
164 gtk_misc_set_alignment(GTK_MISC(meter->status), 0, 0.5); | |
165 gtk_widget_set_size_request(meter->status, 250, -1); | |
166 | |
167 meter->progress = gtk_progress_bar_new (); | |
168 | |
169 meter->button = gaim_pixbuf_button_from_stock (_("Cancel"), GTK_STOCK_CANCEL, GAIM_BUTTON_HORIZONTAL); | |
170 g_signal_connect(G_OBJECT (meter->button), "clicked", | |
171 G_CALLBACK (cancel_signon), meter); | |
172 | |
173 gtk_table_attach (GTK_TABLE (table), graphic, 0, 1, *rows, *rows+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); | |
174 gtk_table_attach (GTK_TABLE (table), nest_vbox, 1, 2, *rows, *rows+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); | |
175 gtk_box_pack_start (GTK_BOX (nest_vbox), GTK_WIDGET (label), FALSE, FALSE, 0); | |
176 gtk_box_pack_start (GTK_BOX (nest_vbox), GTK_WIDGET (meter->status), FALSE, FALSE, 0); | |
177 gtk_table_attach (GTK_TABLE (table), meter->progress, 2, 3, *rows, *rows+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); | |
178 gtk_table_attach (GTK_TABLE (table), meter->button, 3, 4, *rows, *rows+1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); | |
179 | |
180 gtk_widget_show_all (GTK_WIDGET (meter_win->window)); | |
181 | |
182 meter_win->active_count++; | |
183 | |
184 return meter; | |
185 } | |
186 | |
187 static void gaim_gtk_connection_connect_progress(GaimConnection *gc, | |
188 const char *text, size_t step, size_t step_count) | |
189 { | |
190 struct signon_meter *meter; | |
191 | |
192 if(!meter_win) { | |
193 GtkWidget *vbox; | |
194 GtkWidget *cancel_button; | |
195 | |
196 if(mainwindow) | |
197 gtk_widget_hide(mainwindow); | |
198 | |
199 meter_win = g_new0(struct meter_window, 1); | |
200 meter_win->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
201 gtk_window_set_resizable(GTK_WINDOW(meter_win->window), FALSE); | |
202 gtk_window_set_role(GTK_WINDOW(meter_win->window), "signon"); | |
203 gtk_container_set_border_width(GTK_CONTAINER(meter_win->window), 5); | |
204 gtk_window_set_title(GTK_WINDOW(meter_win->window), _("Signon")); | |
205 gtk_widget_realize(meter_win->window); | |
206 | |
207 vbox = gtk_vbox_new (FALSE, 0); | |
208 gtk_container_add(GTK_CONTAINER(meter_win->window), vbox); | |
209 | |
210 meter_win->table = gtk_table_new(1, 4, FALSE); | |
211 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(meter_win->table), | |
212 FALSE, FALSE, 0); | |
213 gtk_container_set_border_width(GTK_CONTAINER(meter_win->table), 5); | |
214 gtk_table_set_row_spacings(GTK_TABLE(meter_win->table), 5); | |
215 gtk_table_set_col_spacings(GTK_TABLE(meter_win->table), 10); | |
216 | |
217 cancel_button = gaim_pixbuf_button_from_stock(_("Cancel All"), | |
218 GTK_STOCK_QUIT, GAIM_BUTTON_HORIZONTAL); | |
219 g_signal_connect_swapped(G_OBJECT(cancel_button), "clicked", | |
220 G_CALLBACK(cancel_all), NULL); | |
221 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(cancel_button), | |
222 FALSE, FALSE, 0); | |
223 | |
224 g_signal_connect(G_OBJECT(meter_win->window), "delete_event", | |
225 G_CALLBACK(meter_destroy), NULL); | |
226 } | |
227 | |
228 meter = find_signon_meter(gc); | |
229 if(!meter) { | |
230 meter = new_meter(gc, meter_win->window, meter_win->table, | |
231 &meter_win->rows); | |
232 | |
233 meter_win->meters = g_slist_append(meter_win->meters, meter); | |
234 } | |
235 | |
236 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(meter->progress), | |
237 (float)step / (float)step_count); | |
238 gtk_label_set_text(GTK_LABEL(meter->status), text); | |
239 } | |
240 | |
241 static void gaim_gtk_connection_connected(GaimConnection *gc) | |
242 { | |
243 struct signon_meter *meter = find_signon_meter(gc); | |
244 | |
5885
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
245 gaim_setup(gc); |
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
246 |
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
247 do_away_menu(); |
5936
1b56a833d665
[gaim-migrate @ 6376]
Christian Hammond <chipx86@chipx86.com>
parents:
5885
diff
changeset
|
248 gaim_gtk_blist_update_protocol_actions(); |
5885
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
249 |
7912 | 250 if (meter) |
5717 | 251 kill_meter(meter, _("Done.")); |
252 } | |
253 | |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
254 static void gaim_gtk_connection_disconnected(GaimConnection *gc) |
5717 | 255 { |
256 struct signon_meter *meter = find_signon_meter(gc); | |
5883
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
257 |
5885
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
258 do_away_menu(); |
5936
1b56a833d665
[gaim-migrate @ 6376]
Christian Hammond <chipx86@chipx86.com>
parents:
5885
diff
changeset
|
259 gaim_gtk_blist_update_protocol_actions(); |
5883
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
260 |
7912 | 261 if (meter) |
5717 | 262 kill_meter(meter, _("Done.")); |
5883
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
263 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
264 if (gaim_connections_get_all() != NULL) |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
265 return; |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
266 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
267 destroy_all_dialogs(); |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
268 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
269 gaim_blist_destroy(); |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
270 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
271 show_login(); |
5717 | 272 } |
273 | |
274 static void gaim_gtk_connection_notice(GaimConnection *gc, | |
275 const char *text) | |
276 { | |
277 } | |
278 | |
7912 | 279 /* |
280 * The next couple of functions deal with the disconnected dialog | |
281 */ | |
7399 | 282 struct disconnect_window { |
283 GtkWidget *window; | |
284 GtkWidget *treeview; | |
285 GtkWidget *sw; | |
286 GtkWidget *label; | |
7808 | 287 GtkWidget *reconnect_btn; |
7912 | 288 GtkWidget *reconnectall_btn; |
7399 | 289 }; |
290 struct disconnect_window *disconnect_window = NULL; | |
291 | |
7912 | 292 static void disconnect_connection_change_cb(GaimConnection *gc, void *data); |
293 | |
294 /* | |
295 * Destroy the dialog and remove the signals associated with it. | |
296 */ | |
7493 | 297 static void disconnect_window_hide() |
298 { | |
7912 | 299 gaim_signal_disconnect(gaim_connections_get_handle(), "signed-on", |
300 disconnect_window, GAIM_CALLBACK(disconnect_connection_change_cb)); | |
301 | |
302 gaim_signal_disconnect(gaim_connections_get_handle(), "signed-off", | |
303 disconnect_window, GAIM_CALLBACK(disconnect_connection_change_cb)); | |
304 | |
7493 | 305 gtk_widget_destroy(disconnect_window->window); |
306 g_free(disconnect_window); | |
307 disconnect_window = NULL; | |
308 } | |
309 | |
7912 | 310 /* |
311 * Make sure the Reconnect and Reconnect All buttons are correctly | |
312 * shown or hidden. Also make sure the label on the Reconnect | |
313 * button is correctly set to either Reconnect or Remove. If there | |
314 * is more than one account then make sure the GtkTreeView is shown. | |
315 * If there are no accounts disconnectd then hide the dialog. | |
316 */ | |
317 static void disconnect_window_update_buttons(GtkTreeModel *model) | |
318 { | |
319 GtkTreeIter iter; | |
320 GtkTreeSelection *sel; | |
321 const char *label_text; | |
322 GaimAccount *account = NULL; | |
323 | |
324 if ((disconnect_window == NULL) || (model == NULL)) | |
325 return; | |
326 | |
327 if (!gtk_tree_model_get_iter_first(model, &iter)) { | |
328 /* No more accounts being shown. Caloo calay! */ | |
329 disconnect_window_hide(); | |
330 return; | |
331 } | |
332 | |
333 /* | |
334 * If we have more than one disconnected account then show the | |
335 * GtkTreeView and the "Reconnect All" button | |
336 */ | |
337 if (gtk_tree_model_iter_next(model, &iter)) { | |
338 gtk_widget_show_all(disconnect_window->sw); | |
339 gtk_widget_show(disconnect_window->reconnectall_btn); | |
340 } else { | |
341 gtk_widget_hide_all(disconnect_window->sw); | |
342 gtk_widget_hide(disconnect_window->reconnectall_btn); | |
343 } | |
344 | |
345 /* | |
346 * Make sure one of the accounts is selected. | |
347 */ | |
348 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(disconnect_window->treeview)); | |
349 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) { | |
350 gtk_tree_model_get_iter_first(model, &iter); | |
351 gtk_tree_selection_select_iter(sel, &iter); | |
352 } | |
353 | |
354 /* | |
355 * Update the Reconnect/Remove button appropriately and set the | |
8174 | 356 * label in the dialog to what it should be. If there is only |
357 * one account in the tree model, and that account is connected, | |
358 * then we don't show the remove button. | |
7912 | 359 */ |
360 gtk_tree_model_get(model, &iter, 3, &label_text, 4, &account, -1); | |
361 gtk_button_set_label(GTK_BUTTON(disconnect_window->reconnect_btn), | |
362 gaim_account_is_connected(account) ? _("_Remove") : _("_Reconnect")); | |
363 gtk_label_set_markup(GTK_LABEL(disconnect_window->label), label_text); | |
364 gtk_dialog_set_response_sensitive(GTK_DIALOG(disconnect_window->window), GTK_RESPONSE_ACCEPT, TRUE); | |
8190 | 365 gtk_tree_model_get_iter_first(model, &iter); |
8174 | 366 if (gaim_account_is_connected(account) && !(gtk_tree_model_iter_next(model, &iter))) |
367 gtk_widget_hide(disconnect_window->reconnect_btn); | |
368 else | |
369 gtk_widget_show(disconnect_window->reconnect_btn); | |
7912 | 370 } |
371 | |
7399 | 372 static void disconnect_response_cb(GtkDialog *dialog, gint id, GtkWidget *widget) |
373 { | |
7483 | 374 GtkTreeIter iter; |
375 GtkTreeSelection *sel = NULL; | |
376 GtkTreeModel *model = NULL; | |
7431 | 377 GaimAccount *account = NULL; |
378 | |
7912 | 379 switch (id) { |
380 case GTK_RESPONSE_APPLY: /* Reconnect All */ | |
7808 | 381 model = gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview)); |
382 if (gtk_tree_model_get_iter_first(model, &iter)) { | |
383 /* tree rows to be deleted */ | |
384 GList *l_del = NULL, *l_del_iter = NULL; | |
385 /* accounts to be connected */ | |
7912 | 386 GList *l_accts = NULL, *l_accts_iter = NULL; |
7808 | 387 do { |
388 GtkTreePath *path = gtk_tree_model_get_path(model, &iter); | |
389 GtkTreeRowReference* del_row = gtk_tree_row_reference_new(model, path); | |
390 l_del = g_list_append(l_del, del_row); | |
391 gtk_tree_path_free(path); | |
392 | |
393 gtk_tree_model_get(model, &iter, 4, &account, -1); | |
394 if (!gaim_account_is_connected(account) && g_list_find(l_accts, account) == NULL) | |
395 l_accts = g_list_append(l_accts, account); | |
396 } while (gtk_tree_model_iter_next(model, &iter)); | |
397 | |
398 /* remove all rows */ | |
7912 | 399 /* We could just do the following, but we only want to remove accounts |
400 * that are going to be reconnected, not accounts that have already | |
401 * been reconnected. | |
402 */ | |
403 /* gtk_list_store_clear(GTK_LIST_STORE(model)); */ | |
7808 | 404 l_del_iter = l_del; |
405 while (l_del_iter != NULL) { | |
406 GtkTreeRowReference* del_row = l_del_iter->data; | |
407 GtkTreePath *path = gtk_tree_row_reference_get_path(del_row); | |
408 if (gtk_tree_model_get_iter(model, &iter, path)) | |
409 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); | |
410 gtk_tree_path_free(path); | |
411 gtk_tree_row_reference_free(del_row); | |
412 l_del_iter = l_del_iter->next; | |
413 } | |
414 g_list_free(l_del); | |
415 | |
416 /* reconnect disconnected accounts */ | |
417 l_accts_iter = l_accts; | |
418 while (l_accts_iter != NULL) { | |
419 account = l_accts_iter->data; | |
420 gaim_account_connect(account); | |
421 l_accts_iter = l_accts_iter->next; | |
422 } | |
423 g_list_free(l_accts); | |
424 | |
425 } | |
426 | |
7912 | 427 disconnect_window_update_buttons(model); |
428 | |
7808 | 429 break; |
7912 | 430 |
431 case GTK_RESPONSE_ACCEPT: /* Reconnect Selected */ | |
7483 | 432 model = gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview)); |
7912 | 433 |
7483 | 434 /* |
435 * If we have more than one account disconnection displayed, then | |
436 * the scroll window is visible and we should use the selected | |
437 * account to reconnect. | |
438 */ | |
439 if (GTK_WIDGET_VISIBLE(disconnect_window->sw)) { | |
440 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(disconnect_window->treeview)); | |
441 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) | |
442 return; | |
443 } else { | |
444 /* There is only one account disconnection, so reconnect to it. */ | |
445 if (!gtk_tree_model_get_iter_first(model, &iter)) | |
446 return; | |
447 } | |
7912 | 448 |
449 /* remove all disconnections of the account to be reconnected */ | |
7808 | 450 gtk_tree_model_get(model, &iter, 4, &account, -1); |
7637 | 451 if (gtk_tree_model_get_iter_first(model, &iter)) { |
7808 | 452 GList *l_del = NULL, *l_del_iter = NULL; |
7637 | 453 GaimAccount *account2 = NULL; |
454 do { | |
7808 | 455 gtk_tree_model_get(model, &iter, 4, &account2, -1); |
7637 | 456 if (account2 == account) { |
7643 | 457 GtkTreePath *path = gtk_tree_model_get_path(model, &iter); |
458 GtkTreeRowReference* del_row = gtk_tree_row_reference_new(model, path); | |
459 l_del = g_list_append(l_del, del_row); | |
7808 | 460 gtk_tree_path_free(path); |
7637 | 461 } |
7643 | 462 } while (gtk_tree_model_iter_next(model, &iter)); |
463 | |
7808 | 464 l_del_iter = l_del; |
465 while (l_del_iter != NULL) { | |
466 GtkTreeRowReference* del_row = l_del_iter->data; | |
7643 | 467 GtkTreePath *path = gtk_tree_row_reference_get_path(del_row); |
468 if (gtk_tree_model_get_iter(model, &iter, path)) | |
469 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); | |
7808 | 470 gtk_tree_path_free(path); |
471 gtk_tree_row_reference_free(del_row); | |
472 l_del_iter = l_del_iter->next; | |
7643 | 473 } |
7808 | 474 g_list_free(l_del); |
7637 | 475 } |
476 | |
7643 | 477 gaim_account_connect(account); |
7912 | 478 disconnect_window_update_buttons(model); |
7643 | 479 |
7399 | 480 break; |
7912 | 481 |
482 case GTK_RESPONSE_DELETE_EVENT: | |
483 case GTK_RESPONSE_CLOSE: | |
484 disconnect_window_hide(); | |
485 break; | |
486 | |
7399 | 487 } |
488 } | |
489 | |
7912 | 490 /* |
491 * Called whenever a different account is selected in the GtkListWhatever. | |
492 */ | |
7399 | 493 static void disconnect_tree_cb(GtkTreeSelection *sel, GtkTreeModel *model) |
494 { | |
7912 | 495 disconnect_window_update_buttons(model); |
7399 | 496 } |
497 | |
7912 | 498 /* |
499 * Update the icon next to the account in the disconnect dialog, and | |
500 * gray the Reconnect All button if there is only 1 disconnected account. | |
501 */ | |
7808 | 502 static void disconnect_connection_change_cb(GaimConnection *gc, void *data) { |
7912 | 503 GaimAccount *account = gaim_connection_get_account(gc); |
504 GtkTreeIter iter; | |
505 GtkTreeModel *model; | |
506 GdkPixbuf *icon; | |
507 GdkPixbuf *scale; | |
508 GList *l_disc_accts = NULL; | |
509 | |
510 if (disconnect_window == NULL) | |
511 return; | |
512 | |
513 model = gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview)); | |
514 icon = create_prpl_icon(account); | |
515 scale = gdk_pixbuf_scale_simple(icon, 16, 16, GDK_INTERP_BILINEAR); | |
516 | |
517 /* Mark all disconnections w/ the account type disconnected /w grey icon */ | |
518 if (!gaim_account_is_connected(account)) | |
519 gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); | |
520 | |
521 gtk_tree_model_get_iter_first(model, &iter); | |
522 do { | |
523 GaimAccount *account2 = NULL; | |
524 /* Gray out the icon if this row is for this account */ | |
525 gtk_tree_model_get(model, &iter, 4, &account2, -1); | |
526 if (account2 == account) | |
527 gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, scale, -1); | |
528 | |
529 /* Add */ | |
530 if (!gaim_account_is_connected(account2) | |
7808 | 531 && g_list_find(l_disc_accts, account2) == NULL) |
7912 | 532 l_disc_accts = g_list_append(l_disc_accts, account2); |
533 } while (gtk_tree_model_iter_next(model, &iter)); | |
7808 | 534 |
7912 | 535 gtk_dialog_set_response_sensitive( |
536 GTK_DIALOG(disconnect_window->window), | |
537 GTK_RESPONSE_APPLY, | |
538 g_list_length(l_disc_accts) > 1); | |
539 g_list_free(l_disc_accts); | |
540 | |
541 if (icon != NULL) | |
542 g_object_unref(G_OBJECT(icon)); | |
543 if (scale != NULL) | |
544 g_object_unref(G_OBJECT(scale)); | |
545 | |
546 disconnect_window_update_buttons(model); | |
7625 | 547 } |
7399 | 548 |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
549 static void |
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
550 gaim_gtk_connection_report_disconnect(GaimConnection *gc, const char *text) |
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
551 { |
7399 | 552 char *label_text = NULL; |
7912 | 553 GtkTreeIter new_iter; |
7506 | 554 GtkListStore *list_store; |
555 GtkTreeViewColumn *col; | |
556 GtkTreeSelection *sel = NULL; | |
7399 | 557 |
7648 | 558 label_text = g_strdup_printf(_("<span weight=\"bold\" size=\"larger\">%s has been disconnected.</span>\n\n%s\n%s"), |
7912 | 559 gaim_account_get_username(gaim_connection_get_account(gc)), gaim_date_full(), |
7399 | 560 text ? text : _("Reason Unknown.")); |
7496 | 561 |
7506 | 562 /* Build the window if it isn't there yet */ |
563 if (!disconnect_window) { | |
7399 | 564 GtkWidget *hbox, *vbox, *img; |
565 GtkCellRenderer *rend, *rend2; | |
7496 | 566 |
7407 | 567 disconnect_window = g_new0(struct disconnect_window, 1); |
7874 | 568 disconnect_window->window = gtk_dialog_new_with_buttons(GAIM_ALERT_TITLE, NULL, GTK_DIALOG_NO_SEPARATOR, NULL); |
7399 | 569 g_signal_connect(G_OBJECT(disconnect_window->window), "response", G_CALLBACK(disconnect_response_cb), disconnect_window); |
570 | |
571 gtk_container_set_border_width(GTK_CONTAINER(disconnect_window->window), 6); | |
572 gtk_window_set_resizable(GTK_WINDOW(disconnect_window->window), FALSE); | |
573 gtk_dialog_set_has_separator(GTK_DIALOG(disconnect_window->window), FALSE); | |
574 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(disconnect_window->window)->vbox), 12); | |
575 gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(disconnect_window->window)->vbox), 6); | |
576 | |
577 hbox = gtk_hbox_new(FALSE, 12); | |
578 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(disconnect_window->window)->vbox), hbox); | |
579 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG); | |
580 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
581 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
7496 | 582 |
7399 | 583 vbox = gtk_vbox_new(FALSE, 12); |
584 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); | |
585 | |
7506 | 586 disconnect_window->label = gtk_label_new(label_text); |
7496 | 587 |
7399 | 588 gtk_label_set_line_wrap(GTK_LABEL(disconnect_window->label), TRUE); |
589 gtk_misc_set_alignment(GTK_MISC(disconnect_window->label), 0, 0); | |
590 gtk_box_pack_start(GTK_BOX(vbox), disconnect_window->label, FALSE, FALSE, 0); | |
591 | |
7808 | 592 disconnect_window->reconnect_btn = gtk_dialog_add_button( |
593 GTK_DIALOG(disconnect_window->window), | |
594 _("_Reconnect"), | |
595 GTK_RESPONSE_ACCEPT); | |
596 | |
7912 | 597 disconnect_window->reconnectall_btn = gtk_dialog_add_button( |
7808 | 598 GTK_DIALOG(disconnect_window->window), |
599 _("Reconnect _All"), | |
600 GTK_RESPONSE_APPLY); | |
601 | |
7874 | 602 gtk_dialog_add_button( |
603 GTK_DIALOG(disconnect_window->window), | |
604 GTK_STOCK_CLOSE, | |
605 GTK_RESPONSE_CLOSE); | |
606 | |
7399 | 607 gtk_widget_show_all(disconnect_window->window); |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
608 |
7399 | 609 /* Tree View */ |
610 disconnect_window->sw = gtk_scrolled_window_new(NULL,NULL); | |
7912 | 611 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(disconnect_window->sw), GTK_SHADOW_IN); |
612 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(disconnect_window->sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); | |
7399 | 613 gtk_box_pack_start(GTK_BOX(vbox), disconnect_window->sw, TRUE, TRUE, 0); |
7496 | 614 |
7912 | 615 list_store = gtk_list_store_new(5, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); |
616 disconnect_window->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store)); | |
7496 | 617 |
7399 | 618 rend = gtk_cell_renderer_pixbuf_new(); |
619 rend2 = gtk_cell_renderer_text_new(); | |
620 col = gtk_tree_view_column_new(); | |
621 gtk_tree_view_column_set_title(col, _("Account")); | |
622 gtk_tree_view_column_pack_start(col, rend, FALSE); | |
623 gtk_tree_view_column_pack_start(col, rend2, FALSE); | |
624 gtk_tree_view_column_set_attributes(col, rend, "pixbuf", 0, NULL); | |
625 gtk_tree_view_column_set_attributes(col, rend2, "text", 1, NULL); | |
626 gtk_tree_view_append_column (GTK_TREE_VIEW(disconnect_window->treeview), col); | |
7496 | 627 |
7399 | 628 rend = gtk_cell_renderer_text_new(); |
629 col = gtk_tree_view_column_new_with_attributes (_("Time"), | |
630 rend, "text", 2, NULL); | |
631 gtk_tree_view_append_column (GTK_TREE_VIEW(disconnect_window->treeview), col); | |
7637 | 632 |
7399 | 633 g_object_unref(G_OBJECT(list_store)); |
634 gtk_container_add(GTK_CONTAINER(disconnect_window->sw), disconnect_window->treeview); | |
7496 | 635 |
7399 | 636 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (disconnect_window->treeview)); |
7409
2ea9bf5686ad
[gaim-migrate @ 8009]
Christian Hammond <chipx86@chipx86.com>
parents:
7407
diff
changeset
|
637 gtk_widget_set_size_request(disconnect_window->treeview, -1, 96); |
7399 | 638 g_signal_connect (G_OBJECT (sel), "changed", |
639 G_CALLBACK (disconnect_tree_cb), list_store); | |
7625 | 640 |
641 gaim_signal_connect(gaim_connections_get_handle(), "signed-on", | |
7808 | 642 disconnect_window, GAIM_CALLBACK(disconnect_connection_change_cb), NULL); |
643 | |
644 gaim_signal_connect(gaim_connections_get_handle(), "signed-off", | |
645 disconnect_window, GAIM_CALLBACK(disconnect_connection_change_cb), NULL); | |
7506 | 646 } else |
647 list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview))); | |
648 | |
649 /* Add this account to our list of disconnected accounts */ | |
7912 | 650 gtk_list_store_append(list_store, &new_iter); |
651 gtk_list_store_set(list_store, &new_iter, | |
7808 | 652 0, NULL, |
7506 | 653 1, gaim_account_get_username(gaim_connection_get_account(gc)), |
654 2, gaim_date_full(), | |
655 3, label_text, | |
656 4, gaim_connection_get_account(gc), -1); | |
657 | |
7912 | 658 /* Make sure the newly disconnected account is selected */ |
659 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(disconnect_window->treeview)); | |
660 gtk_tree_selection_select_iter(sel, &new_iter); | |
661 | |
662 disconnect_window_update_buttons(GTK_TREE_MODEL(list_store)); | |
7496 | 663 |
7399 | 664 g_free(label_text); |
7493 | 665 gtk_window_present(GTK_WINDOW(disconnect_window->window)); |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
666 } |
7912 | 667 /* |
668 * End of disconnected dialog | |
669 */ | |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
670 |
5717 | 671 static GaimConnectionUiOps conn_ui_ops = |
672 { | |
673 gaim_gtk_connection_connect_progress, | |
674 gaim_gtk_connection_connected, | |
675 gaim_gtk_connection_disconnected, | |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
676 gaim_gtk_connection_notice, |
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
677 gaim_gtk_connection_report_disconnect |
5717 | 678 }; |
679 | |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
6460
diff
changeset
|
680 GaimConnectionUiOps * |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
6460
diff
changeset
|
681 gaim_gtk_connections_get_ui_ops(void) |
5717 | 682 { |
683 return &conn_ui_ops; | |
684 } | |
685 | |
7912 | 686 /* |
687 * This function needs to be moved out of here once away messages are | |
688 * core/UI split. | |
689 */ | |
6216 | 690 void away_on_login(const char *mesg) |
5717 | 691 { |
692 GSList *awy = away_messages; | |
693 struct away_message *a, *message = NULL; | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
694 GaimGtkBuddyList *gtkblist; |
5717 | 695 |
696 gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); | |
697 | |
698 if (!gtkblist->window) { | |
699 return; | |
700 } | |
701 | |
6216 | 702 if (mesg == NULL) |
703 mesg = gaim_prefs_get_string("/core/away/default_message"); | |
704 while (awy) { | |
705 a = (struct away_message *)awy->data; | |
706 if (strcmp(a->name, mesg) == 0) { | |
707 message = a; | |
708 break; | |
5717 | 709 } |
6216 | 710 awy = awy->next; |
5717 | 711 } |
6216 | 712 if (message == NULL) { |
713 if(!away_messages) | |
714 return; | |
715 message = away_messages->data; | |
716 } | |
717 do_away_message(NULL, message); | |
5717 | 718 } |