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