Mercurial > pidgin.yaz
annotate src/gtkconn.c @ 10097:158950e7996d
[gaim-migrate @ 11119]
I wrote this code with the assumption that iconv would fail if Gaim
attempted to convert utf8 to an encoding that could not represent
all the characters.
This assumption is not true for all version of iconv
(NetBSD 2.0, in this case).
Pope not Calle of Flaxborough (notcalle) pointed this out and
provided a fix.
Thanks!
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Thu, 14 Oct 2004 03:44:42 +0000 |
parents | 006410d0ae0c |
children | 952fb08c60b0 |
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 */ | |
9791 | 22 #include "internal.h" |
23 #include "gtkgaim.h" | |
5717 | 24 |
25 #include "account.h" | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
26 #include "debug.h" |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
27 #include "notify.h" |
6216 | 28 #include "prefs.h" |
7399 | 29 #include "stock.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
30 #include "util.h" |
5717 | 31 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
32 #include "gtkblist.h" |
9730 | 33 #include "gtkdialogs.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
34 #include "gtkutils.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5746
diff
changeset
|
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) { |
9730 | 81 gaim_gtkdialogs_destroy_all(); |
5991
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 |
9944 | 245 #if 0 /* XXX CORE/UI */ |
5885
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
246 do_away_menu(); |
9944 | 247 #endif |
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 |
9944 | 258 #if 0 /* XXX CORE/UI */ |
5885
02569519d0cc
[gaim-migrate @ 6317]
Christian Hammond <chipx86@chipx86.com>
parents:
5883
diff
changeset
|
259 do_away_menu(); |
9944 | 260 #endif |
5936
1b56a833d665
[gaim-migrate @ 6376]
Christian Hammond <chipx86@chipx86.com>
parents:
5885
diff
changeset
|
261 gaim_gtk_blist_update_protocol_actions(); |
5883
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
262 |
7912 | 263 if (meter) |
5717 | 264 kill_meter(meter, _("Done.")); |
5883
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
265 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
266 if (gaim_connections_get_all() != NULL) |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
267 return; |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
268 |
9730 | 269 gaim_gtkdialogs_destroy_all(); |
5883
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 gaim_blist_destroy(); |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
272 |
f5b0c6073264
[gaim-migrate @ 6315]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
273 show_login(); |
5717 | 274 } |
275 | |
276 static void gaim_gtk_connection_notice(GaimConnection *gc, | |
277 const char *text) | |
278 { | |
279 } | |
280 | |
7912 | 281 /* |
282 * The next couple of functions deal with the disconnected dialog | |
283 */ | |
7399 | 284 struct disconnect_window { |
285 GtkWidget *window; | |
286 GtkWidget *treeview; | |
287 GtkWidget *sw; | |
288 GtkWidget *label; | |
7808 | 289 GtkWidget *reconnect_btn; |
7912 | 290 GtkWidget *reconnectall_btn; |
7399 | 291 }; |
292 struct disconnect_window *disconnect_window = NULL; | |
293 | |
7912 | 294 static void disconnect_connection_change_cb(GaimConnection *gc, void *data); |
295 | |
296 /* | |
297 * Destroy the dialog and remove the signals associated with it. | |
298 */ | |
7493 | 299 static void disconnect_window_hide() |
300 { | |
7912 | 301 gaim_signal_disconnect(gaim_connections_get_handle(), "signed-on", |
302 disconnect_window, GAIM_CALLBACK(disconnect_connection_change_cb)); | |
303 | |
304 gaim_signal_disconnect(gaim_connections_get_handle(), "signed-off", | |
305 disconnect_window, GAIM_CALLBACK(disconnect_connection_change_cb)); | |
306 | |
7493 | 307 gtk_widget_destroy(disconnect_window->window); |
308 g_free(disconnect_window); | |
309 disconnect_window = NULL; | |
310 } | |
311 | |
7912 | 312 /* |
313 * Make sure the Reconnect and Reconnect All buttons are correctly | |
314 * shown or hidden. Also make sure the label on the Reconnect | |
315 * button is correctly set to either Reconnect or Remove. If there | |
316 * 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
|
317 * If there are no accounts disconnected then hide the dialog. |
7912 | 318 */ |
319 static void disconnect_window_update_buttons(GtkTreeModel *model) | |
320 { | |
321 GtkTreeIter iter; | |
322 GtkTreeSelection *sel; | |
323 const char *label_text; | |
324 GaimAccount *account = NULL; | |
325 | |
326 if ((disconnect_window == NULL) || (model == NULL)) | |
327 return; | |
328 | |
329 if (!gtk_tree_model_get_iter_first(model, &iter)) { | |
330 /* No more accounts being shown. Caloo calay! */ | |
331 disconnect_window_hide(); | |
332 return; | |
333 } | |
334 | |
335 /* | |
336 * If we have more than one disconnected account then show the | |
337 * GtkTreeView and the "Reconnect All" button | |
338 */ | |
339 if (gtk_tree_model_iter_next(model, &iter)) { | |
340 gtk_widget_show_all(disconnect_window->sw); | |
341 gtk_widget_show(disconnect_window->reconnectall_btn); | |
342 } else { | |
343 gtk_widget_hide_all(disconnect_window->sw); | |
344 gtk_widget_hide(disconnect_window->reconnectall_btn); | |
345 } | |
346 | |
347 /* | |
348 * Make sure one of the accounts is selected. | |
349 */ | |
350 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(disconnect_window->treeview)); | |
351 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) { | |
352 gtk_tree_model_get_iter_first(model, &iter); | |
353 gtk_tree_selection_select_iter(sel, &iter); | |
354 } | |
355 | |
356 /* | |
357 * Update the Reconnect/Remove button appropriately and set the | |
8174 | 358 * label in the dialog to what it should be. If there is only |
359 * one account in the tree model, and that account is connected, | |
360 * then we don't show the remove button. | |
7912 | 361 */ |
362 gtk_tree_model_get(model, &iter, 3, &label_text, 4, &account, -1); | |
363 gtk_button_set_label(GTK_BUTTON(disconnect_window->reconnect_btn), | |
364 gaim_account_is_connected(account) ? _("_Remove") : _("_Reconnect")); | |
365 gtk_label_set_markup(GTK_LABEL(disconnect_window->label), label_text); | |
366 gtk_dialog_set_response_sensitive(GTK_DIALOG(disconnect_window->window), GTK_RESPONSE_ACCEPT, TRUE); | |
8190 | 367 gtk_tree_model_get_iter_first(model, &iter); |
8174 | 368 if (gaim_account_is_connected(account) && !(gtk_tree_model_iter_next(model, &iter))) |
369 gtk_widget_hide(disconnect_window->reconnect_btn); | |
370 else | |
371 gtk_widget_show(disconnect_window->reconnect_btn); | |
7912 | 372 } |
373 | |
7399 | 374 static void disconnect_response_cb(GtkDialog *dialog, gint id, GtkWidget *widget) |
375 { | |
7483 | 376 GtkTreeIter iter; |
377 GtkTreeSelection *sel = NULL; | |
378 GtkTreeModel *model = NULL; | |
7431 | 379 GaimAccount *account = NULL; |
10065 | 380 |
7912 | 381 switch (id) { |
382 case GTK_RESPONSE_APPLY: /* Reconnect All */ | |
7808 | 383 model = gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview)); |
384 if (gtk_tree_model_get_iter_first(model, &iter)) { | |
385 /* tree rows to be deleted */ | |
386 GList *l_del = NULL, *l_del_iter = NULL; | |
387 /* accounts to be connected */ | |
7912 | 388 GList *l_accts = NULL, *l_accts_iter = NULL; |
7808 | 389 do { |
390 GtkTreePath *path = gtk_tree_model_get_path(model, &iter); | |
391 GtkTreeRowReference* del_row = gtk_tree_row_reference_new(model, path); | |
392 l_del = g_list_append(l_del, del_row); | |
393 gtk_tree_path_free(path); | |
394 | |
395 gtk_tree_model_get(model, &iter, 4, &account, -1); | |
396 if (!gaim_account_is_connected(account) && g_list_find(l_accts, account) == NULL) | |
397 l_accts = g_list_append(l_accts, account); | |
398 } while (gtk_tree_model_iter_next(model, &iter)); | |
399 | |
400 /* remove all rows */ | |
7912 | 401 /* We could just do the following, but we only want to remove accounts |
402 * that are going to be reconnected, not accounts that have already | |
403 * been reconnected. | |
404 */ | |
405 /* gtk_list_store_clear(GTK_LIST_STORE(model)); */ | |
7808 | 406 l_del_iter = l_del; |
407 while (l_del_iter != NULL) { | |
408 GtkTreeRowReference* del_row = l_del_iter->data; | |
409 GtkTreePath *path = gtk_tree_row_reference_get_path(del_row); | |
410 if (gtk_tree_model_get_iter(model, &iter, path)) | |
411 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); | |
412 gtk_tree_path_free(path); | |
413 gtk_tree_row_reference_free(del_row); | |
414 l_del_iter = l_del_iter->next; | |
415 } | |
416 g_list_free(l_del); | |
417 | |
418 /* reconnect disconnected accounts */ | |
419 l_accts_iter = l_accts; | |
420 while (l_accts_iter != NULL) { | |
421 account = l_accts_iter->data; | |
422 gaim_account_connect(account); | |
423 l_accts_iter = l_accts_iter->next; | |
424 } | |
425 g_list_free(l_accts); | |
426 | |
427 } | |
428 | |
7912 | 429 disconnect_window_update_buttons(model); |
430 | |
7808 | 431 break; |
7912 | 432 |
433 case GTK_RESPONSE_ACCEPT: /* Reconnect Selected */ | |
7483 | 434 model = gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview)); |
7912 | 435 |
7483 | 436 /* |
437 * If we have more than one account disconnection displayed, then | |
438 * the scroll window is visible and we should use the selected | |
439 * account to reconnect. | |
440 */ | |
441 if (GTK_WIDGET_VISIBLE(disconnect_window->sw)) { | |
442 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(disconnect_window->treeview)); | |
443 if (!gtk_tree_selection_get_selected(sel, &model, &iter)) | |
444 return; | |
445 } else { | |
446 /* There is only one account disconnection, so reconnect to it. */ | |
447 if (!gtk_tree_model_get_iter_first(model, &iter)) | |
448 return; | |
449 } | |
7912 | 450 |
451 /* remove all disconnections of the account to be reconnected */ | |
7808 | 452 gtk_tree_model_get(model, &iter, 4, &account, -1); |
7637 | 453 if (gtk_tree_model_get_iter_first(model, &iter)) { |
7808 | 454 GList *l_del = NULL, *l_del_iter = NULL; |
7637 | 455 GaimAccount *account2 = NULL; |
456 do { | |
7808 | 457 gtk_tree_model_get(model, &iter, 4, &account2, -1); |
7637 | 458 if (account2 == account) { |
7643 | 459 GtkTreePath *path = gtk_tree_model_get_path(model, &iter); |
460 GtkTreeRowReference* del_row = gtk_tree_row_reference_new(model, path); | |
461 l_del = g_list_append(l_del, del_row); | |
7808 | 462 gtk_tree_path_free(path); |
7637 | 463 } |
7643 | 464 } while (gtk_tree_model_iter_next(model, &iter)); |
465 | |
7808 | 466 l_del_iter = l_del; |
467 while (l_del_iter != NULL) { | |
468 GtkTreeRowReference* del_row = l_del_iter->data; | |
7643 | 469 GtkTreePath *path = gtk_tree_row_reference_get_path(del_row); |
470 if (gtk_tree_model_get_iter(model, &iter, path)) | |
471 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); | |
7808 | 472 gtk_tree_path_free(path); |
473 gtk_tree_row_reference_free(del_row); | |
474 l_del_iter = l_del_iter->next; | |
7643 | 475 } |
7808 | 476 g_list_free(l_del); |
7637 | 477 } |
478 | |
7643 | 479 gaim_account_connect(account); |
7912 | 480 disconnect_window_update_buttons(model); |
7643 | 481 |
7399 | 482 break; |
7912 | 483 |
484 case GTK_RESPONSE_DELETE_EVENT: | |
485 case GTK_RESPONSE_CLOSE: | |
486 disconnect_window_hide(); | |
487 break; | |
488 | |
7399 | 489 } |
490 } | |
491 | |
7912 | 492 /* |
493 * Called whenever a different account is selected in the GtkListWhatever. | |
494 */ | |
7399 | 495 static void disconnect_tree_cb(GtkTreeSelection *sel, GtkTreeModel *model) |
496 { | |
7912 | 497 disconnect_window_update_buttons(model); |
7399 | 498 } |
499 | |
7912 | 500 /* |
501 * Update the icon next to the account in the disconnect dialog, and | |
502 * gray the Reconnect All button if there is only 1 disconnected account. | |
503 */ | |
7808 | 504 static void disconnect_connection_change_cb(GaimConnection *gc, void *data) { |
7912 | 505 GaimAccount *account = gaim_connection_get_account(gc); |
506 GtkTreeIter iter; | |
507 GtkTreeModel *model; | |
508 GdkPixbuf *icon; | |
509 GdkPixbuf *scale; | |
510 GList *l_disc_accts = NULL; | |
511 | |
512 if (disconnect_window == NULL) | |
513 return; | |
514 | |
515 model = gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview)); | |
516 icon = create_prpl_icon(account); | |
517 scale = gdk_pixbuf_scale_simple(icon, 16, 16, GDK_INTERP_BILINEAR); | |
518 | |
519 /* Mark all disconnections w/ the account type disconnected /w grey icon */ | |
520 if (!gaim_account_is_connected(account)) | |
521 gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); | |
522 | |
523 gtk_tree_model_get_iter_first(model, &iter); | |
524 do { | |
525 GaimAccount *account2 = NULL; | |
526 /* Gray out the icon if this row is for this account */ | |
527 gtk_tree_model_get(model, &iter, 4, &account2, -1); | |
528 if (account2 == account) | |
529 gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, scale, -1); | |
530 | |
531 /* Add */ | |
532 if (!gaim_account_is_connected(account2) | |
7808 | 533 && g_list_find(l_disc_accts, account2) == NULL) |
7912 | 534 l_disc_accts = g_list_append(l_disc_accts, account2); |
535 } while (gtk_tree_model_iter_next(model, &iter)); | |
7808 | 536 |
7912 | 537 gtk_dialog_set_response_sensitive( |
538 GTK_DIALOG(disconnect_window->window), | |
539 GTK_RESPONSE_APPLY, | |
540 g_list_length(l_disc_accts) > 1); | |
541 g_list_free(l_disc_accts); | |
542 | |
543 if (icon != NULL) | |
544 g_object_unref(G_OBJECT(icon)); | |
545 if (scale != NULL) | |
546 g_object_unref(G_OBJECT(scale)); | |
547 | |
548 disconnect_window_update_buttons(model); | |
7625 | 549 } |
7399 | 550 |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
551 static void |
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
552 gaim_gtk_connection_report_disconnect(GaimConnection *gc, const char *text) |
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
553 { |
7399 | 554 char *label_text = NULL; |
7912 | 555 GtkTreeIter new_iter; |
7506 | 556 GtkListStore *list_store; |
557 GtkTreeViewColumn *col; | |
558 GtkTreeSelection *sel = NULL; | |
7399 | 559 |
7648 | 560 label_text = g_strdup_printf(_("<span weight=\"bold\" size=\"larger\">%s has been disconnected.</span>\n\n%s\n%s"), |
7912 | 561 gaim_account_get_username(gaim_connection_get_account(gc)), gaim_date_full(), |
7399 | 562 text ? text : _("Reason Unknown.")); |
7496 | 563 |
7506 | 564 /* Build the window if it isn't there yet */ |
565 if (!disconnect_window) { | |
7399 | 566 GtkWidget *hbox, *vbox, *img; |
567 GtkCellRenderer *rend, *rend2; | |
7496 | 568 |
7407 | 569 disconnect_window = g_new0(struct disconnect_window, 1); |
7874 | 570 disconnect_window->window = gtk_dialog_new_with_buttons(GAIM_ALERT_TITLE, NULL, GTK_DIALOG_NO_SEPARATOR, NULL); |
7399 | 571 g_signal_connect(G_OBJECT(disconnect_window->window), "response", G_CALLBACK(disconnect_response_cb), disconnect_window); |
572 | |
573 gtk_container_set_border_width(GTK_CONTAINER(disconnect_window->window), 6); | |
574 gtk_window_set_resizable(GTK_WINDOW(disconnect_window->window), FALSE); | |
10065 | 575 gtk_window_set_title(GTK_WINDOW(disconnect_window->window), _("Disconnected")); |
7399 | 576 gtk_dialog_set_has_separator(GTK_DIALOG(disconnect_window->window), FALSE); |
577 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(disconnect_window->window)->vbox), 12); | |
578 gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(disconnect_window->window)->vbox), 6); | |
579 | |
580 hbox = gtk_hbox_new(FALSE, 12); | |
581 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(disconnect_window->window)->vbox), hbox); | |
582 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG); | |
583 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
584 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
7496 | 585 |
7399 | 586 vbox = gtk_vbox_new(FALSE, 12); |
587 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); | |
588 | |
7506 | 589 disconnect_window->label = gtk_label_new(label_text); |
7496 | 590 |
7399 | 591 gtk_label_set_line_wrap(GTK_LABEL(disconnect_window->label), TRUE); |
592 gtk_misc_set_alignment(GTK_MISC(disconnect_window->label), 0, 0); | |
593 gtk_box_pack_start(GTK_BOX(vbox), disconnect_window->label, FALSE, FALSE, 0); | |
594 | |
7808 | 595 disconnect_window->reconnect_btn = gtk_dialog_add_button( |
596 GTK_DIALOG(disconnect_window->window), | |
597 _("_Reconnect"), | |
598 GTK_RESPONSE_ACCEPT); | |
599 | |
7912 | 600 disconnect_window->reconnectall_btn = gtk_dialog_add_button( |
7808 | 601 GTK_DIALOG(disconnect_window->window), |
602 _("Reconnect _All"), | |
603 GTK_RESPONSE_APPLY); | |
604 | |
7874 | 605 gtk_dialog_add_button( |
606 GTK_DIALOG(disconnect_window->window), | |
607 GTK_STOCK_CLOSE, | |
608 GTK_RESPONSE_CLOSE); | |
609 | |
7399 | 610 gtk_widget_show_all(disconnect_window->window); |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
611 |
7399 | 612 /* Tree View */ |
613 disconnect_window->sw = gtk_scrolled_window_new(NULL,NULL); | |
7912 | 614 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(disconnect_window->sw), GTK_SHADOW_IN); |
615 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(disconnect_window->sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); | |
7399 | 616 gtk_box_pack_start(GTK_BOX(vbox), disconnect_window->sw, TRUE, TRUE, 0); |
7496 | 617 |
7912 | 618 list_store = gtk_list_store_new(5, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); |
619 disconnect_window->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store)); | |
7496 | 620 |
7399 | 621 rend = gtk_cell_renderer_pixbuf_new(); |
622 rend2 = gtk_cell_renderer_text_new(); | |
623 col = gtk_tree_view_column_new(); | |
624 gtk_tree_view_column_set_title(col, _("Account")); | |
625 gtk_tree_view_column_pack_start(col, rend, FALSE); | |
626 gtk_tree_view_column_pack_start(col, rend2, FALSE); | |
627 gtk_tree_view_column_set_attributes(col, rend, "pixbuf", 0, NULL); | |
628 gtk_tree_view_column_set_attributes(col, rend2, "text", 1, NULL); | |
629 gtk_tree_view_append_column (GTK_TREE_VIEW(disconnect_window->treeview), col); | |
7496 | 630 |
7399 | 631 rend = gtk_cell_renderer_text_new(); |
632 col = gtk_tree_view_column_new_with_attributes (_("Time"), | |
633 rend, "text", 2, NULL); | |
634 gtk_tree_view_append_column (GTK_TREE_VIEW(disconnect_window->treeview), col); | |
10065 | 635 |
7399 | 636 g_object_unref(G_OBJECT(list_store)); |
637 gtk_container_add(GTK_CONTAINER(disconnect_window->sw), disconnect_window->treeview); | |
7496 | 638 |
7399 | 639 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
|
640 gtk_widget_set_size_request(disconnect_window->treeview, -1, 96); |
7399 | 641 g_signal_connect (G_OBJECT (sel), "changed", |
642 G_CALLBACK (disconnect_tree_cb), list_store); | |
7625 | 643 |
644 gaim_signal_connect(gaim_connections_get_handle(), "signed-on", | |
7808 | 645 disconnect_window, GAIM_CALLBACK(disconnect_connection_change_cb), NULL); |
646 | |
647 gaim_signal_connect(gaim_connections_get_handle(), "signed-off", | |
648 disconnect_window, GAIM_CALLBACK(disconnect_connection_change_cb), NULL); | |
7506 | 649 } else |
650 list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(disconnect_window->treeview))); | |
651 | |
652 /* Add this account to our list of disconnected accounts */ | |
7912 | 653 gtk_list_store_append(list_store, &new_iter); |
654 gtk_list_store_set(list_store, &new_iter, | |
7808 | 655 0, NULL, |
7506 | 656 1, gaim_account_get_username(gaim_connection_get_account(gc)), |
657 2, gaim_date_full(), | |
658 3, label_text, | |
659 4, gaim_connection_get_account(gc), -1); | |
660 | |
7912 | 661 /* Make sure the newly disconnected account is selected */ |
662 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(disconnect_window->treeview)); | |
663 gtk_tree_selection_select_iter(sel, &new_iter); | |
664 | |
665 disconnect_window_update_buttons(GTK_TREE_MODEL(list_store)); | |
7496 | 666 |
7399 | 667 g_free(label_text); |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
668 } |
7912 | 669 /* |
670 * End of disconnected dialog | |
671 */ | |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
672 |
5717 | 673 static GaimConnectionUiOps conn_ui_ops = |
674 { | |
675 gaim_gtk_connection_connect_progress, | |
676 gaim_gtk_connection_connected, | |
677 gaim_gtk_connection_disconnected, | |
6460
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
678 gaim_gtk_connection_notice, |
ff4551719cc7
[gaim-migrate @ 6969]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
679 gaim_gtk_connection_report_disconnect |
5717 | 680 }; |
681 | |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
6460
diff
changeset
|
682 GaimConnectionUiOps * |
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
6460
diff
changeset
|
683 gaim_gtk_connections_get_ui_ops(void) |
5717 | 684 { |
685 return &conn_ui_ops; | |
686 } | |
687 | |
7912 | 688 /* |
9944 | 689 * This function needs to be moved out of here once away messages are |
7912 | 690 * core/UI split. |
691 */ | |
6216 | 692 void away_on_login(const char *mesg) |
5717 | 693 { |
9944 | 694 #if 0 /* XXX CORE/UI */ |
5717 | 695 GSList *awy = away_messages; |
696 struct away_message *a, *message = NULL; | |
7098
770233dad86c
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
697 GaimGtkBuddyList *gtkblist; |
5717 | 698 |
699 gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); | |
700 | |
701 if (!gtkblist->window) { | |
702 return; | |
703 } | |
704 | |
6216 | 705 if (mesg == NULL) |
706 mesg = gaim_prefs_get_string("/core/away/default_message"); | |
707 while (awy) { | |
708 a = (struct away_message *)awy->data; | |
709 if (strcmp(a->name, mesg) == 0) { | |
710 message = a; | |
711 break; | |
5717 | 712 } |
6216 | 713 awy = awy->next; |
5717 | 714 } |
6216 | 715 if (message == NULL) { |
716 if(!away_messages) | |
717 return; | |
718 message = away_messages->data; | |
719 } | |
720 do_away_message(NULL, message); | |
9944 | 721 #endif |
5717 | 722 } |